diff --git a/Dockerfile b/Dockerfile index 07acce3e6..b6adf7d0d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,4 +27,17 @@ RUN cp $ANDROID_HOME/build-tools/30.0.3/lib/dx.jar $ANDROID_HOME/build-tools/31. ENV PATH ${ANDROID_NDK_HOME}:$PATH ENV PATH ${ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/:$PATH -CMD mkdir -p /home/source/TMessagesProj/build/outputs/apk && mkdir -p /home/source/TMessagesProj/build/outputs/native-debug-symbols && cp -R /home/source/. /home/gradle && cd /home/gradle && gradle bundleBundleAfat_SDK23Release && gradle bundleBundleAfatRelease && gradle assembleStandalone && gradle assembleAfatRelease && cp -R /home/gradle/TMessagesProj/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && cp -R /home/gradle/TMessagesProj/build/outputs/bundle/. /home/source/TMessagesProj/build/outputs/bundle && cp -R /home/gradle/TMessagesProj/build/outputs/native-debug-symbols/. /home/source/TMessagesProj/build/outputs/native-debug-symbols +CMD mkdir -p /home/source/TMessagesProj/build/outputs/apk && \ + mkdir -p /home/gradle/TMessagesProj/build/outputs/bundle && \ + mkdir -p /home/source/TMessagesProj/build/outputs/native-debug-symbols && \ + cp -R /home/source/. /home/gradle && \ + cd /home/gradle && \ + gradle :TMessagesProj_App:bundleBundleAfat_SDK23Release && \ + gradle :TMessagesProj_App:bundleBundleAfatRelease && \ + gradle :TMessagesProj_App:assembleAfatStandalone && \ + gradle :TMessagesProj_App:assembleAfatRelease && \ + gradle :TMessagesProj_AppHuawei:assembleAfatRelease && \ + cp -R /home/gradle/TMessagesProj_App/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && \ + cp -R /home/gradle/TMessagesProj_AppHuawei/build/outputs/apk/. /home/source/TMessagesProj/build/outputs/apk && \ + cp -R /home/gradle/TMessagesProj_App/build/outputs/bundle/. /home/source/TMessagesProj/build/outputs/bundle && \ + cp -R /home/gradle/TMessagesProj_App/build/outputs/native-debug-symbols/. /home/source/TMessagesProj/build/outputs/native-debug-symbols \ No newline at end of file diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 982aeb227..404088eee 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'com.android.application' +apply plugin: 'com.android.library' repositories { mavenCentral() @@ -38,7 +38,6 @@ dependencies { implementation 'com.stripe:stripe-android:2.0.2' implementation 'com.google.mlkit:language-id:16.1.1' implementation 'com.android.billingclient:billing:5.0.0' - implementation files('libs/libgsaverification-client.aar') coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' } @@ -48,8 +47,6 @@ android { buildToolsVersion '31.0.0' ndkVersion "21.4.7075529" - defaultConfig.applicationId = "org.telegram.messenger" - sourceSets.main.jniLibs.srcDirs = ['./jni/'] externalNativeBuild { @@ -75,189 +72,17 @@ android { coreLibraryDesugaringEnabled true } - signingConfigs { - debug { - storeFile file("config/release.keystore") - storePassword RELEASE_STORE_PASSWORD - keyAlias RELEASE_KEY_ALIAS - keyPassword RELEASE_KEY_PASSWORD - } - - release { - storeFile file("config/release.keystore") - storePassword RELEASE_STORE_PASSWORD - keyAlias RELEASE_KEY_ALIAS - keyPassword RELEASE_KEY_PASSWORD - } - } - - buildTypes { - debug { - debuggable true - jniDebuggable true - signingConfig signingConfigs.debug - applicationIdSuffix ".beta" - minifyEnabled false - shrinkResources false - multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - ndk.debugSymbolLevel = 'FULL' - } - - /*debugAsan { - debuggable true - jniDebuggable true - signingConfig signingConfigs.debug - applicationIdSuffix ".beta" - minifyEnabled true - multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - - packagingOptions { - doNotStrip "**.so" - } - - sourceSets { - main { - jniLibs { - srcDir { - 'jniLibs' - } - } - resources { - srcDir { - 'jniRes' - } - } - } - } - }*/ - - HA { - debuggable false - jniDebuggable false - signingConfig signingConfigs.debug - applicationIdSuffix ".beta" - minifyEnabled true - multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - ndk.debugSymbolLevel = 'FULL' - } - - standalone { - debuggable false - jniDebuggable false - signingConfig signingConfigs.release - applicationIdSuffix ".web" - minifyEnabled true - multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - ndk.debugSymbolLevel = 'FULL' - } - - release { - debuggable false - jniDebuggable false - signingConfig signingConfigs.release - minifyEnabled true - shrinkResources false - multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - ndk.debugSymbolLevel = 'FULL' - } - } - - sourceSets.debug { - manifest.srcFile 'config/debug/AndroidManifest.xml' - } - - /*sourceSets.debugAsan { - manifest.srcFile 'config/debug/AndroidManifest.xml' - }*/ - - sourceSets.HA { - manifest.srcFile 'config/debug/AndroidManifest.xml' - } - - sourceSets.standalone { - manifest.srcFile 'config/release/AndroidManifest.xml' - } - - sourceSets.release { - manifest.srcFile 'config/release/AndroidManifest.xml' - } - - flavorDimensions "minApi" - - productFlavors { - bundleAfat { - ndk { - abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" - } - ext { - abiVersionCode = 1 - } - } - bundleAfat_SDK23 { - ndk { - abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" - } - sourceSets.debug { - manifest.srcFile 'config/debug/AndroidManifest_SDK23.xml' - } - sourceSets.release { - manifest.srcFile 'config/release/AndroidManifest_SDK23.xml' - } - sourceSets.standalone { - manifest.srcFile 'config/release/AndroidManifest_standalone.xml' - } - minSdkVersion 23 - ext { - abiVersionCode = 2 - } - } - afat { - ndk { - abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" - } - sourceSets.debug { - manifest.srcFile 'config/debug/AndroidManifest_SDK23.xml' - } - sourceSets.release { - manifest.srcFile 'config/release/AndroidManifest_SDK23.xml' - } - sourceSets.standalone { - manifest.srcFile 'config/release/AndroidManifest_standalone.xml' - } - ext { - abiVersionCode = 9 - } - } - } - - defaultConfig.versionCode = 2721 - - applicationVariants.all { variant -> - variant.outputs.all { output -> - outputFileName = "app.apk" - output.versionCodeOverride = defaultConfig.versionCode * 10 + variant.productFlavors.get(0).abiVersionCode - } - } - - variantFilter { variant -> - def names = variant.flavors*.name - if (variant.buildType.name != "release" && !names.contains("afat")) { - setIgnore(true) - } - } + defaultConfig.versionCode = 2751 defaultConfig { minSdkVersion 16 targetSdkVersion 30 - versionName "8.8.5" + versionName "8.9.0" vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] + multiDexEnabled true + externalNativeBuild { cmake { version '3.10.2' @@ -265,6 +90,46 @@ android { } } } + + buildTypes { + debug { + debuggable true + jniDebuggable true + minifyEnabled false + shrinkResources false + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + + HA { + debuggable false + jniDebuggable false + minifyEnabled true + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + + standalone { + debuggable false + jniDebuggable false + minifyEnabled true + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + + release { + debuggable false + jniDebuggable false + minifyEnabled true + shrinkResources false + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + } } apply plugin: 'com.google.gms.google-services' diff --git a/TMessagesProj/config/debug/AndroidManifest.xml b/TMessagesProj/config/debug/AndroidManifest.xml index 3938549e9..296eba444 100644 --- a/TMessagesProj/config/debug/AndroidManifest.xml +++ b/TMessagesProj/config/debug/AndroidManifest.xml @@ -1,7 +1,6 @@ @@ -32,7 +31,7 @@ + android:name="org.telegram.messenger.GcmPushListenerService"> diff --git a/TMessagesProj/config/debug/AndroidManifest_SDK23.xml b/TMessagesProj/config/debug/AndroidManifest_SDK23.xml index 79e0297ee..81dda4002 100644 --- a/TMessagesProj/config/debug/AndroidManifest_SDK23.xml +++ b/TMessagesProj/config/debug/AndroidManifest_SDK23.xml @@ -1,7 +1,6 @@ @@ -26,7 +25,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/AppNameBeta" android:theme="@style/Theme.TMessages.Start" - android:name=".ApplicationLoader" android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true" android:supportsRtl="false" @@ -36,7 +34,7 @@ + android:name="org.telegram.messenger.GcmPushListenerService"> diff --git a/TMessagesProj/config/release/AndroidManifest.xml b/TMessagesProj/config/release/AndroidManifest.xml index 4f2e1456e..188507760 100644 --- a/TMessagesProj/config/release/AndroidManifest.xml +++ b/TMessagesProj/config/release/AndroidManifest.xml @@ -1,7 +1,6 @@ @@ -23,7 +22,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/AppName" android:theme="@style/Theme.TMessages.Start" - android:name=".ApplicationLoader" android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true" android:supportsRtl="false" @@ -33,7 +31,7 @@ + android:name="org.telegram.messenger.GcmPushListenerService"> diff --git a/TMessagesProj/config/release/AndroidManifest_SDK23.xml b/TMessagesProj/config/release/AndroidManifest_SDK23.xml index 8eaec6742..dfcdb1322 100644 --- a/TMessagesProj/config/release/AndroidManifest_SDK23.xml +++ b/TMessagesProj/config/release/AndroidManifest_SDK23.xml @@ -1,7 +1,6 @@ @@ -26,7 +25,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/AppName" android:theme="@style/Theme.TMessages.Start" - android:name=".ApplicationLoader" android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true" android:supportsRtl="false" @@ -36,7 +34,7 @@ + android:name="org.telegram.messenger.GcmPushListenerService"> diff --git a/TMessagesProj/config/release/AndroidManifest_standalone.xml b/TMessagesProj/config/release/AndroidManifest_standalone.xml index 9fb897d94..7cb61014d 100644 --- a/TMessagesProj/config/release/AndroidManifest_standalone.xml +++ b/TMessagesProj/config/release/AndroidManifest_standalone.xml @@ -1,7 +1,6 @@ @@ -26,7 +25,6 @@ android:roundIcon="@mipmap/ic_launcher_sa" android:label="@string/AppName" android:theme="@style/Theme.TMessages.Start" - android:name=".ApplicationLoader" android:hardwareAccelerated="@bool/useHardwareAcceleration" android:largeHeap="true" android:supportsRtl="false" @@ -36,7 +34,7 @@ + android:name="org.telegram.messenger.GcmPushListenerService"> diff --git a/TMessagesProj/jni/lottie.cpp b/TMessagesProj/jni/lottie.cpp index 9169dde5f..d5e2a6ef9 100644 --- a/TMessagesProj/jni/lottie.cpp +++ b/TMessagesProj/jni/lottie.cpp @@ -42,7 +42,6 @@ typedef struct LottieInfo { uint32_t fileFrame = 0; bool nextFrameIsCacheFrame = false; - FILE *precacheFile = nullptr; char *compressBuffer = nullptr; const char *buffer = nullptr; bool firstFrame = false; @@ -164,18 +163,6 @@ JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_create(JNIEnv *e return (jlong) (intptr_t) info; } -JNIEXPORT jstring Java_org_telegram_ui_Components_RLottieDrawable_getCacheFile(JNIEnv *env, jclass clazz, jlong ptr) { - if (!ptr) { - return NULL; - } - auto info = (LottieInfo *) (intptr_t) ptr; - if (info->precache) { - return env->NewStringUTF(info->cacheFile.c_str()); - } - return NULL; -} - - JNIEXPORT jlong Java_org_telegram_ui_Components_RLottieDrawable_createWithJson(JNIEnv *env, jclass clazz, jstring json, jstring name, jintArray data, jintArray colorReplacement) { std::map *colors = nullptr; if (colorReplacement != nullptr) { @@ -255,126 +242,6 @@ JNIEXPORT void Java_org_telegram_ui_Components_RLottieDrawable_replaceColors(JNI } } -bool cacheWriteThreadCreated{false}; -LottieInfo *cacheWriteThreadTask{nullptr}; -bool cacheWriteThreadDone{false}; -std::thread worker; -std::mutex cacheMutex; -std::condition_variable cacheCv; - -std::mutex cacheDoneMutex; -std::condition_variable cacheDoneCv; -std::atomic frameReady{false}; - -void CacheWriteThreadProc() { - while (!cacheWriteThreadDone) { - std::unique_lock lk(cacheMutex); - cacheCv.wait(lk, [] { return frameReady.load(); }); - std::lock_guard lg(cacheDoneMutex); - LottieInfo *task; - if (cacheWriteThreadTask != nullptr) { - task = cacheWriteThreadTask; - cacheWriteThreadTask = nullptr; - } else { - task = nullptr; - } - lk.unlock(); - - if (task != nullptr) { - auto size = (uint32_t) LZ4_compress_default(task->buffer, task->compressBuffer, task->bufferSize, task->compressBound); - if (task->firstFrame) { - task->firstFrameSize = size; - task->fileOffset = 9 + sizeof(uint32_t) + task->firstFrameSize; - task->fileFrame = 1; - } - task->maxFrameSize = MAX(task->maxFrameSize, size); - fwrite(&size, sizeof(uint32_t), 1, task->precacheFile); - fwrite(task->compressBuffer, sizeof(uint8_t), size, task->precacheFile); - - fflush(task->precacheFile); - fsync(fileno(task->precacheFile)); - task->framesAvailableInCache++; - } - frameReady = false; - cacheDoneCv.notify_one(); - } -} - -JNIEXPORT void Java_org_telegram_ui_Components_RLottieDrawable_createCache(JNIEnv *env, jclass clazz, jlong ptr, jint w, jint h) { - if (ptr == NULL) { - return; - } - auto info = (LottieInfo *) (intptr_t) ptr; - - FILE *cacheFile = fopen(info->cacheFile.c_str(), "r+"); - if (cacheFile != nullptr) { - uint8_t temp; - size_t read = fread(&temp, sizeof(uint8_t), 1, cacheFile); - fclose(cacheFile); - if (read == 1 && temp != 0) { - return; - } - } - - if (!cacheWriteThreadCreated) { - cacheWriteThreadCreated = true; - worker = std::thread(CacheWriteThreadProc); - } - - if (info->nextFrameIsCacheFrame && info->createCache && info->frameCount != 0) { - info->precacheFile = fopen(info->cacheFile.c_str(), "w+"); - if (info->precacheFile != nullptr) { - fseek(info->precacheFile, info->fileOffset = 9, SEEK_SET); - info->fileFrame = 0; - info->maxFrameSize = 0; - info->bufferSize = w * h * 4; - info->imageSize = (uint32_t) w * h * 4; - info->compressBound = LZ4_compressBound(info->bufferSize); - info->compressBuffer = new char[info->compressBound]; - auto firstBuffer = new uint8_t[info->bufferSize]; - auto secondBuffer = new uint8_t[info->bufferSize]; - //long time = ConnectionsManager::getInstance(0).getCurrentTimeMonotonicMillis(); - - Surface surface1((uint32_t *) firstBuffer, (size_t) w, (size_t) h, (size_t) w * 4); - Surface surface2((uint32_t *) secondBuffer, (size_t) w, (size_t) h, (size_t) w * 4); - int framesPerUpdate = !info->limitFps || info->fps < 60 ? 1 : 2; - int num = 0; - for (size_t a = 0; a < info->frameCount; a += framesPerUpdate) { - Surface &surfaceToRender = num % 2 == 0 ? surface1 : surface2; - num++; - info->animation->renderSync(a, surfaceToRender, true); - if (a != 0) { - std::unique_lock lk(cacheDoneMutex); - cacheDoneCv.wait(lk, [] { return !frameReady.load(); }); - } - - std::lock_guard lg(cacheMutex); - cacheWriteThreadTask = info; - info->firstFrame = a == 0; - info->buffer = (const char *) surfaceToRender.buffer(); - frameReady = true; - cacheCv.notify_one(); - } - std::unique_lock lk(cacheDoneMutex); - cacheDoneCv.wait(lk, [] { return !frameReady.load(); }); - - //DEBUG_D("sticker time = %d", (int) (ConnectionsManager::getInstance(0).getCurrentTimeMonotonicMillis() - time)); - delete[] info->compressBuffer; - delete[] firstBuffer; - delete[] secondBuffer; - fseek(info->precacheFile, 0, SEEK_SET); - uint8_t byte = 1; - fwrite(&byte, sizeof(uint8_t), 1, info->precacheFile); - uint32_t maxFrameSize = info->maxFrameSize; - fwrite(&maxFrameSize, sizeof(uint32_t), 1, info->precacheFile); - fwrite(&info->imageSize, sizeof(uint32_t), 1, info->precacheFile); - fflush(info->precacheFile); - fsync(fileno(info->precacheFile)); - info->createCache = false; - fclose(info->precacheFile); - } - } -} JNIEXPORT jint Java_org_telegram_ui_Components_RLottieDrawable_getFrame(JNIEnv *env, jclass clazz, jlong ptr, jint frame, jobject bitmap, jint w, jint h, jint stride, jboolean clear) { if (!ptr || bitmap == nullptr) { @@ -382,73 +249,16 @@ JNIEXPORT jint Java_org_telegram_ui_Components_RLottieDrawable_getFrame(JNIEnv * } auto info = (LottieInfo *) (intptr_t) ptr; - int framesPerUpdate = !info->limitFps || info->fps < 60 ? 1 : 2; - int framesAvailableInCache = info->framesAvailableInCache; - - if (info->createCache && info->precache && frame > 0) { - if (frame / framesPerUpdate >= framesAvailableInCache) { - return -1; - } - } - void *pixels; + bool result = false; if (AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0) { - bool loadedFromCache = false; - uint32_t maxFrameSize = info->maxFrameSize; - if (info->precache && (!info->createCache || frame > 0) && w * 4 == stride && maxFrameSize <= w * h * 4 && info->imageSize == w * h * 4) { - FILE *precacheFile = fopen(info->cacheFile.c_str(), "r"); - if (precacheFile != nullptr) { - if (info->decompressBuffer != nullptr && info->decompressBufferSize < maxFrameSize) { - delete[] info->decompressBuffer; - info->decompressBuffer = nullptr; - } - if (info->decompressBuffer == nullptr) { - info->decompressBufferSize = maxFrameSize; - if (info->createCache) { - info->decompressBufferSize += 10000; - } - info->decompressBuffer = new uint8_t[info->decompressBufferSize]; - } - int currentFrame = frame / framesPerUpdate; - if (info->fileFrame != frame) { - info->fileOffset = 9; - info->fileFrame = 0; - while (info->fileFrame != currentFrame) { - fseek(precacheFile, info->fileOffset, SEEK_SET); - uint32_t frameSize; - fread(&frameSize, sizeof(uint32_t), 1, precacheFile); - info->fileOffset += 4 + frameSize; - info->fileFrame++; - } - } - fseek(precacheFile, info->fileOffset, SEEK_SET); - uint32_t frameSize; - fread(&frameSize, sizeof(uint32_t), 1, precacheFile); - if (frameSize > 0 && frameSize <= info->decompressBufferSize) { - fread(info->decompressBuffer, sizeof(uint8_t), frameSize, precacheFile); - info->fileOffset += 4 + frameSize; - info->fileFrame = currentFrame + 1; - LZ4_decompress_safe((const char *) info->decompressBuffer, (char *) pixels, frameSize, w * h * 4); - loadedFromCache = true; - } - fclose(precacheFile); - if (frame + framesPerUpdate >= info->frameCount) { - info->fileOffset = 9; - info->fileFrame = 0; - } - } - } - - if (!loadedFromCache) { - if (!info->nextFrameIsCacheFrame || !info->precache) { - Surface surface((uint32_t *) pixels, (size_t) w, (size_t) h, (size_t) stride); - info->animation->renderSync((size_t) frame, surface, clear); - info->nextFrameIsCacheFrame = true; - } - } - + Surface surface((uint32_t *) pixels, (size_t) w, (size_t) h, (size_t) stride); + info->animation->renderSync((size_t) frame, surface, clear, &result); AndroidBitmap_unlockPixels(env, bitmap); } + if (!result) { + return -5; + } return frame; } } diff --git a/TMessagesProj/jni/rlottie/inc/rlottie.h b/TMessagesProj/jni/rlottie/inc/rlottie.h index ef8a07b81..d7688aabf 100755 --- a/TMessagesProj/jni/rlottie/inc/rlottie.h +++ b/TMessagesProj/jni/rlottie/inc/rlottie.h @@ -354,7 +354,7 @@ public: * * @internal */ - void renderSync(size_t frameNo, Surface &surface, bool clear); + void renderSync(size_t frameNo, Surface &surface, bool clear, bool* result); /** * @brief Returns root layer of the composition updated with diff --git a/TMessagesProj/jni/rlottie/src/lottie/lottieanimation.cpp b/TMessagesProj/jni/rlottie/src/lottie/lottieanimation.cpp index 1331fc686..905f0f659 100755 --- a/TMessagesProj/jni/rlottie/src/lottie/lottieanimation.cpp +++ b/TMessagesProj/jni/rlottie/src/lottie/lottieanimation.cpp @@ -44,7 +44,7 @@ public: double frameRate() const { return mModel->frameRate(); } size_t totalFrame() const { return mModel->totalFrame(); } size_t frameAtPos(double pos) const { return mModel->frameAtPos(pos); } - Surface render(size_t frameNo, const Surface &surface, bool clear); + Surface render(size_t frameNo, const Surface &surface, bool clear, bool* result); const LOTLayerNode * renderTree(size_t frameNo, const VSize &size); const LayerInfoList &layerInfoList() const @@ -93,11 +93,12 @@ bool AnimationImpl::update(size_t frameNo, const VSize &size) return mCompItem->update(frameNo); } -Surface AnimationImpl::render(size_t frameNo, const Surface &surface, bool clear) +Surface AnimationImpl::render(size_t frameNo, const Surface &surface, bool clear, bool* result) { bool renderInProgress = mRenderInProgress.load(); if (renderInProgress) { vCritical << "Already Rendering Scheduled for this Animation"; + *result = false; return surface; } @@ -106,6 +107,7 @@ Surface AnimationImpl::render(size_t frameNo, const Surface &surface, bool clear VSize(surface.drawRegionWidth(), surface.drawRegionHeight())); mCompItem->render(surface, clear); mRenderInProgress.store(false); + *result = true; return surface; } @@ -198,9 +200,9 @@ const LOTLayerNode *Animation::renderTree(size_t frameNo, size_t width, return d->renderTree(frameNo, VSize(width, height)); } -void Animation::renderSync(size_t frameNo, Surface &surface, bool clear) +void Animation::renderSync(size_t frameNo, Surface &surface, bool clear, bool* res) { - d->render(frameNo, surface, clear); + d->render(frameNo, surface, clear, res); } const LayerInfoList &Animation::layers() const diff --git a/TMessagesProj/proguard-rules.pro b/TMessagesProj/proguard-rules.pro index ec3d0c01f..35b534871 100644 --- a/TMessagesProj/proguard-rules.pro +++ b/TMessagesProj/proguard-rules.pro @@ -93,6 +93,11 @@ (com.google.android.exoplayer2.upstream.DataSource$Factory); } +# Huawei Services +-keep class com.huawei.hianalytics.**{ *; } +-keep class com.huawei.updatesdk.**{ *; } +-keep class com.huawei.hms.**{ *; } + # Don't warn about checkerframework and Kotlin annotations -dontwarn org.checkerframework.** -dontwarn javax.annotation.** diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 138549eb6..0af50b201 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -329,15 +329,6 @@ android:resizeableActivity="false" android:windowSoftInputMode="adjustResize|stateHidden"> - - - - - - - - diff --git a/TMessagesProj/src/main/assets/emoji/0_0.png b/TMessagesProj/src/main/assets/emoji/0_0.png index 14436f360..f44a85f62 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 a5e71d598..21f665922 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 e63b970ee..cb6128b36 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 39a2316b8..81644b342 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 bc0ae18ef..9156e3971 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 ff3119050..f5f37c5e4 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 d2ac47146..341e400c2 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 11b7d95cb..2014d3967 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 01047bad3..f2dc0dfcd 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 f140faacf..e16aeaa7b 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 05452c809..7a9d2b4cc 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 a456fa72c..e0b66c78f 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 3c27f79e7..00d9b8ae5 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 3bd5d8e40..9158f8ed6 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 9bbfc9532..3a5ca21e9 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 b10767b3b..6ed3da519 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 5b478e61d..ed9b61adf 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 06f683bd6..13dafaf78 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 6ee21c10f..9245a0566 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 6d59002bf..06de35b3d 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 46e3dd395..f2cdf9be3 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 51a136abf..2a4e9d136 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 2601bd3cf..8978fd0e3 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 deab0aa4a..2677fb5b6 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 61b22d6be..faf435b42 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 b9b357be9..3a0fcfbf2 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 2098dfbfe..e8c038815 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 202963e5d..529a78435 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 5837c9964..37c064369 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 fe88a2363..d03a5daa8 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 13da011c3..a6eec46f2 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 0d9a2ba30..81886dad5 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 07f86d16d..57b770f8a 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 d6b711d85..d86eb12d5 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 dd4efc00f..2b6ec44d0 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 f9e2a0e0f..82e71662a 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 1962f997a..dc19be0c2 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 9617657aa..bdc931074 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 807e63a65..589046fc1 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 1ddb6e236..61865e804 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 2bfd6cc5e..59e7b55d1 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 e993c43d3..37cff176d 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 b28c51ec5..537879ea3 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 1cfeeef41..c6ee7df23 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 3ef172c69..78b57c649 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 d8a10771f..540c7d166 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 35e1f20e1..44df3f2d2 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 e119d72d9..2cf06cfe5 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 fe88a896e..365993560 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 e6c4729bd..82f34be54 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 197c31dcb..870bc68d6 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 54ad1af74..f6e72648d 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 a60e22e3e..4f9f2915b 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 8deac12e4..635f45d3d 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 6969bffbf..3ff89e627 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 3faf27227..558a274aa 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 94623bd96..a204f5f41 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 6e41f2007..04bbc965b 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 e9501d935..912b02fe9 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 054a46213..4f3a67ef9 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 118c43e0e..bf81da1e4 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 bc36a3cf8..52c568348 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 9438b7633..cdc973db9 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 0aeecff16..fa8bc0058 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 bf17b19ef..4961f37e3 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 68ffda23f..fed74d9d4 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 d39a323e2..8baa34f76 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 10f1e885b..1fc80d86e 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 93b5af256..e4fec506a 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 15b5348b7..4c25e3030 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 dea74675b..89916b788 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 46bc58f43..7ed30da81 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 30c44b087..58bf2cc83 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 5df1778f7..71f802561 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 5fecb7f78..5bbf74ba7 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 c5fa95c16..f8f3a95d3 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 4943bad47..cd42f13fd 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 b4c8fbd53..33cad504c 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 2a8201281..2e68d9583 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 f2fcef438..3e2c26edf 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 66ba27339..0697a98b6 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 1f6ef5760..f6893fff8 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 0f6507e0f..d98ea7169 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 a5d7872a4..573854cdf 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 10bccd680..60d09751c 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 334291755..939851d55 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 f8888c213..dcaa59fd5 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 4a3b9177f..3cd1f025f 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 030b1b891..7150ad612 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 934f43769..3d2b41c29 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 90228a157..fc04b25bb 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 1eeb49f7d..219434982 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 0f7cf7f1b..84de03b22 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 a87a9cb9e..d65650d90 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 23b1821ac..2a9c8855f 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 ff72fd89a..f70908c98 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 1085d80a7..d9fc49ebf 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 88650fac2..b84988967 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 7fba71b88..8da826bef 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 c5c0ca012..a52b9ffc9 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 f58bc12d3..cf64fdede 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 8c4c9ed89..a053b5646 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 01da65857..eb3c5d54a 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 0ce92d4c9..f4c167e0e 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 b3b8e485a..338d9e520 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 c14bd0910..566f44981 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 393472a37..d1a7125f2 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 8b8aa85bd..1092900d4 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 f558288e5..4acdc084b 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 8f5d271d0..9a968667f 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 f37533f02..04f6f5cf2 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 eba0138c9..fb8aa7d45 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 75c9834ea..615de0430 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 a4e56d0c5..f20e41147 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 f59719af8..2f40468c3 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 31ff7d706..f311d6fe4 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 14422313e..c1a656ce4 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 7115f76dc..496a59ef4 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 c7506a46a..0d5f58fe2 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 bae4113d9..416637241 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 9900af30b..2fba19192 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 ccb4c8dde..ba01c32e0 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 d224fe57d..e483c7722 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 50a87ea12..04429f115 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 f2be9b6d8..1bba3a681 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 b208195c7..c3e4a76ce 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 6de2789ea..127b2496a 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 a0e6edde9..8d6f62dee 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 527cebc7f..cd8a3b5c8 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 de7d88bf9..12a764ba8 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 5c5f187f6..b207262df 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 03beff1f4..bfacaf65e 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 4c2fe025b..4fd9b9c8b 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 2e78cc79c..60f0fde59 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 ff2641594..617b64837 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 2b204583e..cc590f070 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 d5ba845d9..c07feae0b 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 6ea4f945a..4d0893deb 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 3d9bb7765..8f14dd5d4 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 defcdc546..4361ce1cc 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 f603611cd..fad568fc7 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 a9c58f950..4f4074b67 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 e1a7d0885..61f6a9a72 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 7cb3a4edf..5b0e31c74 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 1d9cae33b..15d6c7ca3 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 35f4a1914..51ff8aec0 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 a56efa47e..de830f9c3 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 50810c617..86d94c4fd 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 d5f79f45b..7670ce0ef 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 9e8b2ee45..70fa8c4c6 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 a7bb8aa42..7deb146cb 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 bd7ee62c2..9aedb64e4 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 aa09c6486..096710646 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 21152a85b..40f9c1a71 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 e2c99a88d..440f7e929 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 d98dfbcba..ee04fa1f2 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 32c94cc36..2149878a6 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 748a18bcb..b6b768644 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 6b6f7ec90..ca3174df4 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 6764174e0..1faac3504 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 8a2a15e70..a61d9298c 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 7192d74de..4b2a4d4e3 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 5ca97e19b..c306dd1bb 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 1047dd38b..426a471cc 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 454dcab77..3c25258c8 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 23f8287e3..a96e9a413 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 fd4ff2839..ef13ac091 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 fed5616e1..efe36d281 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 04a65fddc..dfc9bc503 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 d2b199c9e..07472b916 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 4d135a7bf..be9a8807e 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 51c83c1de..a3ffcfaf4 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 9353a3c59..48ba7c6cc 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 28ea657fa..d7368b6f3 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 b06fce7e4..3748b4cc0 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 b0c4cd7e4..dea5faaea 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 7e8457d5a..5bd60b11a 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 59dd10511..6a29ee3a4 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 fd8e66691..a4a573985 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 d6f1ab69e..2fe347537 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 17c9c85ab..d7b8b73ca 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 1c5671cf0..304d7fa1b 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 8978d148b..ba561b99e 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 4ce6ea938..ccdcbfa02 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 eb0cfbd24..929e4abb1 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 9b498f0b7..6cb6f7c28 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 545ed2634..44ea67288 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 80c552908..b63862fa8 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 76e0b7bfd..8e2d81219 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 b644601c9..48607fd80 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 c88cdbbbd..fc0d4ccf2 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 7e5760da5..63eed1a77 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 bfb8cde21..a4ba238ed 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 9194b90e0..8c65ed75b 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 cc1f7ca5c..4e163e518 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 94619465a..1a647ef1c 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 65baef912..19d8c2396 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 d0b0c82d7..6bfdf7b4c 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 5946a04ec..4cb111f36 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 e36b93be5..d87838460 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 ad13262d4..4fc3193c6 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 01b8bc107..20919a69a 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 6606291ab..8cf1ebb5c 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 e0ee8647b..8419a903f 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 d0897566b..d564dcf65 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 b609527b5..4720afadc 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 efb7e96c1..424210651 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 b4d075b63..394784972 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 6c6391799..ddca52ada 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 8291f209f..14041f993 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 638be845f..79d597852 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 72cad3987..28c69a9c0 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 d73570b96..243d01293 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 bda566507..a14e4e7ae 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 42c75d408..7831a9674 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 b8bb059c2..4a7f5bcb4 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 b54d04c88..228f65106 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 4b60615b6..7286cf4ac 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 e4dc2c3f0..77c24d09c 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 bce3f81a9..437a1628f 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 d301a22d7..b2dedd78f 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 830907470..3c37ae442 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 b19fbba92..b7a20c8ab 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 f15ffbe88..25280ff00 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 eca392d3d..e9f79b81f 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 6a7ef2c2f..0141029ba 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 f51ad7f29..f39624447 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 1894087c4..efdc43438 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 1f80f9522..8a6b68b96 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 8e8e60468..d05a9e60b 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 49b046b23..f6f3c27a7 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 f7aa9dacd..293c1153b 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 a1c67df89..1ac5cc423 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 301c21ba6..4f00e1895 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 229477174..471c34f43 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 fb29a6d77..f62e254d0 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 2e99c63fe..ab654fb4c 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 58144492f..ea02e0a39 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 cac74553c..912d3f5d9 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 e51b8d002..310b8629f 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 9098f1086..291cb6a15 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 5c7e77a59..b4a5281f6 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 51c3c10a3..97a53b6a3 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 234cbd9b4..cfbae787e 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 98551e5b6..5c0d443c9 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 615a52cb4..f13f4fc10 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 da2ef709c..1c76319ef 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 ddf194828..891980ce7 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 4cf5b07aa..4667f614d 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 6c5cad59b..88b2c46b3 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 f26ccc12d..bd2d13832 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 b9579f959..df4d408b4 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 afa73857f..29d2e71a0 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 78b852e94..9141eb42d 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 08c66fa04..308721233 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 471950917..a8a9270d9 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 45879e139..e59e85267 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 7830f1bbb..601315b74 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 5cd6d2d36..02c515736 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 04051c4bf..e496e8416 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 50b7bb0b4..d26e02093 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 055bfebb2..41e081086 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 084f7b3e3..e189f43d3 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 8cbb92c67..9c09de94e 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 1a03ed46f..792cbe123 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 778540cb6..19bd1a850 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 170c8ce28..693be2a6a 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 38859ceed..0a8db9d42 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 e27c31a59..e6c7ec64d 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 f35f009ff..2da71f75e 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 ddd4b0785..056443d97 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 f34b8f7bd..ab3d7cd4d 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 ac7da8b61..64d16e8e4 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 58cb11dba..47668d4e8 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 5d1d2f6e9..429c1847a 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 2d122a134..13a2a3bba 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 64c1c21dd..2fcdce4df 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 1adad6da3..5a158db2c 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 fd283d685..680379d4f 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 6e49edcd0..94ab81e86 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 48d7dbd34..d755b18d7 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 b02f94d11..3bd743f42 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 6117d4888..72ef0c375 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 fd42bb3c2..ddc82829a 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 93f2a2a22..3bb475b78 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 3ea81506e..211269398 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 e5359f581..72d06cc44 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 548bc6092..fbe8135f6 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 66f4f4ced..4ef0101d5 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 5cea47345..6499f4628 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 6abf770ad..5f6a9a34f 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 40f464ecb..3c9ac1cca 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 110882f37..dae887330 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 af75fdd20..ab3561a8c 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 72a632eb1..5aaf3c864 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 f2331a928..58cc6f95c 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 cdb8eb745..5915188a4 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 2676f6ae7..e7ec87155 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 f57a4e7a2..40edbf413 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 af71f684d..3e13ad20b 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 18df54b4d..dee6d8719 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 7758b2f08..b5d7bde3f 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 c20c97e42..4c7c7ea8d 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 296ab4f44..a275dca96 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 b117bf56b..de2494466 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 383afe195..b53a37a71 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 b4b6e4bc4..39c84c41b 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 a2c36c598..c3a56c99d 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 d3fb2a687..b9fe8acd3 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 6be48ced2..55001a1e3 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 cbc1a669a..1a8686172 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 e0dad2861..15d867ce3 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 0d0bdbb63..25b27d178 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 bf0969f48..54926ad15 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 90e1a6417..6025373f0 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 680902017..c5f57dd51 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 e15beeb5b..2c251a764 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 3fa2e2cf4..64a9f0429 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 553a2749a..afc915ea3 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 ff09b9616..112da8c3f 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 a2401e64c..0efa18ae5 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 ef3b778c7..5d5e1c974 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 d9809db6a..541648aaf 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 57ce6939d..bc3c18173 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 dbad8f10e..c77c07efa 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 7cdd35d61..8608acc70 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 726162464..c6687d6d6 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 442f44efe..3fd31a411 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 cdd797cc4..430ef80ed 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 71bf7d747..a6edfec42 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 24168e4ba..683c8fd46 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 ff126c57c..582e57e26 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 4897ac3e2..f9c8aeb18 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 69d25fa95..9ebf25f27 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 bcdd1ea04..f641d2d19 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 54fca02f5..7b36753f9 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 d67acc3d9..1dd803772 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 804c9ace2..321044b4d 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 6698312af..92b238489 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 751b691ae..f49365614 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 1bdfd67f6..da8f25623 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 a0b52b125..05f6037e2 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 10fcc5bbe..a9c0c5c36 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 4e6f51127..8c66196ae 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 e5d8cce48..cbd375535 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 64b22c5b5..6cfc79ce4 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 7c6e0f3a4..b53e655c8 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 d00275884..92e5f55fe 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 20befde3b..33d0df0a0 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 32fc1fa5f..369c0e924 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 83d1d520f..e5b00f7d5 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 f9e324bca..458c51a38 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 9e98d50b3..ff57cd01e 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 db81868db..6ca1b6e89 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 0f0a1eee2..66bef4501 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 3a5164c67..0a2ebeaef 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 ce2d48ba2..5d3725aff 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 e4299b86f..4b90a19b9 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 5a7a3764d..b98c7e872 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 d9cbf6ba0..2a14b7f79 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 704041b55..a1fabef3e 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 2feffaf27..9d5d73ca6 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 969301a16..1243b3cef 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 5b856b13b..5e755ddb9 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 d37fd69af..80569fb49 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 229dc709a..5bf5e2cce 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 c4230b1be..0e9f2b698 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 962b7bc95..8c48d8fee 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 ca111e1f6..b2d508738 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 1156536ec..e2e825483 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 b03f80629..202154020 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 a9b94ee28..b39aaba23 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 c49992ca8..ff646b3c9 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 c6ac3b46a..d204e4604 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 e950c1785..fdd8722be 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 787887eaa..b6f3834be 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 9048e816f..b37fc5c43 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 a129e2387..84d342a2a 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 3adfe41ac..ce9f14655 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 6aaec2a8b..99dd4f0c2 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 b39ae5b0f..317d29ad3 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 2104cc157..6da1dff39 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 3e604156f..f2acb23c3 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 1f35b79d1..c4979f6e3 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 947eeee56..4e1e551b0 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 9ab88b70e..464a3496a 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 2ccc19e06..06f5132f0 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 f508fb945..3c0538cbe 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 af1ea7a86..3940e6735 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 8df7a00ff..166f88267 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 a9f401df9..408c08c7e 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 ae63387e8..345a90b91 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 0396d3b2b..bd539432b 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 9c2fec9de..cee8ec169 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 6f1b00065..fdd420699 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 ba05d48c0..f5159d0f8 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 9e92601e0..614829ce1 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 b94b0c38b..78adcab7d 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 d963f758b..cfd006c50 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 ca153995b..287e70dba 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 01483ef04..6f30953ef 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 4e65bb483..a9394991c 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 a515c0d05..344646302 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 87fef7160..6415586d2 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 77726a5c2..927a87d12 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 5f498b088..e991b61b6 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 90f4bb11c..e50723c1e 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 c5f5962cf..67c5af5e7 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 145fe9c30..95603d417 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 57d98356b..54386f528 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 6fc43093e..d1817268c 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 fb5c49249..bb7a84309 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 24b87bad9..7ca5bd5f9 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 0d24d4373..d2e48733b 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 bfef01470..d36e4d04f 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 57ae99e5f..34d0c44b8 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 8d860c3dd..ad8029cc4 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 d8b38b974..1cd7f6c86 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 21bc44d7e..20af4651b 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 0db9459f9..6ec9e8ec9 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 0db44000f..b724a4902 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 b4f2295e8..39d86774c 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 b22572428..44f9c4bb5 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 bac2cdbde..24d8f3103 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 6e8692a6b..13bba6e75 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 18337cd1f..1ad722314 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 d41b51735..e2e93a0c1 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 c3599a7a3..7eebabcf1 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 af6c333b5..a0d339d58 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 8ed3f8755..6ea3d96b2 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 716657d2e..3f83de552 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 cd11a77a5..d0274c153 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 ba99a0663..fc785c5b8 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 da7bec463..ba040cc8b 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 050764323..12702c815 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 c0cbce3ac..80d44d5a3 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 65a590ea0..fb4ae55c5 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 f8a3549c3..f12d552d9 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 c91bd8179..a3c3e8f87 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 b1bfcf129..ffeec8540 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 468fc73cd..e5e19866b 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 476f1ffce..cd6b3d0fb 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 1bef89d0c..320f2fcf6 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 566961d76..5246c14fd 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 b4c8e5b88..c85b7116f 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 ac7086cc7..514f0f793 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 07565ea6f..2d6c063f6 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 50f285f78..4f2859be8 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 520327a4c..f416bd24f 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 3520d7d93..9e924e8db 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 239c93faa..2e0076034 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 e1da0e15c..5822f4e3b 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 478f5352c..1f6db0691 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 dd701dfd1..26eabf05d 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 b9f3cd8fd..5ac560ecf 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 4415b60a4..b1839ca7b 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 a845c89d4..3e7b86dda 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 3e3375119..55e225087 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 f5ce66841..0e23c17b3 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 ed5cf5bd5..ef697e64a 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 7b958ce23..11920ada2 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 ea0465685..f8c5a6234 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 2d3997e7e..c8deb675c 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 163f09cac..89a98cb4d 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 be3c51fc0..3954b3b51 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 4ca768416..f49eb79ac 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 35bd50f9f..af8e7e5b4 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 5d1b12a1c..4c816653d 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 1340ac0c4..2f2926439 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 673684bb0..fadb5e608 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 ac503a64a..eb17323ea 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 3ca34e4fe..b9d07e8f6 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 b20303eb4..1818ca747 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 48c20e4c2..d45eb9c51 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 06c429bd4..eaf67f989 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 7138f4bd7..9a5f25a41 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 123d86637..073f4e3d2 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 660e8fb1d..da15e3e64 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 ffa30b41f..31e1d0ab6 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 5dbfd80a6..cc8f64921 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 4ae14e2d5..8f67519ee 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 93cab09a3..17ca34c7d 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 f7120b6aa..4bb75c779 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 a7b7f393a..83127caca 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 c4754a2b8..7ee807169 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 d75faa115..53777c49d 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 fb7a04ed9..1c4722c93 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 e7a2ab862..60bbe0214 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 88e38ce4c..02ed5a4e1 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 13570961f..e2a328027 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 0f0dd6e7f..16842816f 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 551ef2634..c2c4ebd79 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 e49aaf827..6d17d4cdf 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 0caf94f8f..93098643b 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 0a4c83adc..eb5c13e36 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 d83ec2e0f..5048e515d 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 c2b135647..b0648f17e 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 143ceb370..384b1d698 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 020c6c08a..d387b1fa1 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 bf48b1484..367562971 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 d0fbf391d..5d91c1bfe 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 034569927..4a511b55d 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 5c7bda8d0..31c1d249d 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 813fc8d54..7bd2977e3 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 1619a482b..86a5c4a32 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 4dcb3fd3b..bb1556704 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 8cce62748..28d75d3c1 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 de98fd93a..24b33c399 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 f726f3e2d..85b84f513 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 634d85062..2b6e6dfae 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 743b03277..db23b455b 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 3a7ac35d6..2e18224e4 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 7be45af60..5fdcafb81 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 b9225fdfb..15ac6c4a2 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 b0f580590..4e9807f00 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 39cdd3e60..c90298a57 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 9d612e72d..ef8dbbfd6 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 d93234651..4749ed3c9 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 f6cf626c1..1ab0d81e5 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 0474ced4f..9260b89ea 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 af5aa85a7..755f39108 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 a19d4bc4e..c97a6f2d3 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 1762e9772..002a7c9fd 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 e6cfffd25..09ffc9436 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 03ad5c8cd..f978e9b45 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 a8e495c3c..39cd6b996 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 0cc76709a..155f844be 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 0037eb0f1..3d310d583 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 23f00701e..6b8265aef 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 2a793fee9..61c094e9e 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 9fd2d6d3e..26dd7994c 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 0e41cf31c..e35652e38 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 7d1859527..c71a11315 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 42b6ca03e..ff525c151 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 8b1da2ea8..890fc56ef 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 49df9fe4d..adbc4d5e0 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 b5f5fa7a3..cb8ed5c4e 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 203978a01..1a9a9bf05 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 255fec166..1980370db 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 957e55a44..ef59bb25f 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 3faff1d92..933741bb1 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 c7122c832..45ea1d9c7 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 ab21ef60f..c5dd93e24 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 e1f6e6cdf..5dce1ad67 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 0efb3b485..d7ceff5e6 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 fbd3a78f6..4aa71e741 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 601ee1843..5213551c4 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 0ad9ec288..ace5a4d8c 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 299b7a2ba..50e0d156d 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 9553c5e69..9b0624f41 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 c4b604557..26ce68f4b 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 591769114..4c2d9723a 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 9799e90c2..46d59006b 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 d701d8ad9..8ad0114da 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 8d642f383..b320be09f 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 052696dc6..ce9f3bf58 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 1b3674c8f..44edee2d1 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 0b5e4e5b4..ac5b5388a 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 1688384f9..ceac75e77 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 b188cbafa..b3bd6b7f4 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 64f114ebe..f0ee21039 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 a741885f0..9ec33a1d5 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 37e60d55d..66333ad9d 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 539e40dcf..ace5ce66b 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 a87f6c9da..bda2fab14 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 51697fd71..4914ab67b 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 84731fe8e..f53ed8876 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 57cb68525..18777e660 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 bbed750b8..f0f03c89f 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 214cae534..e40523d27 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 28a378a8c..0643fd352 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 cdd933de7..a24e738ea 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 9f60f2153..c42f88e99 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 4a666a3e7..c9fdd8cb7 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 87f229d3a..9d9da9c37 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 25a15f550..1a1f807cc 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 215014d9d..55ede00ad 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 3523173b8..07ad02c3b 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 0cda2cd4b..da031cb4b 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 9d47405ae..ec2d21c13 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 b622def5f..f119d4c39 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 e98264c9a..5a45dbb26 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 3455771fa..b617abe9a 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 b52c03f41..7a65039cb 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 c79dde454..80c749bb9 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 43ee1592f..0a5819045 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 cfe9ed94c..a749ebd1a 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 5b2ac4116..cdc154c08 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 6e68689c3..86f235ece 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 5e2f63ebb..16dddf5a9 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 c5cfb8264..a46e56367 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 19b824d0e..d293d37f3 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 6ee606959..2f9915e43 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 0a0f37d55..c877bd389 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 898cd85dc..321ed133d 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 a28691a6d..6d0189406 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 b937fabd2..273c7e076 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 a00bfa43f..fdceedb26 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 bdae2a5d6..7b793a485 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 42b76d1bf..e3bf8903f 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 c49a2f7ab..1e9f84987 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 b03966a8a..6febba9cf 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 33f1404cf..bcfdadcff 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 e6fe69470..a54bb3f4a 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 248220885..b958255e5 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 1e7efbc3d..9361e8693 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 0d8797de4..096449623 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 85bf315aa..181025bc1 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 1e5a6707e..ae077bf1c 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 b3938774c..6f2919531 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 f3e68f3d2..47fe88525 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 4b00a2647..2b5bfa2b1 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 930eb8a06..63a559103 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 3bc73fd26..9667181b5 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 6d05d8521..9c8e6ea58 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 96b9a853f..4c4d7b4c1 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 23ac46be6..4b17a83ac 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 369560165..ce6e9a467 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 3c19a9ed5..a2a63b7fb 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 b9af05f3f..50f6c6852 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 1500e7feb..526b0bf13 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 d4dab7f73..67b356b16 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 5a3b40690..7df0b544f 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 714ed402b..5ae2336e4 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 a613bdb66..6936d29d8 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 997fd6e6c..01c45ea1f 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 7d6dc249f..87c60fbbb 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 7e7d20c98..323cf871c 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 73bcb5cc0..1a04559c7 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 9d72e1570..89cb876a6 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 015851f39..f51ba9cfc 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 04d1b57fc..f57520265 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 e4b6ed8f2..35a5658ca 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 75d634c08..4ce8ffbb7 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 123a7c227..9da3bca8b 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 11852cf42..0b56de8c1 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 ce8eeb5bf..e999e39bf 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 f6404ab39..a606c6e53 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 5230d0120..b892c0e76 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 af0567e47..5c62e76da 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 5d1fea916..ded8247b8 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 7e317bb50..9e99c85c7 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 8aa096a76..58ac6d58a 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 5e4bffdd6..a78510d16 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 959c3efeb..3ad0e17b2 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 31f3d218d..a85750f9f 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 edef6d59d..6d450aa1d 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 0a831a2ac..eb4efae5a 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 48ecae76c..b20ea900b 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 b7478fd26..a2263adf9 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 65584cae4..db2dd29cc 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 619ca0ca9..397e77566 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 fd55b9ce0..c33df9faf 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 9a7454003..a2456c046 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 61f7b4a5a..9d90261b3 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 a1524a5ec..7ab6b8bd6 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 1e6ee5b8c..7bc078d46 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 81a25e15c..49d3d45e6 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 c559019b6..d8663311b 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 8717641d1..4a4703caa 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 fed79d14b..493028493 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 e60b39e16..52ba3ef8d 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 2cf90e35d..d269b0752 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 fca197591..78c1b85f6 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 2e461a52e..b055f0266 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 138852e2f..7fcb580cf 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 2aa7038f5..916c53497 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 bbb8c52f6..939b96ec3 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 ddb109c72..bda1f25cb 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 70c1e2469..ce4e3c2ae 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 42caae5f0..23582618a 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 89af54b5c..e66623803 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 cba825fcf..95fadf2bd 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 3f21067f7..0219f1fa7 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 db59963f8..fe87bae9b 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 f2f937119..4ef65c57d 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 45dcd4d21..4412aa3b5 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 ec60863d8..955e87e88 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 ccfdc258d..5e87850c5 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 93e3a2688..441e819af 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 d29163f60..a46b3789a 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 7b33b3503..10afb93c8 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 f14d07112..b44da9792 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 b3a1b2246..cab3b387b 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 d1b877b1c..a5c218f8d 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 41bc7351f..514f1d96b 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 fc9cf8f93..7ee9299c0 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 b5e84d1f6..db4e99806 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 0821483a6..29c4a37f8 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 bfb994f21..b4c6db0e1 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 566cf3168..866ed9321 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 5faa79fe8..f68a811a8 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 371006112..c1cf98eff 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 7caa3340a..c9a4abfa5 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 a4cfea2c2..b95097a81 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 57046ca79..aaf4d2e91 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 dafdbb618..971daa6ec 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 0ea48b2b4..ed62dfa35 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 0080cf300..23218ed46 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 fc3fa2be6..ae8a9c159 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 f048a9e6e..4b8d3357e 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 2f7b0267c..eb7ec0c83 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 3b1132038..c74d94d02 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 28a3a708e..b724a1cdf 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 65fef4212..3325be238 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 5276f9342..52bd67e17 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 a966b3e6c..eaa566304 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 6bf41df0c..45d084f53 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 a5bff8644..106087c63 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 939faf839..6e858c9ae 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 2191f3598..a2879beeb 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 e8411201f..5126d88dc 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 3925d90b0..4e20648cf 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 5ce8c0ed6..e569ad3a6 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 9fd39a5e0..ed9e8e1b7 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 6deeaac5d..39e25d593 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 f06f0650b..fbfbbf77f 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 f6234829d..4b2e6881a 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 0c33fe195..0d0dce79f 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 de97e8639..6b0903fd6 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 3933f2af8..ae217eafe 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 61dafac67..f6a6aa61e 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 e79a0e74b..c135e864a 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 d7da40c4e..8a60b0efa 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 0ad3bdd36..f76d3b419 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 7680f96ea..8199b7740 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 d6530a812..a7a3f5bc2 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 36780061a..7389bb063 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 a8b761a29..d4ea37208 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 7e35eb2e2..df3ba2625 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 7e9621183..1f1b445de 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 501dc0abe..0dde4045d 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 cbdb2ad2b..1ddfab160 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 9271bd594..31d0741ea 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 401d1d655..46b609f1d 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 af5701316..91a2aeb13 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 59428b07c..08dada123 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 ad6672dff..a241b952c 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 7ec464464..2fe87097e 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 9f38bf86d..26383bf4f 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 ee24e3ece..076d88903 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 cb4ee5b89..8ae6c7cb8 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 18b941223..0cef9c49b 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 fb48428ef..c9f3271b0 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 aed5b6f4f..e81f2f285 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 68d795875..703ec8432 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 f677c03e2..5fd59f472 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 3a3b5bef6..9348f44fb 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 6249df324..b16148638 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 f9a3d4055..d62c385be 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 b84037d5c..6728948ac 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 ab1aef257..cb7f97d00 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 d91a3b5a0..4dff39ed0 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 e3fdaad2d..016dc55bf 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 301542cea..8e5e43b15 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 2e877573b..7883ea178 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 3d9e2d3bf..4ba1d8531 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 3b42bdd22..2b6cd6cb7 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 1eedbc77e..243feb139 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 4ee2afcfb..36f979751 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 9ac87fc29..2d96b8305 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 a8464fb73..67349b23a 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 432071f22..66678480b 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 1080cdc00..db18ad26b 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 ff3912d93..f4996ac14 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 18a74a42d..883f64bc1 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 99e0396ea..8d4a7010f 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 7b1284649..78b0663cc 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 8b70f3011..a01f16bb2 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 e90fd0deb..6da1077d7 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 43e762f0d..0e77ef2ed 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 32b8aadaf..68714213e 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 d6343d905..e3a2f83e7 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 6e3da0d71..23211a0a4 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 13343aa66..6442fd1fe 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 40e18f77a..e945f98ce 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 209a0f9eb..f03c52d11 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 4b37de891..dfdbac6b1 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 ee4637e93..f3053c6a9 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 2b4ddbb4c..f13c6882e 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 fc3c245b8..329e24b1a 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 6ec922aa2..95eea85dc 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 9bd3da8e4..a2f731b64 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 955aea59a..c7fc2eb62 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 06bf0ffbc..877f1930d 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 deebfef3b..0d4aa8c28 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 ec8d85a8a..19982d2a9 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 4be9ac96c..25839a7b6 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 8dc58610b..c9769d19e 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 9dc751f6b..4bb8898ab 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 f711c3564..9a238f97b 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 b92a8204f..0fd19f676 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 3ad47a46d..53a308729 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 82956a7f9..3c2cf3204 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 1a778fb73..8f8128383 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 93b2e86d6..ea92094be 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 33c3c20f5..b9eb1cd5a 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 a1a2e0136..a6ddc0118 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 d4f810881..c91f67168 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 dc36448ce..010581318 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 8ad5e3e2f..5d9db8f53 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 781ade1e9..4ec27e19d 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 b81bbe778..9de14baaf 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 e95a216e4..00e5a4991 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 ca4addf32..6868cab65 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 77538490e..c3ecad76f 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 c38d82b26..1a9686566 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 613b528ff..878c61262 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 441357b11..c2d7ca61a 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 03e56aea7..7a78b557c 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 1426111eb..4b3cb9bd0 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 72ae041ee..f141f316a 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 5cbb3ca6f..0e42b6704 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 206a98e53..835a74a23 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 df5bdbc47..ab9bf8c37 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 c773f1e99..2696addd4 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 05831d0ba..e123b250e 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 d00c34a1f..c9423df6b 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 2721108a3..8e51fa37e 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 c0f62b7e4..f940db7b1 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 03bdbc153..b7be4345a 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 67629142b..2205847a5 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 c6023b01c..7e7dff0da 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 f98e35eea..cd0f0bc1b 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 e2afc9078..a7284b728 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 2e8eb94e6..978ac826a 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 7eecafa19..243ba9556 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 535c09f45..0d9c78abf 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 d8638eff2..a55abec38 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 b3690ddbc..d52ce7d82 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 7d2c91034..de3fa68ef 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 70dc67a49..1ce843ceb 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 e8270c168..965989e4d 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 edc64a8ca..aef8e4df5 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 98f42f229..7a99c3cc5 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 72b856008..2249a1011 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 0060b3c65..682a0e37c 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 3c8b3993b..3d652710c 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 7d7deb5bf..ef2754cf5 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 4c579d9ef..fb78e3972 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 bf19c803e..e03b1f445 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 2e8d82612..a7cfad900 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 b26478e62..dd2b89503 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 cacf59569..62110ef5e 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 625331ff4..4db9a7ec0 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 96e4521e6..f3f80040c 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 4ff6b12a2..c4c2c3b33 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 f0c7df239..eb71ef453 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 c60a1702e..c32732ba5 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 70f4a71b9..3cfdbd215 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 76564a87f..65870334c 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 5774216a6..5ae567b7a 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 a1dac972b..034bff169 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 444a1a5d4..dd621db42 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 2e4a5c2c5..2efcc07c1 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 ead193731..cc7d91da2 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 bc2fd5c5d..34f5806c7 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 651d49858..069a921c7 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 8f50b4a0c..97b361c46 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 b4c1ec6a8..509f71efd 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 602182034..9323fc7e0 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 5564c4b36..913591ad9 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 55b43025c..2fd778067 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 e18b6eccd..022154ac0 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 91a1f320d..2a1e75a68 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 09232b46c..bca1c039a 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 63484da5f..82eba1f7a 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 c64c00c9b..282dad8e4 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 4e0443fb1..a6ce9cc65 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 e07e4b4e6..ad150ef94 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 5e156552c..cea63a630 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 09521e6c3..f878d4f9f 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 05a6671f6..58c980356 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 171a7fd5b..5fce3dcc3 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 9a404621b..23ae8c0c7 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 52591a63f..8732bc78a 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 28e22291f..77419ccf0 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 5b5da60aa..8b7aa1e6d 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 f282e7fec..cec78ff4c 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 a62899c6c..6fe15d807 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 accccc807..9285a4b62 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 b8e3bd96a..ea075b6d1 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 32aa3dba6..9cce10e83 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 d0fe1bb3d..7c45634cb 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 30474b2f8..4d0440d02 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 7fdc85ead..bce929a50 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 e9f33953a..e31a63c7b 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 a1b74ed84..6d84b1cd2 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 cba76c17f..e74eea232 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 2a5f14223..a5526e616 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 3a8f05f88..a822b52a9 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 47ae88533..8dbb2713f 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 6625e60f4..e379c19ad 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 250fd8f5c..0fdfbea64 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 a906585ee..6412cb043 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 b179cd41f..9ade78197 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 6240f32e6..37f820aa3 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 75ba5833b..ed3dfdea1 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 1fe8673d6..fb23e08fa 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 d671e33dd..70956856f 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 97856e95e..b04a2c53c 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 e0c4a2ffd..99c6b1883 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 d45970a6d..a815917fc 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 20c1ce4ce..7be95e8e5 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 b8395b128..a95578372 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 aa7de1ce7..a5561eaf2 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 6d37892c1..98bea5446 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 74f2d95cb..a7349afb1 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 9b93dadc9..9b286a243 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 5dd3b5eb6..75b5d34e3 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 73515a727..7ccf8d7bf 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 c3c05a7ed..5de6265ae 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 5037a34d0..d237ed39b 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 d252adc22..30d78f9a9 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 8bd5e6c90..8c01f51ff 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 1b97bb3b2..4b652f4e6 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 d63baf3ef..e16e939f7 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 74a41d682..4388f73d4 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 875f5d127..22bcc86e4 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 d5ab7f850..c7c0d1b7b 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 15d0ca6b8..47d116927 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 1a3d7ad0d..de01b68dc 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 838794486..1da64d009 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 d3d26128a..d43551db1 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 5f1381ea7..b4fc9c20e 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 33fd07ae4..30d07c881 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 9f7483110..c6b9cb5af 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 f3c702a26..235d2d473 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 d472a4685..8782525ec 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 5f2a8b110..5fd46a37b 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 7fa5e675f..411c39f48 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 cb970842c..ee4fc1835 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 27e2f19ab..c38bc8cfa 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 734f9672f..142ed42cb 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 de1729826..db89254c2 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 d6f5198af..f2c5eef02 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 bcc761f25..51347d7d0 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 f4f1128c3..6d010bc7f 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 446389dcd..79b9e7463 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 728064908..6c0be6a7e 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 f8f637d4d..d3d2f05dc 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 85e8f4fca..20172d140 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 b1df4c3ee..60ae7c5b3 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 c393da9be..9d82e6cb7 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 62c247080..c055320af 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 02e0969c2..a79f3cd08 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 07d9aff02..2b4c4292b 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 56fcfa71a..e9c3d7bce 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 84423e2d7..d7657e215 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 b8b2a58be..f7755f044 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 a7cbe83b0..45267aa01 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 1f0d00a35..06a817412 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 91bd3b645..39469f31e 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 9acc11bdc..750c1c48b 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 013d4ab20..8ce57482c 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 5d8458cc8..a5b61d3da 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 26f518206..b0877e218 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 cf05a89ef..eb53b1efe 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 573b1f6a8..5988e3866 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 4a242c870..3db025cbd 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 ed814859d..d17465d75 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 4edd3f0f1..af478204d 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 2603c404e..97ac3c41e 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 f32d4e396..754445cb6 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 da3b1e4d7..b2c2dc766 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 b7b1cfc0c..3fbc77381 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 75c83a6f1..4ec85e329 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 dd3ce65a4..93ce5a08b 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 41c13d449..4296bc834 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 f6c1a2c77..eefb5511f 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 3593e0d54..df8adc685 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 ddcdddd68..fcc74ba36 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 70d672f6b..3849eaa47 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 efe6b0789..609fb32a8 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 97945db1f..8a8cb35c8 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 112b31088..e68400408 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 515967165..de9555bea 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 4cfc39c57..2a697ddc8 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 56055a6fe..e81d9a897 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 0045a4d7b..98e6beaa7 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 77b7d1f69..5265615fc 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 3c355a833..1655fcdef 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 21f8f6c0f..ab47694bb 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 744fda118..a5e2ec41a 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 9385e3ef5..7ba94cdee 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 eabc83a49..5b6ae61a8 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 b58224c3c..6143d23b6 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 f79f52d44..4c6db4c56 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 020df6796..f0f6873ac 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 e31875ba7..fbc42fece 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 027c5d8d9..879c434da 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 ae4240fe6..04c54aea3 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 7b9ac371c..78ccd7e7e 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 75b723260..14bdd1411 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 81bb95c73..4498e0fbf 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 ca8821bc3..052eaff76 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 1f5532a62..898a1f3c3 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 abec72249..8a58f9e8f 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 86c926852..29842a4cf 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 bd616ab3e..74d473fbd 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 12e3f12b9..18c8d324f 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 bb7035f90..4a7ab143f 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 2a96eb0b5..620325b1a 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 e91b4041e..509580b34 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 8dbb9701a..5d448ad8d 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 ed1457fec..c64f8cdea 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 2e691b9dc..db10a6305 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 9e7728be6..e5417b69e 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 c9be633e7..7a045517c 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 new file mode 100644 index 000000000..df1aed305 Binary files /dev/null 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 new file mode 100644 index 000000000..633ba9b3b Binary files /dev/null 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 new file mode 100644 index 000000000..2af1b2ee1 Binary files /dev/null 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 new file mode 100644 index 000000000..3c60ebe9c Binary files /dev/null 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 948cd096b..1967853c3 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 new file mode 100644 index 000000000..d08a8bdd4 Binary files /dev/null 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 new file mode 100644 index 000000000..31702ac6d Binary files /dev/null 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 new file mode 100644 index 000000000..04ef514be Binary files /dev/null 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 new file mode 100644 index 000000000..08225d658 Binary files /dev/null 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 new file mode 100644 index 000000000..6f1f240ef Binary files /dev/null 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 new file mode 100644 index 000000000..fba46d952 Binary files /dev/null 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 new file mode 100644 index 000000000..612a69843 Binary files /dev/null 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 new file mode 100644 index 000000000..903c2556c Binary files /dev/null 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 new file mode 100644 index 000000000..1d7116b95 Binary files /dev/null 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 new file mode 100644 index 000000000..f6103c88f Binary files /dev/null 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 c65b5d51e..d033ae961 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 new file mode 100644 index 000000000..1aca27168 Binary files /dev/null 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 new file mode 100644 index 000000000..bf92d286d Binary files /dev/null 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 new file mode 100644 index 000000000..cf06b6b44 Binary files /dev/null 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 new file mode 100644 index 000000000..33f7da5ca Binary files /dev/null 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 new file mode 100644 index 000000000..e2cd1dbcc Binary files /dev/null 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 new file mode 100644 index 000000000..40a1c37d7 Binary files /dev/null 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 new file mode 100644 index 000000000..6fd13e011 Binary files /dev/null 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 new file mode 100644 index 000000000..d3755e359 Binary files /dev/null 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 new file mode 100644 index 000000000..59be233e8 Binary files /dev/null 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 new file mode 100644 index 000000000..6fc284627 Binary files /dev/null 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 76665366b..b66edd9f9 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 new file mode 100644 index 000000000..a0c03607c Binary files /dev/null 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 new file mode 100644 index 000000000..08e952fed Binary files /dev/null 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 new file mode 100644 index 000000000..1c64e5792 Binary files /dev/null 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 new file mode 100644 index 000000000..ba954c166 Binary files /dev/null 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 new file mode 100644 index 000000000..f17c2d1ec Binary files /dev/null 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 new file mode 100644 index 000000000..3e5669c1c Binary files /dev/null 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 new file mode 100644 index 000000000..2322026c3 Binary files /dev/null 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 new file mode 100644 index 000000000..031601c4a Binary files /dev/null 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 new file mode 100644 index 000000000..4bb790ff6 Binary files /dev/null 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 new file mode 100644 index 000000000..48a83b13c Binary files /dev/null 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 1440efe6d..7aee1806b 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 new file mode 100644 index 000000000..877081964 Binary files /dev/null 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 new file mode 100644 index 000000000..e21fa2173 Binary files /dev/null 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 new file mode 100644 index 000000000..5dce658d1 Binary files /dev/null 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 new file mode 100644 index 000000000..05280ba62 Binary files /dev/null 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 new file mode 100644 index 000000000..4746de15b Binary files /dev/null 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 new file mode 100644 index 000000000..38f2ce0b2 Binary files /dev/null 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 new file mode 100644 index 000000000..306f08805 Binary files /dev/null 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 new file mode 100644 index 000000000..05448ff43 Binary files /dev/null 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 new file mode 100644 index 000000000..d4a98c9b0 Binary files /dev/null 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 new file mode 100644 index 000000000..20ea894e1 Binary files /dev/null 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 ef8903589..10dff6353 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 new file mode 100644 index 000000000..3c9aad88a Binary files /dev/null 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 new file mode 100644 index 000000000..3d6c4cb3c Binary files /dev/null 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 new file mode 100644 index 000000000..68f06b683 Binary files /dev/null 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 new file mode 100644 index 000000000..97c529579 Binary files /dev/null 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 new file mode 100644 index 000000000..e973bc375 Binary files /dev/null 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 new file mode 100644 index 000000000..c96f35ecc Binary files /dev/null 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 new file mode 100644 index 000000000..6e5b3f960 Binary files /dev/null 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 new file mode 100644 index 000000000..5523be65f Binary files /dev/null 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 new file mode 100644 index 000000000..b0105d2fc Binary files /dev/null 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 new file mode 100644 index 000000000..5ca4513e6 Binary files /dev/null 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 9effc36b0..3c0a5ec31 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 new file mode 100644 index 000000000..11810dbfa Binary files /dev/null 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 new file mode 100644 index 000000000..a96da3d40 Binary files /dev/null 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 new file mode 100644 index 000000000..159ae0d4a Binary files /dev/null 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 new file mode 100644 index 000000000..ae430912f Binary files /dev/null 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 new file mode 100644 index 000000000..c82ca5a9a Binary files /dev/null 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 new file mode 100644 index 000000000..ce4dd8896 Binary files /dev/null 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 new file mode 100644 index 000000000..16dcb3d1e Binary files /dev/null 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 new file mode 100644 index 000000000..ac6f14b18 Binary files /dev/null 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 new file mode 100644 index 000000000..3e3f2cfeb Binary files /dev/null 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 new file mode 100644 index 000000000..e3653fe00 Binary files /dev/null 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 d46153c6f..d75a1afee 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 new file mode 100644 index 000000000..8c5d01795 Binary files /dev/null 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 new file mode 100644 index 000000000..c8e72f5b3 Binary files /dev/null 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 new file mode 100644 index 000000000..604c9721b Binary files /dev/null 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 new file mode 100644 index 000000000..9b28186aa Binary files /dev/null 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 new file mode 100644 index 000000000..6b0ae6d96 Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/0_1974.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_198.png b/TMessagesProj/src/main/assets/emoji/0_198.png index 775a57b0f..3b37f6bea 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_199.png b/TMessagesProj/src/main/assets/emoji/0_199.png index 0e247391a..da5b919b0 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 154ef8b75..f8039f456 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 eee0cddd2..ff15a772f 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 03698d4a8..33e6f7dbe 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 5d89056c5..7de620090 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 9c13429a4..152d26408 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 2458d3421..d5eb12c3f 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 d0b77d9e9..5ff05840d 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 0c3732e24..223156ccc 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 14e894c7a..62661f155 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 95e36b30c..4bf471097 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 81dac29f1..5f0407344 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 ac1a8a4c1..8b799b91b 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 a2f0a5111..8e089ac35 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 154e615bc..988e579f5 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 e856eb7a7..eae75e5b6 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 4a4fb3e04..c9ed411c2 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 82d2cf159..d27e982e3 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 1132ac0c8..bbcb0a8c8 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 8b9c3f745..f25cc60ec 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 eebc53a5f..217ba3f39 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 aa3ca8407..b0fa41516 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 bdc0ebb3c..bf6af74e8 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 d57ac8c6f..f3bd99968 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 8669e40b1..0211c1ebb 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 ffe804b03..f2a590912 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 81ec505e2..976c301c9 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 3d859ba38..f5df2bbb1 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 0a9596bb2..5c2b8ba24 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 701faba12..3ad94f8aa 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 0f9052381..d2bab6e65 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 d7d332215..d3fc68e36 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 12561173a..293767329 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 948187239..86577b0ae 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 0126a3c61..f94c47580 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 f07bf6714..4c3acb09a 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 f51012d9b..356c72806 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 2d0b81e14..4b3df05ae 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 72c9ad802..79f171c8e 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 35fd6b40e..93bba3ab2 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 68b41bb71..df02fa726 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 bcd0fd269..7391386c1 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 b8f30c2ca..e2b25cc60 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 7258faaa7..b891eafb2 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 2ac98a2f6..f4fba1912 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 2c8fddf74..79fb4f3e2 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 02cb09477..ff55e65e6 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 bc815f6fc..b892b12c7 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 b71482b92..d7cfb14c1 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 60323361b..49b85ffa3 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 e0dc03266..6f7163a3b 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 9d7d9d200..b689992f0 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 021ed20d9..f3e8d8f11 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 3d41452f5..afdbdb56c 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 3c3c0806a..f3dedb5f7 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 fff4bface..54183f6ab 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 3aef5c8d2..edb6575b7 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 e7fe53b55..b10440500 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 f54a612db..5b0f11975 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 7cb78043f..762239ecc 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 faedd2d16..1c6aecc2d 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 9b719bab3..3384cf3bf 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 3d6427993..4e3f87014 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 7375a24e3..c9bfe9aad 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 b8d8b899f..757422392 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 5953b1669..7184b99e6 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 15af12994..7a8085e27 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 f2f9ebe47..130294bd4 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 b21d1c647..320f92ef6 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 d245cdc6f..ca537d118 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 7cd379a5e..c40e35752 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 67ddf22d7..f664bb734 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 bbc3e127b..5fa331191 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 cea34b96f..fa8e77b76 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 1f0bcf6a2..80af07132 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 f499e1b4c..7ae590a98 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 f7b7f0249..6a7130c6c 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 bfd5a0ef1..41a897f1f 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 b758c0cb6..6333a3b34 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 9aa397540..ed78a8fa0 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 96d4fa408..89b304132 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 8fe7d81bb..dfc38c35d 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 890cff0ff..42536aed1 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 f0111e0e1..2a0902034 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 2a10e2121..7aad56ff5 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 6c2a3f21d..7fbc29997 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 c94a5833e..05d6912eb 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 32f0b2ed9..06502c4ab 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 e1c76e7ab..379f720f3 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 e153f57c1..4dcb502f0 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 33151047f..027e22a8a 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 b2a242182..7efdc4e4e 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 6aedf7409..187eb9549 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 fd181c554..e3c1d5de1 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 3dde9aea8..dfe043d07 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 142ce3fde..06a4a0897 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 0602cd7e3..0987ea33a 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 9b59b790c..d0dcc2389 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 36dc5bf55..f735dd941 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 098837255..812c4b210 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 35294753d..beea1086a 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 71e141cb6..153165541 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 5d03f9490..00dc878b8 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 809a29f6e..f11b6ef44 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 e20187d48..dba063563 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 11084ee18..d7576be2f 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 04fca8a8f..f8120e683 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 82044b51c..82ce5363e 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 5fc0d43de..e4c95ce42 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 9b5459c45..37a6dbe59 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 aa72d1907..4d5d49b58 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 8d3a78e9e..41bb51aa8 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 df118495a..e15c6229e 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 3eb6acbd9..569797aad 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 50a1a9262..3470ace92 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 5ef7009c4..dcdfd2f50 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 bd822f5ee..be56c4a3f 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 7b585fc68..5b9205eba 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 d076d344c..091a9c4a2 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 f56d97878..1a5be9d2b 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 5fa48e6b8..744c010e6 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 c96e3c652..1808dcb94 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 0f5b2573c..7c2ae4611 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 e2d5fcabf..81b84b970 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 bf0d976fb..5509c848e 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 06237e30b..3b6d1e762 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 2ff9a1603..7935d53fb 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 493e48a24..337f66524 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 d58e01cc4..c6b2944bb 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 c64ad6eca..bdff56d81 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 e809de9b6..de0b76899 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 ac605edd3..fee504f73 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 02b1d6b61..62add4baf 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 47885d94b..7f17aaece 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 e0ba016dd..c79987406 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 2ade1813e..223c443e9 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 3a589075e..d43043897 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 03af7bd08..925ec012a 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 5bec9080e..2e1c9afe4 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 0cfeb3cd1..7a4d975b6 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 4be5347f6..030f99e8f 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 d2c4b68b7..d6e368a9e 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 b4f6b8500..c0f6726c1 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 2046c6487..174a24ceb 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 e7fc40ab5..68e37e7a5 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 681373d18..0330d52ae 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 8a9399b8c..a7a8e9bb6 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 6ca9826bb..59d7653e1 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 6ea1f126d..bbb280993 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 75c42144e..5f85325e3 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 927804753..2df30f3be 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 4c815a44b..6ae26574a 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 0b1b97861..50d777a9e 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 74f1b111c..7cb4647ab 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 07f042a5b..82fed0b09 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 4b0017bf0..6b00e06ca 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 3e897b73c..08cbfbd94 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 542badd6a..b2f14575a 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 90155794c..c56589fbb 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 a9563319e..f72b33a81 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 a5512c8af..417a9d6aa 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 b7f1d6382..577de4694 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 50d04f9f0..082db9b58 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 80926a083..f21fba5a2 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 ab9c3c418..56f8a8abc 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 ee6f992db..0047f8c5c 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 1bfc4b816..28c649f4f 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 4d06aef12..18140399e 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 99a182d1f..4dd81986a 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 1c7c1e011..aff83f0d7 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 3ba7d071f..160d0080b 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 57308268e..593e7fd74 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 53c3f842a..0c2f71814 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 a7069a58d..ca364260d 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 70595aa1f..c572bcdbd 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 22bce39e2..3604f5c79 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 30091a372..72080f926 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 037412872..b40368cf5 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 639a14681..9800aa866 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 cdc534569..733897ec7 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 14661d1eb..078f1d872 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 a07b3bf86..12f134ab6 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 e839639e5..2a6f8a4b3 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 17193fdca..19a5990d3 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 7480f04c8..2a250870e 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 a0ea25065..1e304bcec 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 f791642d3..edcc183b2 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 8fce9b751..f3ef75381 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 ca087a0a9..b7ad29ef3 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 e4913919b..a6930e379 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 6e1831835..6890fb262 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 49d494d72..d49556271 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 a56c8bd1c..25cc20439 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 af920c13a..a3908b673 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 0543dc358..4304f53b4 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 b972ed7b7..17e581a8c 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 e4fac7be6..1975ea6b7 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 43ccd2616..ad1367ff1 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 cbeaeaf45..8f200e14d 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 101d2d724..3fbf3b337 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 bd8dd2e93..868efe398 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 8be6a4d1b..859fa83b2 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 2038d28fa..ca1379b76 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 5c717e42c..0bf3c4ccb 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 65144fa8a..b8af0709c 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 fb8900b05..f843a8d58 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 afbfc7e99..2d6b6ff57 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 4988b9cb8..506eabcf7 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 c6f3adf90..620d2b01c 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 248c10314..b09ead604 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 1468a3a8c..0de711fe3 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 b9a390cf2..0ee8086b7 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 06c03b3a2..f8d39a06d 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 e4b35e970..edbbcf17b 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 67c9d408f..d49a57912 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 db62ca2e5..5bd81f2bb 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 d66969c98..af44c4175 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 d2e629586..88dc29ff0 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 028e5b6d5..f8768eae8 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 d5317555a..faf39f90f 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 be9ddd9eb..a1e956dcb 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 0cbe63a27..7c6de403d 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 b9c5dfe52..90f4bc87a 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 dbb5cabcf..a40f44e66 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 0ed943666..d11b60c93 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 305d58185..f5d5e8e61 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 523a084a7..0e665f122 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 82608704e..002c0a7de 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 5e510cc8a..44e075d6a 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 ceed35e25..738cc840b 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 43baf8602..466a219db 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 40618729e..692c455e5 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 d9af5857e..5e2aa520d 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 a08bd8972..5c5133ec2 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 7ba6b424e..c3d234570 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 26e643dad..530af3ee2 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 41a4c7d9d..8989c798a 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 b282bf7ec..1491a5d85 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 17bfae637..7336ffbdb 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 aee34f389..1380547be 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 79f9393ed..80bbdd153 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 32a1902dd..fb7def59b 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 86217429e..b1b4ca6f1 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 adf7a1117..aaac5ae13 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 635eab1ce..7a54b3b58 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 a4894b14e..2794ecc5b 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 f0ce834cd..d6815f7cf 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 572a52c65..a9e67ff98 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 45f9a091a..663ecf941 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 83e251f7c..3899f0d75 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 b0ea7dcb3..45383d66d 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 6e0788e1b..935e11197 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 e2b8fb92c..7366cc934 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 ef06e77e2..47c151861 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 92d84cf9e..e3b27be99 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 2adbe86b1..3f803e64b 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 0d5018421..f977218b5 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 5bee0aaf2..adbf204e5 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 4de083f12..b42972807 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 b966ccb61..4acfb0089 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 8ed903bd8..86637bded 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 aa9d3e69a..3274742a2 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 403515e59..46c02928e 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 fd28b92cd..b535116ce 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 f90e9b864..de154092d 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 705978816..f90785954 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 355a5267a..0de7aa124 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 5381712e5..d865bc358 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 295c03cd3..8805ef207 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 3b297c022..9ef585eb4 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 25edecd79..00f17920d 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 ef7c2d349..d96d4db7f 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 c8c79bace..6242f64e9 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 e4d9c3ecc..bac657391 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 71f3c2496..93254aa92 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 a0491fc1c..39fbab19d 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 1c1b2e9b7..0f907c900 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 4589c7c7c..d2c5c532b 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 c1ab4d803..7023f6e61 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 8925ed64e..654fe7aae 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 f877d4089..c6d930783 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 953adf7b9..f2289a87a 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 b4496a0da..0910269fc 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 117b96a64..820092e01 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 3d0f342f6..295bc68f9 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 b2654719d..d617d6539 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 b48f8051f..3be61d40d 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 fdb8ccfbf..58fac2a2a 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 5ebedf262..8c4430b4a 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 a081a8bb1..b57cfa8ce 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 d5d8da6a3..f866bed75 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 89c5d1c23..17d2229cd 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 e1af75fa3..4745511ed 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 a52265995..8884ded56 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 ddd202ffa..8ead5dd10 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 cfe11b331..e421a118f 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 de37e262f..2185f6df9 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 ddf1e1651..05950b540 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 8a368e4c8..2930d0ebc 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 b9c43393b..02f5b297f 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 e54f14b99..2642ee3c3 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 c2ea9dc7f..fefd0f2b6 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 c7c0b2b6b..9e4046569 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 8966528fd..752f4fd85 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 750a4e1d3..f69bc67f6 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 8dc7cb6eb..e79d14695 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 340c30ebe..bd19b3547 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 15ac442ae..6781c6e7f 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 a4259dc2a..c33f644ce 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 376e957fe..f363cdc99 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 a747f8e28..5f0b80f28 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 f7def385e..abe470615 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 86f5c4504..2f3458b27 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 7688cc55b..304cbe920 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 a651d408c..3ebe4c020 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 02301fa96..261931b3f 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 75657cacf..7bc9827d8 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 44fe3a333..039664010 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 af22bc4f4..a19a9fd1a 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 e7bdb06db..6320ec7af 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 16780639f..69f82d86a 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 c13d51308..ea2f937f2 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 1a1b5cdb5..2b38ccfde 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 eb06f5206..a60e4bb90 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 da5358bca..f202b3b03 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 16e6e290c..5bc0ab0be 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 68144dad4..04ed169ea 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 057b39074..c1d226e05 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 6b98fc066..6a4dae923 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 5c5caa1f1..62bdaaaf4 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 daaadd75a..cbb38b96d 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 28a7b6338..a26788324 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 61940023d..fb3f74b4c 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 40db9317e..eab0f924a 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 aec123726..c53b4d259 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 ed4c26e9f..4fa40c5a8 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 d7ad7c3fd..b933dcfb1 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 69aa0b0a3..f57e2823a 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 cf89e0b8b..711deb7ae 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 e80017237..215d12da8 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 85b6ae2c5..bdda498ac 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 055f7caa9..636811828 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 f32b0d74d..978ccdbf7 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 18cb1155f..35450d814 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 9855f9ae4..9af4f5aed 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 7df373310..0f42e4b15 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 5a419dfc3..af0d4c11b 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 1019b10d3..da40fafca 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 755534bd4..5a140e36d 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 c0678a3d2..264f44152 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 ff4a46819..1e0f525f8 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 5d58a2466..178275dcf 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 15161b775..731ef69d5 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 8420fc119..bd2249b16 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 58ae42cf7..7e55a6fe9 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 60b8bdccb..450b35cd2 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 beac5291d..4413b01a4 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 5f848426e..3459178e8 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 ca02330bd..ac097d327 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 ce103b0e6..4bc4be351 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 2a98e84fc..5a87cb4e8 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 5a0ddb74d..f66b92095 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 3d7bbb67d..a87c1326f 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 6c1099c8f..007e10dec 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 8cfbd54c8..e77f7b627 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 aeb41c337..d6e8d247f 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 cfafa5fad..719b4b2c3 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 3996eafa4..c90d0d312 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 a8c59de71..6e1d640f5 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 0b3324d91..405418a97 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 d44cd4f8a..d28eced8f 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 894a8853d..8405ea94c 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 c0f36a8fc..33a7d4f71 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 b4ac99ab3..505912ec6 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 33ca5e470..256edb44f 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 923cd7412..ed9139bda 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 3271a0c25..332bb82c1 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 eb92fadfc..eb12392a2 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 abf62a67e..be9899b74 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 2aa418c2b..3a564b4ef 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 8742662c7..78b81ffa6 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 eae674797..3856932c7 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 879b07ef6..1dc070368 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 427858b7f..49065a14b 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 121138c6a..78d3cb1b2 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 57006d5da..41f83ac5e 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 4bb8ffed4..fdf3af03c 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 625537fbe..e639763db 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 d6d6c95d3..1d8d1d514 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 acabdff9c..1b0045bd2 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 2d8a2e404..7a4889e3b 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 38fd8a5a5..52dcc8a41 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 df5d3aa24..29ea7272e 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 392643bfb..a56f0de88 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 6970c6f01..b35c7a321 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 2d7ed2010..e9524254a 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 06b34a75f..696d2face 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 0124adae9..f9ad160a4 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 f53e78701..9b4fe33f4 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 032dd77cc..c9dd987be 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 500f282ce..0cad3916c 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 17b1e1102..c1dcb6a17 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 646e7e729..4c2228032 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 6c63e5daa..4f84c18aa 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 da4913d44..915b2ff88 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 003cce537..da5ef601f 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 02c643408..f7579d888 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 fbe293229..751f6d248 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 cf0dd073e..3b997ffb7 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 508ed24c5..3a2be6658 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 13ccae861..8115e5b5a 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 6e212cd52..deee40ea5 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 8684f9fdb..fd5e96052 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 e50637fed..526f1f658 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 abbd97296..792a1ed7a 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 9016cb548..d31356169 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 c8df1686f..83efd3ec0 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 bfb852dbc..433946213 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 14e61d6b3..fbf7b7d9d 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 e7a8ad9a0..8c2df27dd 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 34f9634a3..80b7204a3 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 180b18e28..a0b201c9f 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 7335b1937..d1f70dc12 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 e5f4458a7..908b9c82f 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 f3184b28e..3831cd2d0 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 df3e9d925..7db3f5984 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 c23e890fe..1dc407621 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 3c856e967..2a3218875 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 5ca705531..4416ffc39 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 7e7d2337e..f9e67d355 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 ea125d7e5..73d43fe2c 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 1f223161b..0813431c9 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 f7d068014..c56855d75 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 171464158..0cfbf5d96 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 66ac595cb..9ac82cefd 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 e63a7d04c..769e650e9 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 ec0907670..c3b64dc0a 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 294034e67..2266b3d01 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 6dbb68fcf..c69f2edc0 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 f772b023e..ba1f4057f 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 a1f87ec5c..c715620d7 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 f06dd9335..a8c2623d6 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 4e71634a4..79eb3532b 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 c39b2f739..21f89a377 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 5acaf376c..7b537ab3d 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 fc6c17fbf..8ecd68ce7 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 76a4ba54a..d1f026e81 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 bce31f8c5..a89df5295 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 db4d5b9c1..7475feefe 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 b61f21924..c1ff0efcb 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 f8e0afd97..be0f2176c 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 94c0e461a..90a36d19c 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 acf9ab7b9..0eee8d46b 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 91b648c6b..6de84926b 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 447dffd80..4bf43672d 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 1096dfcaf..0170925d6 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 a06badd93..311a5828a 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 f975a80ee..c9b08437e 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 30a2237ab..d8fefc318 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 ce7c7bd28..babdbfa31 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 950ad4bd8..e685339b4 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 f1e57fa03..123d9f5cf 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 61c9dc35c..67fcca58e 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 fef853f94..2335d4ecc 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 2dd92b470..1cb198e7b 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 ca95f232b..d80e97320 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 3ed2f1d94..93f7c4a5f 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 735717f45..5d9401730 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 4baba2ec0..3da967a07 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 7d479b522..440644bea 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 861cdc53f..2a2d67bb3 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 e0203485d..97c4c8cef 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 c34874c71..da1ef8b02 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 94031a5e2..9c6f1273d 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 a67033d66..b5d6e348b 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 9e3caf2cf..d439c526a 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 1c0f5f9ee..eeac5c231 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 6e02862af..6b2250c1b 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 505c6d502..70e861659 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 81d64a119..c6cd268f1 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 21761dd4e..8881286a9 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 fd07104ff..4da23eaea 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 53e8a0be5..075072c44 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 bc6fdd7c9..238c8f8d5 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 74241194f..f1802e104 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 11d6168d8..9bd26d688 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 bcd14163e..24514d7c0 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 179efcf77..8e469d129 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 9109407d2..7b05d4e9b 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 d8423f461..75d7466b4 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 1dfe36bae..5248dbf3a 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 8ce68de6b..90e531c6a 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 565a8c68e..0b16b866f 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 d7196ec18..f3202c5f0 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 320a1562f..3dffe8a6c 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 886e2a83d..1215f84df 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 a6001c75f..18cd9363a 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 cc8bf15f5..f0bf78946 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 3d47e97e8..d5ca0288c 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 7126b24ae..5a9f91ff3 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 654bdc4d4..c0223512f 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 4ca0b9db1..843c0e9c4 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 cc8669ad6..d557506f0 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 c11f5b719..79ff08ab6 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 ae1d9ffeb..77510ab03 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 5c912a821..7dce76bce 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 bd382bc74..806c315b7 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 8af23c87f..ec407b704 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 5cb7b07c4..4b893e3f3 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 77261d65c..d84eee1e9 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 5f73866fe..3ff57cf8d 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 6be8ce7e8..ea140706d 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 5fe5be105..6d695da59 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 59868e181..c72cc6fbe 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 9651d0042..3d61f55d6 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 8f6eb5489..b8a93e4b5 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 6520f7fef..d93f8d26b 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 336dfef35..0f287c816 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 252cb888f..ff330911d 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 613f17b63..71cc61462 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 4fe83ca0c..b36d17ce7 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 3cda69db1..06d24a358 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 fa6a882ac..617740863 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 a94adbaf9..a8d1127f9 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 83ae937ff..f792d1db5 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 feb615e8e..ddcd948e0 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 c81b14c64..dde9a876f 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 aa3ffaf94..b741ce156 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 7914380ad..50290c141 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 2e8f9b3e1..62486cc85 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 489f79d54..0a6e98029 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 ef1534841..6c398df99 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 159e037c6..2cd163cd2 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 182528169..8c9bcfe3a 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 e3ace25b6..971a63f14 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 304c26a95..f4778ffd6 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 3aec8a5b9..a60e00a65 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 910dd1183..00694d2ca 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 8ba0baa25..d4abf24b4 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 f9bdc5bd9..15ba3524b 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 9f6d83b62..9674f55bb 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 738505111..d3d2ec0c5 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 8a4efdff0..d7090e272 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 e67f520ad..102c803bf 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 d699a9ba2..8edfb2577 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 e5f67b6b0..526a7b615 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 ff26bf55e..79203de64 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 e9818302f..5b720c19b 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 6f7b834b0..a9878f1ae 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 39cce85b9..ebc994bc7 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 d5018d803..19364c167 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 e27ce9110..b88c5b825 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 463086867..ed36626fd 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 eb3e3f1d5..f51ce0aff 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 2f3fa8bbe..20acb1a19 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 1e87d99ff..a9b95dfff 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 0b74ea504..fa597d781 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 15eff66b0..5e7ac3c79 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 9f2d3cb7d..d90a1cd7c 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 921eaa833..5d9542ef1 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 c87f5e448..83e74ee22 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 59db23e34..9f821d478 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 3f655ecba..d32298b8e 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 d356d978c..6750c5294 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 9147afb72..1335fcddc 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 4154783f9..a0fa1d049 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 f3e8e5b71..c51311c89 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 f101ad7d2..0dbd0e54a 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 ad08c4581..9bd90c1a6 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 9b8a171db..cdb710250 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 19d2ee7cb..325f40a22 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 8ebffc11a..4726c6354 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 a41258fc9..52f6df5c2 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 87730b2a4..6bb12fe3f 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 4310d20f2..2c9ef8834 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 34c612523..04a7aae4b 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 ede22c512..f3368a858 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 3329ac8d7..d30b059c6 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 617692c87..87f5301d7 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 4625726f6..5ff7b1708 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 fa9f85ac3..6de4cbc6e 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 3fcb5d7c2..5ed074576 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 6ff8474c3..be77ff666 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 9c6d9c159..b1d7aaa55 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 34bd4a572..f63a570ed 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 6f9afc9f9..d7e4e3687 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 221ac65c4..ecc7f0d3e 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 a528f161e..186070ef1 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 26ee279bc..0d94e7912 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 1b284e73f..2f12d5367 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 fe969ec66..4d42272a2 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 05ffda78a..76cec5a91 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 63d36845f..b13e4c90c 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 d3a2ecefe..d33219059 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 5e8ca9796..6d1417b7f 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 79db7f719..d485e1d63 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 01fa9a1d0..dcf24369e 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 5261d02f1..5e90da9b9 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 e6415725e..6d6072a74 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 52cf84105..165903ab5 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 a64f60587..d08ff0ce8 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 f86990368..6a39d58af 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 22d046f8e..4747da085 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 e19172d01..9b3eb3ada 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 eb952ffdc..edd12086a 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 cf0cade78..4a97aec98 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 804c614cd..fd747790f 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 007793b14..ca2dcc436 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 714a1bad0..ae0a6cce9 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 789cd4e58..94cd0d024 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 d92b4291f..f8681e99a 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 d9c3d439b..cd380ed4d 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 ea27c72b4..8e618abf4 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 504541cb7..a17f94020 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 6c81328ef..4156c42d6 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 fb5056aea..dc37fedd5 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 bdc727b2a..3ce83de07 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 c6f999e94..be395a3cd 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 c50f7cfa1..02f980f8a 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 e989bf0e2..053050758 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 e91d299c5..fa2aa790e 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 08a1e5256..9bda3cbde 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 9f0dc61df..d04c3dae7 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 d503a57fd..d4fd5c460 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 29a932757..6b6bcface 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 cca24ca09..4eef6bc8f 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 6c88a6bbf..e5fb1e4d6 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 8a152522b..b7c495cda 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 34f35500e..fcdfcaac8 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 460d74f32..62edb8563 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 f580d4918..4afb47d7a 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 b29084626..33c2d0cad 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 83876a282..46aad5d9f 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 f2e62fd13..7c9249502 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 1cc3c52b0..12fe972b8 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 33e327d84..2da49a295 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 269757211..b849e4a22 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 eda9b314e..2b63d9b57 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 0b058d0e4..2d90f0b41 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 7d8df38a2..8f9aa6475 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 d720000c1..c53bdea35 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 12fee6cc7..b97adc833 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 aa2cf0678..e50b30447 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 0e676047c..d5b021c2b 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 6b1833bf6..6de148764 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 cb63a08ff..cb2d7a32e 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 20e67907a..70ad2993e 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 19e1f47c2..f1b374d75 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 48b8eacbb..2e10ffcd6 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 a5770a88d..796a5b305 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 ed9e66489..073afd3f8 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 071f8e7bd..d35539be2 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 cdc7df0b2..6bee92fa0 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 598bb5702..3e016d98b 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 69b5f4b52..d192d526c 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 90704082e..dbc5b4ce1 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 5c6169007..e1558a5c7 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 db5bb1c31..fa3173f9d 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 bf6081d66..4803a4476 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 127afecd8..9dee9cc65 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 06461b91a..81a2f16fa 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 d4c5de1c9..d7c436a5d 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 891cd226f..9331884d8 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 9575c1551..1b551258c 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 c6a89ea7b..6c2819903 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 0e2c4470f..203e2a512 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 b06056dad..81c85bd2c 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 50723c025..a744dca03 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 4ada4c053..a350b36ee 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 59d2e0def..c2afcfedb 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 028a3bc75..037db00ca 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 5f109a564..8427e92cd 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 eeef8ee58..50778832c 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 4bc0aa3ba..9e598cc40 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 667e41c1e..de2c712b6 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 86da784f4..f7ddf2fa8 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 60ec140fd..923eb1cb9 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 b4a3ed5f8..d4447ab4c 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 cfe4c880b..c2aa6df07 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 3d3519260..ba5562022 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 540fe793f..91c2d122c 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 c1d0acc31..e6768c111 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 6904ef385..5cd536723 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 8fbfbac1a..9dede7373 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 15fb9ab51..df64a1dd8 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 47f9943dc..87b60ddef 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 83a166846..d733917b2 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 7b84f6d0e..443ebabe3 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 c06146871..e092e5f7b 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 ba9e5eb9c..c22039ab2 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 b1d6ca19b..601125532 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 0044bfd90..0ce436913 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 7c2d3de6d..898221afc 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 619bd4412..ab72c5334 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 0993f96b5..4489594ca 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 46de340fd..d912c6538 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 98d82578f..8e101b656 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 28bbfb382..823c441ce 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 bec26f2a3..c3ce1987d 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 95050fc57..8ff4f0a9c 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 c45a49417..25a3b6508 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 5414cd3f4..6cd858a8a 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 6373bf4d9..5b9da559f 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 f3b322164..c32c3d0ce 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 e820d4777..31763f722 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 40030f10f..57e5c2c97 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 940cd6b94..378fcd43e 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 230e437a0..5f52d41ef 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 52e5228d0..de748681d 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 f1359ca95..d6b0fada7 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 ba5e67178..d0295fa78 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 bef76d65b..cc8752007 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 2a1c8a5ad..9d5c12bb1 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 b0f5f4626..e83764210 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 4e943e7ac..b83d80d8a 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 87ca6beb4..0cf00bf61 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 f1b183ed3..22040595b 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 804c354a1..251e478c7 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 117c2e6c9..c01e8da57 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 7a9096060..ea9d76b8c 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 779929d80..46a3ad99d 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 945e73635..14c9d86d5 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 ae8aaa751..118e37f72 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 3b11c30f2..6bfcb18c7 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 061e6f5a2..189355876 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 bdac9afc1..06fae95e3 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 bbfcd8020..4fe6b025b 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 dca35cf28..9ad5f8fb9 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 94f16c9b8..81c4cf021 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 fd9ca74c2..17ccfa3bc 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 3c10fc272..6f1c5ad32 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 086e63712..5bbda8d80 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 a7193a91c..d5d22982e 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 b3e6d89a3..dae46da07 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 dcc845ce4..0a2bf1ca6 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 95d3cdfde..6db24ad16 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 9e2525d66..fcf130db9 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 2b44045d2..951d953e2 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 274fa0f3e..497b17b5e 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 d2eed9865..603901dba 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 08ac7ac78..784d75820 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 bffcbae53..fa293d1ed 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 4a0a07fd9..530421554 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 b2d0e6488..bbccc03dc 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 2e8abac23..56f9c172e 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 a2e0dccff..cfb2849a3 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 7af00b9bd..e4fe642b2 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 5784c844c..fafeb31c2 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 60decba72..bf0e6844e 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 6bb244b4c..5adab9068 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 5ab6ca797..11a5b74d2 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 f0a87891f..c8d3ee5b4 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 e58e86dff..a8cb271c4 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 db1c4697d..5978c22f2 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 d93dd2651..c735220aa 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 d40ec18dd..2e9821bc6 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 e4072053f..8dc872608 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 0bf0b7982..3a4f52a0f 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 417efc7c0..d7573e16c 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 6bf538062..52c72813c 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 d823fd96d..364442d5f 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 ae6d9d4db..7c43c6cd6 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 2137373d5..90632f28c 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 c0b86b618..01b26a358 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 6141b799c..fadeac903 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 ac4996f8c..962a4498b 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 9067a74fc..18ed0d304 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 342193bd6..665df93b4 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 453d07521..92334db96 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 59042b515..3facc23c3 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 160642eef..75fa438e5 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 a58d49b7d..1ab1ba8f2 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 4bbd9f247..263914241 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 68688b067..b2be617c9 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 160a71a01..3f13cff0e 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 1b1abda7e..c44a0fae4 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 72f168a33..8efef6f0a 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 0ca4ad8c7..66399fd86 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 ce1e8ac1b..ffe1b9afd 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 3027d667c..8470734b8 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 6c9bc1cbc..e5c9fc305 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 69f9946f1..3705866c7 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 94b0e7a75..661af7be9 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 e3e8ca046..e060ccbb7 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 e96b5d614..5a7765182 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 f62e1d1ab..9f1de8a18 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 a51e51497..75f092349 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 c7de751f5..6d4707f75 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 d39ca16c5..905be52a4 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 0fa64e690..4d3323caa 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 960790b80..f9c64e80a 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 f61340410..b4e7ca9fc 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 0b934aa14..b7fa76586 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 e090ef651..769c9e6de 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 f6a08ef60..f3373d74e 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 ba4810a78..df2901a25 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 4b2aa0844..2a4aaac92 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 757046300..63111083b 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 d4a723b7a..2cb226b6d 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 dd314adbb..97ccfac24 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 eb91475fb..ca8170eea 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 8fc1e8f5c..5002b08d8 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 088370442..6dc4af8e5 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 9543124d7..5daac7984 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 c94515704..faec4d598 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 973ff0036..3ef1ba1c0 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 d9527ccf9..2f266475a 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 90872af48..1cb1d598a 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 14ead7205..1215e4621 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 490e7a18f..43f44370e 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 6e122d4f4..0ad16a9bc 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 ed554db66..01d41626e 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 611eb8010..d04f15716 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 d2a37e965..e4248c85a 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 b14d9aacc..16a37d6a5 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 bb321dbb4..21d1d27b3 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 46a09a920..28aa786a4 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 d1d310d6b..0f4ba55f6 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 d7fe1d5b7..add11149a 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 abd9bf8e4..f23cab9d2 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 28a2d5e6a..cd11f81c0 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 715aa9b9d..8701ba3db 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 bd1f01a99..df51ac42f 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 75ec3bc15..c7277d63c 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 3591f620c..9ab7043eb 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 64ad94504..5af111205 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 736e23de5..3eefb8a1c 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 13f29b34e..7bc2e42be 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 e7a861c1c..c3a64a75c 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 d2e4aecb3..a4e6ea7d8 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 82468ac4b..50d10080d 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 87edd12ef..472a85716 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 b5d54a055..30d056f6e 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 147ec8afb..565103141 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 8c5d193ef..8c45ee4a2 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 406e0fca8..1b0265ce4 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 f731543c3..eae5117a4 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 0e9e01f9d..6c7393c3d 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 787e997b6..4b75a3632 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 833b7f267..814b10942 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 d11aa83b4..a452d138f 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 90e5783e8..1d091a354 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 a92488746..d50037174 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 2c31f957d..43301d9e4 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 1470dc461..fa1731048 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 68a702c2c..fd4cd4e82 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 8b0f07cd9..fc6517b4a 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 c7fc4cc97..e9244cbe8 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 4bff3a3ce..ce6411447 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 0a164fa07..8d70d13d9 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 0d62ff2c7..f9665647b 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 2d486e597..a9d13e0cf 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 ad4b590c1..5bfb9a6d7 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 367de5344..1273e3e40 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 7dc4b7764..f78236838 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 053066190..a21fcf4f0 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 6337d57ec..cfa343083 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 936e056cd..b4a7814d4 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 5ddc91d8a..556090faf 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 36e6e44fe..820057a57 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 3d673f426..f738c478d 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 857f94e78..078c0ee7d 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 f477effa1..63fab38be 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 a902fb8b0..21970038a 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 05b209fd0..a8c41f10c 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 234df3209..aa7ff84e8 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 04d768d1e..0cfeb3d13 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 59e9b86fc..fc69896cc 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 ebe6a3ebf..58abb2ac5 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 fd371e26d..26de777ec 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 78d2158d6..e22a5b577 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 1e87467ab..ec95617b5 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 7a67c3f56..e58828b68 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 c6518fd69..3b2b41673 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 f92b1b289..5d46f36d4 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 33a8476f7..9ff6b43bb 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 d1f73f235..303fe33c7 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 8ecf26ad9..c9dd50afe 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 e88a48621..194139351 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 b2d214a9f..86526a8b9 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 3764c622a..23b22b3bb 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 3405e5695..f89ca7b93 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 f49719673..f7f1b0b2f 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 a83a9f862..1a3f1f477 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 7b1a7f7ce..060e56ebe 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 130d20fa2..a90fc95ec 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 1dd131663..ba820064e 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 3d9c5f26d..c6fd85bdd 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 91b81eb6c..5591cb4af 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 ff7f03ee9..1adcf2898 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 949b40577..99641710c 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 7d8aeb567..e03595398 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 c16348392..4e0bfbf3c 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 e1d84eab7..03d1cfbc3 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 294e927d8..1746faf8d 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 e764da13e..ec60f5542 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 bd49d3a20..c363ecbb5 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 79d82a035..954a56886 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 19525e3d2..8d8d1fb1e 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 07ec377dc..f66b95104 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 7ee199472..bd643c2ae 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 6babc46d0..d0641669b 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 267e1be7f..144df3931 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 57c2863f9..0f1fc5050 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 f68ce5399..183d085c3 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 4cf2d2657..3bb8514bc 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 b0d9ec123..73ebcfbca 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 71690b49f..758b4a9d2 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 b98b393d1..e44c419f3 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 b3f0aa5ec..76f7a4f19 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 696d81693..dfc394fcd 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 7fad51a39..a436805f6 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 7c54a5524..1b7da5ea5 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 b47c74f82..d11e1f4de 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 07fd65b3a..62cf3d8ff 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 60040e431..8ec581841 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 89c729619..befafd2c3 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 ecb193165..bf2e89371 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 71ba50778..12a685aa2 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 64f39ff88..894dffed6 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 f129bea41..afb498775 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 6aa8ac93c..cbfe7a5ba 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 5b2d7ac98..7211bc0d2 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 043f5683c..d6524f43d 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 e9123cc5a..3b2a33562 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 5f25ed194..bf1d7e7ff 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 64fbb5c2c..054a74384 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 ff567abdc..f55aa4490 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 2990cfe4c..0a4df6796 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 623e7c74f..da3a059b2 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 d17f1b1ed..692d97f3f 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 d666f6e26..6d0ad6ebe 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 95a4149d1..1a55cd277 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 f28bd607c..b494d75d0 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 21df5f1e3..9ad574930 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 97591014f..3753124bd 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 fd6feab02..42eb2292d 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 8f3f74b90..ad13f607e 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 3136fe927..5f1d0addc 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 aeb3336e6..708d6f04d 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 aa07757c5..a5d7624a6 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 b9014a379..4ba60981a 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 2b55ea19a..cb8210ba1 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 45cd8286a..90d61162d 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 40c096696..3f37c4466 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 b0f947ea3..d8e5f0816 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 8d16e8b29..5c02f39b5 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 2223b857a..f903f2322 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 b7e7fc0e7..24f348920 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 d564fee55..ac826a865 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 f32d8a850..f9ab05cfb 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 2f33e4b3f..8294db737 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 3d6addb58..384e7aea6 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 cfde760d0..fa6418d3e 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 ed71f49f8..a12be2402 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 6ed0ab577..d712b1b64 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 3a1bdbcb0..cd1b3f013 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 ac9033d38..42fdd34a0 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 d9297b26b..71cabd4fb 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 d6e6d8c6b..bc1e8c0b7 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 a57bf49b6..903288ed8 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 397ad2d0a..4626d3a19 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 50fc5cddc..bcee19054 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 819229f8e..44b56f635 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 e495bfddf..891cce68a 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 754cc37bc..208938ec5 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 b02f9dde5..245d4742c 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 27f8040f2..1df5a9e1a 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 242c5924f..5cfaee733 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 91dc2ed58..9fe38ff37 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 75ba5a96e..ca27ca4e5 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 080f39cbe..c1a45651c 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 905f3c780..1afaff365 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 465f8ec96..89a299d3c 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 3b610f7f7..c08654fbd 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 d4ab0ac58..e26a340b0 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 6e8bda168..fd3fe380e 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 79ff7296d..2cf015a45 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 62fa86f65..cc093d0d8 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 a8d3c1ca6..24a15d72f 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 0cfdab483..36a6e3a64 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 32e015494..cb6b0a0b4 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 bd29599f0..4c7c7de15 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 d6fd77ee6..4d5948246 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 a950ea058..eaa7103e0 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 e1e1109b2..8e959e746 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 d05697f4c..f773d93e9 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 9045358b0..6131a83ea 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 549dabab5..a5fc45dc0 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 09f6def15..4e437b440 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 0f8faaa20..2861da9ff 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 a214812dc..f56ed98d1 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 9ca19956d..b9c573029 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 f8a168d61..7cb9eb111 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 431de9e78..fadef6604 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 134afdecb..087f27f73 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 372fbf85c..051f06a7e 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 5ecb02ac7..c069190ad 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 4cc2e0316..670128da4 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 099fae9d7..780666089 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 new file mode 100644 index 000000000..7db6adcbf Binary files /dev/null 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 3e5636f2f..63a869bfd 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 a04094ab3..f5b2e2d69 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 new file mode 100644 index 000000000..e84f77024 Binary files /dev/null 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 new file mode 100644 index 000000000..9e4697c8f Binary files /dev/null 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 new file mode 100644 index 000000000..a9773c236 Binary files /dev/null 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 new file mode 100644 index 000000000..5f5bcc96d Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/1_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_21.png b/TMessagesProj/src/main/assets/emoji/1_21.png index 1f6d530a9..cf3796830 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_22.png b/TMessagesProj/src/main/assets/emoji/1_22.png index c8325b77d..8a3ace3cd 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 f1bc3a035..56dd98a4f 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 e3635a2ec..5dc1e48a9 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 3acc619f0..9a9009add 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 dd575a874..700c9035f 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 82862e61b..26c83fdf2 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 f5dfb6a87..e43e435d4 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 34e0720fd..08c807db0 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 a67d45a93..cc88664c2 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 1cd53840a..d2e4fef7e 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 d455f2802..2bf9177da 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 3a3e7b646..ea109f3f5 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 fa67d1e0e..9913288d3 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 fb9e7e72f..eecb16af2 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 2eecc9e18..04430801d 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 c4e991369..af8727fc5 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 c146a6f5b..1ab35ff9e 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 bd31fcbb3..7b7d4bad7 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 2f6e4e033..b551014f6 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 7783213d2..078d555de 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 66deba4ad..1b3b46fb1 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 82a5cbd81..2fec2a7d0 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 7b7b62a57..e7d528937 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 2cee9e4dd..0379562a3 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 0615077ae..993ea119f 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 7e418cf1c..137ef9daf 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 3306918e3..9f2d9cf6e 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 73e828ab8..9c562230b 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 c5cd577e9..59bf68958 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 11e5e5e34..a1d08f7fc 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 fe961947d..d4a1d06ae 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 5c46dff20..3582f4a2c 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 f0eca6358..05d5ccb8b 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 dcd41e178..64cb47898 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 147ac2ad8..f47f2f957 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 b44f328a2..a284ebd88 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 3a19dedfc..b74ae13d1 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 e57025908..174c3d26f 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 386491a4e..96327b429 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 73a235284..801b7912d 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 873774c25..71bb4e937 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 4f742a8f0..44c80fee3 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 e86d90a2f..68cbc2ef8 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 541b60541..5543f49fb 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 b6360f328..0a7f5c493 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 42fee544f..38b92093d 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 ddd59468b..9cdcb9e3d 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 49d08279a..43457b71c 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 30e5df3ae..a14899c8d 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 6dfde6082..12e5ad2b3 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 baefcf8bf..5f5842429 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 e7514259c..ab06116b6 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 c1ffcc3b4..61c5ad89b 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 273acebbc..075f4a5da 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 0c4a05bfe..cd6231891 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 2950827cf..acd7397da 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 9f956cb35..746d24e2f 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 ca2ad1c22..b3dc87a8a 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 3fbae8124..c4a5bbb79 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 1ca504477..572e06b21 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 6408c5576..ab8be94a1 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 f455b6d0f..1e027bba1 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 0d62d33d6..d1f64840c 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 28d0bb7fc..697d78db9 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 e0e79ccf4..76020441a 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 edf29b133..89ba82ffc 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 c076dd2ad..8be5a2671 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 e464774b2..f8353f414 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 7466b6fe3..47721541f 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 1c763e21f..a1eefefd7 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 07af3c8ea..4a91192cd 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 aa1003c0f..37468f413 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 4ed70185a..a34df7e74 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 06135175e..9648f7207 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 30230079a..dd33ff49e 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 2bde3edc7..c94bd8820 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 601ca6eeb..bc96c998e 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 d67cb54e3..44868d209 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 dee3dcab1..08062901e 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 35cbe7d77..631bfe003 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 a46464a6d..ca3d1ae8e 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 93cf8371d..2dd9592ff 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 5d82bd1be..f8978bafa 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 7b398fa71..50a06ae45 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 7deac45eb..6ec1b68b1 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 11908659f..b9ba5bcbf 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 c50dc5d04..c2ccb9d25 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 9cbe2afc0..b5af07bd6 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 df9049d30..4f0523e1f 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 a7963baa4..9bcfb0508 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 dd00aa07f..fecadcb6c 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 f2d5cdaaa..fa60d0f8e 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 634e9c2ab..bbaec16ee 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 feb00b6fc..844ea2544 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 34199f7bd..dc79d0eb9 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 ffd1ae9bb..9ec6cfb84 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 bef139c80..eaf6b3899 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 2ac7a589f..f6e8461e2 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 f92cb65dc..3ad83df77 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 f16233e12..d7b8a37a7 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 229f1a163..d48947830 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 2771a96bb..5785deb3e 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 031d71f7c..8ae3038ea 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 1d9cda6c0..bc2fe6f47 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 091300583..f145e1e96 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 93f5393be..937fa2ea4 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 33e0afda5..3a5e14647 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 028809f2f..f33f69cc2 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 b9adb4fea..7cee3ca27 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 2010b1d69..014fbeb94 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 1a0581126..76808c4fd 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 3e76e0be8..7f067d5ff 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 db9ae7358..cf63ff3a7 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 new file mode 100644 index 000000000..fd5654fea Binary files /dev/null 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 new file mode 100644 index 000000000..de4168190 Binary files /dev/null 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 new file mode 100644 index 000000000..f98ccf567 Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/2_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_13.png b/TMessagesProj/src/main/assets/emoji/2_13.png index 989a43091..2dca519be 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 638dedb37..f836b17b8 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 6b8f9e6be..6374c1e9c 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 57860b0e2..3796401dd 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 8bac2900f..4a2abd17f 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 37b69da60..43aee73a6 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 38ec83118..57432a579 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 e495fd231..dbc094073 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 b05f75281..474b6856b 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 d2dafabfb..0968d62a1 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 088e779d5..7ba176b10 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 14e7affbc..920bb2250 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 28d6f0398..802601541 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 86f22415c..cce9fcb8b 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 c7ecddef6..1bcfc69ff 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 6c7f265e3..70020046a 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 d2c71f20b..21c9c5dab 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 54bc777f1..e0d176a63 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 b5bf2aaa5..2be4476de 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 23d055db9..1e8269fcc 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 241273864..686ae82f0 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 8803e4e6d..b4127b2c6 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 c1074cd2b..0e8b891bc 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 4604ab574..992e08d87 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 e6644ed6a..fb8268e05 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 0872b38e5..381f9842b 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 047fc2021..a13a5a226 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 76a746a9a..116169e43 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 9c5cf95e9..9873912c3 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 06f539503..17e120f68 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 55532189a..af7d643a7 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 a668ad0da..9ed595fa1 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 abe7824a0..df0a276e7 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 3798fd8d7..1ceef0401 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 ca785019a..0a7551192 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 cc1fa5eee..a982d5088 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 ea4233fdb..28e96f99b 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 bcd7f8f0e..98d2a78fe 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 32c61503f..32778cee7 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 0544a03b5..5468b5c2b 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 29d0b6c1d..b8c1dd5bb 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 64d1a01fd..aee43db03 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 1a4f1cbad..81cdac240 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 8bbc46a00..4b1917d09 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 4fb9124e7..1e90718a9 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 46a9b22b9..80cc99a96 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 37b2a85e6..fa21c66a3 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 9e3fb4428..a444bdc8d 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 88f1fba8f..f89fc57ab 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 6cd40de09..e564b8e79 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 9ff45f4f0..8192e181f 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 3c965791a..df99c087e 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 5e902feef..4da12e076 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 8565c8ef9..e882d1a40 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 16071bc05..ad7630295 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 bdeed6dbb..b6b0d12df 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 e1107602d..2749fde35 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 c9226869b..dc1636b16 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 af715ca14..8118f8f67 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 3c623c2bf..361286de8 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 4a594a1f6..0fe4666ce 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 d79cff797..8d6aa407d 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 a25156c7e..5232120b2 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 34e8ad245..c3dd08401 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 68407b149..8b95c92ed 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 3592369cd..bd571ac1d 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 a611b1968..8946de343 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 03c9c7a53..a39f06af0 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 3d8a50dcd..6b9457588 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 87054a704..00750c6ec 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 7afb09a1c..ee5a17614 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 37999f4f1..70b9f0807 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 c0bc1d365..9f21ea088 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 f27f47290..6ef0c5847 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 0360afaa6..b0628ad4b 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 502f8dd74..4d595d3a9 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 4f84e5902..e8251eb9d 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 3bd8475f9..933968f57 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 0f704f0a4..ead396919 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 73be12b99..268cbd4bd 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 ed8aedbc9..33aae7409 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 2c545291e..2a9cb4ecb 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 b76db7469..cf7438df1 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 a1a672d74..f173be9d8 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 d0a718aab..1df6b7547 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 c70145b66..88f47a54b 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 771e765ed..81bd5429e 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 a1a756c59..5942e5bd3 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 9ddcafae7..9a8d5fd26 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 f458048e5..1f8c94793 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 f267b4d7a..c00773b51 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 c85b4dff5..9a00fa9bd 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 39bd91eee..5e2ae1cf5 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 ce10267b6..c282f708c 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 7c90cd047..637711592 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 795b92018..d6ab7072a 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 c5055c405..6cd50640e 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 15421c3b3..f4b9da055 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 acc9e21d5..1923c6443 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 b9b530c11..36ef4fe21 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 e376de2a2..c62aac861 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 740ee8e81..2ab98c8e5 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 831b36949..5ffe992b0 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 c48d45e9f..c81f68a32 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 9a21ced05..50b09dffb 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 fbd67b079..241003d8c 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 7ed4fa765..965f06686 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 2f69fd2eb..59090ffb0 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 ade3530e5..d8c536c99 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 9b122d38a..1dd92c92f 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 dce5b9aab..46bb88d9e 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 478ac4593..41d3e52f8 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 0c082a636..be9991c0d 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 c297d774b..9e5b49941 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 874e708e4..c8eace317 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 c332c8633..574036d78 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 71ae8a77e..ff346088c 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 2ecd6ecc8..9115ab865 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 a9c3b7be1..7852e8968 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 041c26845..bed705feb 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 7b49e5c64..379752e78 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 be96ea51f..00099d7ef 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 9aac32ee6..7dcec8919 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 8ed545557..58a8c53a6 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 75ad6faa4..9a7565120 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 1ea3466a8..7ba87e000 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 738eec59e..b32669241 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 1c1d04960..94d667e19 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 b7efbcb81..f75bf545a 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 5c272ae24..7d4539018 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 8e4036290..3d29e488a 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 b0200e8af..f0417eb17 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 b875aaa73..050922ec3 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 d0a9baaf4..24c5cedee 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 5f52c0d16..1e7bed4c3 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 f144d9a67..8eef789e3 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 a29fbf9c8..e844483bd 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 3480d440e..fd6632373 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 5ac72f37d..bf44014df 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 0f5b79ff2..b68c903c8 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 d94475561..91570fd93 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 b616361ed..5816ddacd 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 b151a5f8b..54cc2f35d 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 57bbedfb0..c5850eea1 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 024133500..fe6169592 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 f0a4cb04c..d1a6fe525 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 9191b465a..5f7b59963 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 9966d6e7c..1f27d108c 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 f2ada471e..463d2cceb 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 eb6afcc2d..2097ecc15 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 068d1dfb5..25f2b7b0d 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 5939b87a5..f4a635ff3 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 10d15ed6d..5ab133a19 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 b7f3ad45b..90d9d1a75 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 019f13be9..a8004040f 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 e1571204b..15a828632 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 93a4a8d02..032afc763 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 1f3a3c202..accde2823 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 42b2101c7..c27c79817 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 2bf312428..e507b8e7f 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 614b298c9..441031b2c 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 7ceef24dd..e47c4c8b4 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 c372791ae..b41812fce 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 2321132aa..6c2f128cf 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 b3695f8c6..5df2428b3 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 30e230d8e..5dec3c7f2 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 322846468..b4c37a2ad 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 27a5b72b0..805803a50 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 a2f21100e..c47b8faaa 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 972d2cc08..b0798cffe 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 aae2b2cd9..80c057353 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 2dc3c9079..aee0337d9 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 89903ede2..0f76c20b9 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 f161adbf0..3abaddef9 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 ce11bc047..f1cf7ca90 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 fed8be7b3..611173bfa 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 2ce772d25..fbaf1f4a1 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 6c308a261..155b49494 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 b85c383f0..1cc4671c9 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 3aaeb6fc5..d35411172 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 573740a78..a97027775 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 41f924349..27b45e7e6 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 9addd1610..f3f5d84ad 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 826c148ab..6abbe4489 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 39ed75236..8548ca81d 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 b9e0d7469..b0e1bb1ef 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 09ca77b7a..d09d9da98 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 04d195cc1..779f889a3 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 eb41a4abe..3c33ea200 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 1bfb4d200..ab3544fec 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 26c37475d..13df2c419 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 73d02e1d0..903c0d43d 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 05e6e2e27..1e3bb6fd4 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 7708a7668..10f9638b9 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 aa4ae5098..e3bb6b30a 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 8bbea2c88..b42e354c3 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 24ebec53e..3fedb05dd 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 156cf899f..3b3650953 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 f9db5b7a3..67ccb3866 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 e8a38ba5d..93253ab96 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 35b66ae3f..1cbe96a48 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 f61286b58..1f2f5583c 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 082a9529b..455bda829 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 770387386..add6e51af 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 70fcb952e..bb319136e 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 aa2938a5e..a3fb1993a 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 3d8208a68..c88314921 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 e52770666..fb0c27658 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 11abb6704..c032b6b1b 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 a73a57943..642c4bbcf 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 2e4cb9d6a..cd4b14460 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 e50b1d0a6..bf7b15850 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 e52fe724e..efac9837d 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 44833b5a5..97e4451e6 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 7e69d9055..ed813c167 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 d85693509..a68ef4c45 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 e5dd9ba02..728f58078 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 0fe70134d..188cabd68 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 e715a7669..db6a01266 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 f719ff227..a3ce17c75 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 0b93e2757..0e0c83691 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 6e1d22cfd..bc4c93176 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 b1bb590de..6fa4dae84 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 78c944901..c93d52b0e 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 898f2354b..80a0a875b 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 51fcd59fd..7d410b878 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 44fae80d8..b91237ac7 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 cc6e47291..063bb124c 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 8f1941503..2eb94f072 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 cf1147330..13c33095c 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 c8cd12e6f..923398e8a 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 9edf56d38..cca6c65a8 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 c5f60cabb..330885e1a 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 28f7232b7..73bd2dc19 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 fb5447eb9..f0c7750f1 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 e00ea9dda..f002d7ca5 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 3a88496c1..c15576136 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 070b540a7..35e4cc6aa 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 952ebca27..964dd310a 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 852539d27..136bd759f 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 10888a968..b36900efb 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 e19528737..bab7e2f6a 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 c49cd1ed2..048ca61b2 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 77d6b8753..ae49e3f4f 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 85ec92dda..c423bc88a 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 9d944f22b..e070a98cf 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 176aeb610..a06afe84d 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 647b8fab9..58d7beaea 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 bef994a9a..2a7b62311 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 90640b6cb..98321c75c 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 c1396296e..2f5900cf4 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 5f1736db0..043017a16 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 2923f8173..eb8a0bb2b 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 c03970153..7e167415e 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 f3644f680..33f451e4c 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 0b9d741da..9471abad0 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 fc0a2e924..fec71e876 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 774d8cba5..3fb86ae95 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 93fd91ab9..9ce7bfbbd 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 769abf150..bdc408753 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 33400d258..1ad5a562c 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 b83546d05..a36fb7f82 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 51246c61b..18b827022 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 89496ea9e..31cd69f71 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 d36d67007..ea0d9adde 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 9fd50683a..649eb89a3 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 795709abc..b6bf9c8e3 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 b6529f78e..1ad66dfee 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 878c71882..aa62256af 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 4bbd23848..f6e2c743d 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 ec6732bbd..a798809b7 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 f2d87b047..51096853d 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 0917cc7a2..63489f218 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 2782a8a35..df340e499 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 c0b0e662a..4c90dbebe 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 5fa22f85f..f985e7353 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 4ac7723a4..7f845ad76 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 81099c4a9..7bfe905d4 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 bd47153dd..d3ae48b77 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 6e81e8530..ef0562a6f 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 02a686dcb..a38762291 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 ffa986f25..00013704f 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 b685577ef..8861088d2 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 d13ff3509..b60c943b9 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 a44ab6a20..286b2968c 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 25b45ebee..f4ce6615b 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 7768037bc..7d1e12e69 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 c8e93b81e..7c5391b47 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 11780da56..ec3078ab7 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 94d58a708..9a2411e8e 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 60e0aa682..e8e84d8b3 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 822753de6..507065ce0 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 15d46ca4f..cfc602f01 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 d59bdf35d..443044083 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 a1799e34e..4d1f661d4 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 7c405ff3a..3ef8024c8 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 a3124cc2c..91811276b 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 88782ebcc..8a706f0e7 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 0f03ebaeb..534189ad4 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 5f332d1ec..d81471a84 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 23e3d1479..a812d1517 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 9f0777709..65475fa38 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 416a87812..2e3a33b8b 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 38d22ba0a..28f57fec8 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 06868f3d4..87c104727 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 1090d430a..13af211c9 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 4aa038c13..a21768ddc 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 9a3b6b52c..15ff96074 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 b2b247054..161c576c5 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 67937d1ed..0ac88592d 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 463737bf1..ab3f58b1f 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 e3edcc708..b464a958b 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 1b0ea9081..8d7099e03 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 0c926193e..f97cc61a8 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 578b815f0..d25c05b22 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 d17d82c7b..813583947 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 13ffb8689..95210699b 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 88c2a0625..af44c7930 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 dab3c3aaf..471862e0d 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 17ebe35a3..baf0c4be8 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 f18908015..feabae170 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 ba9523ea1..9cabfae4b 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 57aba7ef4..a994f95d6 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 9f9836d8c..de0375d04 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 69db1cec8..d33c68457 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 4e447b5ed..888edcb7e 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 e5491da60..12faf03ac 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 db90d2c5c..1378500c8 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 d2ba4e1fe..10e17c25e 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 b60dc50e1..f120c0ede 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 8bc4b0c70..ef17b85a4 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 5d894057d..358301a99 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 6442b0987..f4a61c18d 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 a478decbd..0327a2802 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 7d6e26f31..a3ba2239e 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 d9f395ee6..0883a1a16 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 fd6130341..48395631e 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 b7254916c..823d91cf5 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 165007682..79ddc9644 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 550482c28..c59df5152 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 db61c5fc6..666be664c 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 d88591f28..dd2e7e41a 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 cea910924..9fbe8b79a 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 e0ad35020..e7e6b079a 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 46a01520f..30ebf5618 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 daa02ae1f..04690f57c 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 afe014087..4c3b865a1 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 295e0d548..bcf450f10 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 2979c3f37..f5051ca72 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 df3b42f17..92c579887 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 032431b2a..51391a667 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 1a5725817..a7615aa08 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 1f577fd5f..55599b93d 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 09e5e1399..c6fb6852d 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 982f4d8a3..4ce676d7e 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 new file mode 100644 index 000000000..bdaf5e2ca Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/3_332.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_34.png b/TMessagesProj/src/main/assets/emoji/3_34.png index 1d2859f75..79522c6da 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 0eb0be04b..5cab6fad4 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 09f97a150..7015da5fb 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 2e2a98131..4bc914ff4 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 6bcaffa0d..dae5ed3de 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 67b43b977..25e179fc1 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 7c9eeed47..615dadeb8 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 751b46b19..10a67a9c1 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 5643bd8e0..c7db3ed34 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 a8cb6b3c9..978858ff0 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 f1d9e0fff..569889fa0 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 ffc32f642..37b34a98a 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 daa4227e8..fc98d32c2 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 f8e8fc070..7532e8888 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 a338c221b..5588c1b89 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 06ee93341..c72382144 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 196c65eec..c68c4b78b 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 76ffaba9b..33013f23a 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 79bff2276..88b4494b0 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 32e98ddbc..626dcaa4f 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 2c1c1116b..2bfcaf60a 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 67122281b..71eb880f7 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 f83096994..5b08bbeb7 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 114176665..3fc1c460d 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 828ef5c52..44e4fd3f8 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 a9311617f..55ede5c3e 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 3804a72f1..f898f527c 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 f3c1f6e4b..82fc79539 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 5b2785cba..791e0b88f 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 96da966fc..b70d9cc78 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 adafa17ca..8a3dd3115 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 dd59bd3d1..139adcc38 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 f3eb0dd35..45ed72ec8 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 97d1b1215..d3b7a86a8 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 04e65ee6f..b75985620 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 9507218db..83697c3e4 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 669757753..79d9765be 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 699bd59b3..f708831f2 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 712f9c563..e5b601973 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 5eb00901e..a99879726 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 37d776572..1f9bf9167 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 4c247306b..38ffed7cd 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 803406d3d..a549f3f75 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 d6c8722c5..5daa31f30 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 9487c65e7..d1860b745 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 3daccde5e..5e371433e 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 42714f784..e93f8c7a6 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 fc93c8d29..fcbc13a5a 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 c11c5b9f3..5ec1164f4 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 ae7a5c9dc..0b5dfe457 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 dff9daf29..0c56d9a05 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 56e2adb4d..d74f8b2cc 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 846928de6..8acb1a7d1 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 6f3f02d3f..e0818583f 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 56fbe9841..87c930e12 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 8407cd90c..7d442fd75 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 65ae55aba..84c3ba157 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 fb4a58936..46cdedbcd 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 d969dd3ad..1d6fdbc86 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 ae99f328b..2fe9c99de 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 536ce9740..aa7f1d364 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 353e5153a..c68ca4112 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 248835a1f..652cbde3f 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 9dce485ea..1a8066a9d 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 f87b5b385..19ef18f5a 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 9edd8b6b5..6e2f237a7 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 0b87a98b7..3fce65ddf 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 feed479fc..2c223bda9 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 7b65dd0c5..6a57e2af1 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 631f03eeb..b6895ea10 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 f211544db..d7022e704 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 3bc8f91ae..4860bfd06 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 395e35d96..8841fac2d 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 86053b5ae..d216ac180 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 dd9e6aa52..20db138a4 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 ebc152786..b13a82e94 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 fc8bdae14..5b3da22c2 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 28b043c23..b62c86fbf 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 d078deb6d..42dc37918 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 50531def4..92ec11dc6 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 507a47e20..4a4ba593c 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 a0b2e79f4..42c36f7e2 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 dac4348b4..d15f3216f 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 94d6fea9e..c7553d168 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 8af982643..169dabff6 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 f6c1b6e2e..442d9ebab 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 a1a990c53..a063abdea 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 c572923d1..8ad538cbb 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 93a0a9c16..46521e135 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 9056b7979..0abe5fda7 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 528ae1adf..43115aa24 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 e1db2d65c..ba71f433b 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 37cb64389..9de3c7516 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 7e0c173c4..fc0757733 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 2a758d94a..440b09f55 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 af7e49006..9c05090b9 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 b311071c1..7c6310a66 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 be252d720..3c1aa14d7 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 4f294b007..18fdf7ed2 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 1b7181d90..c6fb635d4 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 5316207a3..59efd45df 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 33c1ad4f2..244ab9fc8 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 9066757dd..4ae5a199b 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 c304daecc..b002a4053 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 e83e02797..4723db21d 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 new file mode 100644 index 000000000..7cfb2ad84 Binary files /dev/null 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 new file mode 100644 index 000000000..847f7ea59 Binary files /dev/null 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 1e6d8f623..c99a5fb19 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 new file mode 100644 index 000000000..a2babfb77 Binary files /dev/null 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 dacf3da62..ffed5c67f 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 0d192ef15..36a3532fd 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 3c58f9f8b..ed1e3b522 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 5156ef431..df24889bc 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 373f86fce..6dbc7d5ec 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 e28894101..0eadca53d 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 622abf87d..8b71778d7 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 2be4d9ff6..bc9b124b6 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 874c08a44..6effbc0d2 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 02bc2ebf5..f2b8da632 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 07003e277..22485e71d 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 6e9eddf78..ae706b81e 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 b470881f7..531431ea0 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 c0b5b8d84..13f07496d 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 3f553d1b2..1bb2cf7e4 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 77bf5de3d..031b5ad90 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 b52d8e6b2..0eaaeb5dd 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 c3aced887..ddc722b7c 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 166c92abe..e54d808c4 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 3cd71211f..65b66f8c1 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 d98cdb2c8..1bf2dfde1 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 bfdfc3a06..5b1a7aaa2 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 02264fcdb..95d6959c5 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 ea475ff65..7fa6bd254 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 d7d5cd27a..a742d6963 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 a343fc91a..37f9221a8 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 1d80d40b6..6643a445c 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 bcb38f68e..df9d8c94e 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 a80e5871c..4e1f965ec 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 2aa50fa74..f2a1dc21c 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 7b6a9a74b..e2e8ad930 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 ebe56cf1f..b4ac6a25c 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 f22c1637f..f2064deec 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 78a559d4f..3d8cd97c8 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 98649ab1b..a8f82adeb 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 54ffd5277..01ac54832 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 ec0ae3cf9..eb5c693f7 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 423d6f656..477522b1e 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 399983846..9b7903106 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 2c9d9d7aa..dfe642ebe 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 0862a030d..5dbe12016 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 a71df987e..20d424137 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 3c99747c0..8906425b3 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 75b970e42..d67bf399f 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 bad492b35..45a4f9f9a 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 e98685fed..c1ce55d87 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 74a80c378..bf8089162 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 fc3cef513..c59eb863d 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 d67b61191..6db4cb93d 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 092973417..427c5d006 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 764c89155..68d72ecb3 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 4773695b0..40cc1bd40 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 2b4297b54..e33f1cee8 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 b06773dac..25461344e 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 7a776b3e8..f35fcc382 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 48390d9e4..99b1c944e 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 56ebbe674..6f4387f69 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 77d740074..6178a9e5c 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 1061c6052..6d747ba03 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 81854deaf..47c540e15 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 303877019..08191c749 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 ef46e7c84..917e65b3c 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 83259a221..f2f60304e 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 61a8ac180..c528946aa 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 0dd7eb365..127602f3a 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 5355b7952..4e176eea1 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 f54d3ee7a..40afd24f6 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 3be474dab..4388dede6 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 ffe0e7053..d6f1d63e9 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 37631cb96..abe3755f4 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 67e26f2da..709d6d28e 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 9ea7947e4..891825f80 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 ed6b7fa25..3be3979f4 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 6d36cac64..3d6da1bea 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 b6e8bf238..521bc106b 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 c57bd2bff..abd96ed2f 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 15b1f57be..c99965210 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 7fd7adf45..3c508f72e 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 9994bbb2d..d73efa944 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 97d9d611d..d2d0eacef 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 de221cd79..669d0d364 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 aa0bd735e..8a23ec165 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 398574bee..8d77611b3 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 42b699d2a..1bcd0c5be 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 ae5e53666..6d0c194f5 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 db6687148..d70102c74 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 32756cec8..08d9a7856 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 468ef9804..d1bcd172f 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 8b03d10e2..d6a6fd773 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 70571645a..a557a049e 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 e3626dc81..c239dba5b 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 032668806..891da7a72 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 255dfeb86..6c1de12db 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 72467a642..c3652e5fc 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 73a8a8972..e9656b089 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 d24aa72fa..0dc63a957 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 48e26efe0..1462c6aec 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 0ab05b7e5..2c9ba42e5 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 0e4a32e01..ce08169a6 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 cb6463fee..53313301d 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 c8a4b5981..a639683d9 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 6513cfa34..77e5d9896 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 0d479a649..c30e4f3cb 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 59606994a..731b56250 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 0f448a7d7..6c9591535 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 272987a66..d6fe12666 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 e20c6640f..d8f70fd4e 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 4983da827..12408ccd6 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 402f3b935..043ccb374 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 de0e6a6b6..55e90b09a 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 139b5b94d..6f66997ab 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 b818d685c..e6e4a05b3 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 1d703a027..05ee35d71 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 52e730df1..6721be966 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 4413a5ddb..dcfb50c9f 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 e0960cd54..7ed6d8e02 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 841c6905d..57690853a 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 dc85a26bc..a9bbc54e2 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 19c6bd586..c59bab347 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 f6ab47f5e..7d3f23c62 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 42321a4b4..954dc668e 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 1aac3a666..f7b36044b 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 e7194a563..2640a9438 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 d2eb1d5df..506a4450c 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 a30a655dc..beff34f12 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 0ecd7e34e..03ef74302 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 d75f4d776..78f0b87c8 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 dd58c1271..4564656d0 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 e605642c4..7e5858ce4 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 3d8513df2..dc3626817 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 562b3f744..7abc91093 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 541f4db43..236c1f0bc 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 61501e340..940339654 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 89a47b496..fdc61eb46 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 4d1f17eea..23d87fc99 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 6478b69cb..3b6828fde 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 faad2f037..7dc2f7aa5 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 6df113dee..3eceec7cb 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 c971e67e3..fb4f2eb6e 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 9f2c86c7a..edd198c4a 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 d7aea63c3..a369ab00a 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 0e94f2f7e..b7393eb54 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 df085a0e1..823991622 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 e4c2ca5fc..449b9b22c 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 3b1bda822..66ac62f3f 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 b6405a38d..e4e37383f 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 93a42f5df..fdd5ae488 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 65273de1c..f103d6758 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 1ec1f7aa1..76a41935e 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 131dd7d86..792072486 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 0562979b8..1fa51ae0e 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 b8560e41e..4f7bd140f 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 838349bc2..9843e879a 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 2943ce173..17fcc1cd2 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 1cbe5b2f7..7e038adde 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 21206fefe..2406e4ce6 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 a14b9ff58..da8f972dd 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 624e70d8a..f9ac3b136 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 050476e52..9a7815ffb 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 cfab416c0..ce064ddbf 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 eaa56dd4c..396f9d637 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 486da8abb..a6f22b503 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 f49d0a055..2137f2acd 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 a87461bfc..1dd2a4dcf 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 89ffdc8b9..2f2fc2c4d 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 25bde55f5..c410c1c87 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 291f3950d..39669e002 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 ba05c88bc..e0331036b 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 fd8a44083..a341edb98 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 32de172b8..23d886ce1 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 91f876d0e..2ad2fee93 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 4dceb0c82..bd7c61cd5 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 d30819d49..5d607398e 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 f33c94ca7..f35f465f2 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 ace591893..aafe85471 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 50840fb6f..2c4d5100b 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 ab038bb41..68a0628d9 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 2e0755f73..57a13e6f9 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 476490513..dfc7f1896 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 367e12310..d7b27d43a 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 3ec79ed71..7e679ec75 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 fe828695a..eb98c38d0 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 fcf96d016..b975a392c 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 d230c8e1a..48713ba53 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 ed05e8494..7c4fde54f 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 3a442300a..c435dd2af 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 9b84769cf..77ed4cfd4 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 551c74212..53d96f1a6 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 2df814e41..d09426de1 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 0654ac829..207e7eb18 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 0e24a8351..95fbe6353 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 e185b9efa..70635d768 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 8288d017c..ebaca94be 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 a5bd0d26c..b67d2806d 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 12291fd27..93b8a0926 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 c73a3e361..a2fe254da 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 42f245665..0638061bf 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 64bab8947..2af90a054 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 7411d5159..c6da06c75 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 965c300f9..3efd65589 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 698234aef..7dadb993c 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 e5e5cf424..7dd926976 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 d0a02cf81..84996d5dc 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 637419a5c..f959355e0 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 7e8387b1f..ef44ceb17 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 59ba42b27..c7029a2fc 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 cbc4cf50c..b16a2f704 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 9ab505e43..7f1d4973f 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 5dc7f45eb..bb774e928 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 d12313675..17074d1ab 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 4c9a102a0..e09cef822 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 ad0e9e83c..59c5b7d57 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 131a604d4..6f8cf5298 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 185d671e1..9fadb5503 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 d0ebba90c..0076d494e 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 14a20be4c..8d8220c8e 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 0731e224a..06711e305 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 2128fbd71..317be1822 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 b50e56b78..89eb850be 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 fd7b00d55..b5aba0db8 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 afbbd8257..fe0895513 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 1c3b9b7c8..e1d6fc8bc 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 fe41b0304..09ac6e7eb 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 0543aabf5..ae84c6d9e 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 514966dea..3c54ad729 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 623c35c11..47c3f5e55 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 e758ffa17..eae67af94 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 a7ce73e3c..ca588dac4 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 28f5ecafc..9576268b3 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 b6e774202..bc3c5e38b 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 29c342c91..3778a4adc 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 da128a5f5..514bbf38d 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 new file mode 100644 index 000000000..6dacd05ff Binary files /dev/null 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 new file mode 100644 index 000000000..92aeecec3 Binary files /dev/null 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 new file mode 100644 index 000000000..0ad36a7d6 Binary files /dev/null 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 new file mode 100644 index 000000000..306d7c872 Binary files /dev/null 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 new file mode 100644 index 000000000..892fd2fdd Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/5_226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_23.png b/TMessagesProj/src/main/assets/emoji/5_23.png index 073e8c819..560c5854a 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 25679ee7a..16af102cd 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 561fd336e..060fea4f8 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 15822b6cf..9464b214a 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 79ec8403e..b4c70adcc 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 0491535c8..2c54d10de 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 100004b29..abe32edd1 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 26c8debf5..63b1c677a 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 aa93c5f43..88fa2cff3 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 49ba72aca..1f1f41f0e 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 1f4ad670d..2bad8eed3 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 3a85beeda..eb879295b 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 8c2de1faf..483656e7a 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 d836688ae..9bb48b4a3 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 87133671c..57918432e 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 254605ab7..e2ac7b152 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 72aa51c39..7b6d0af49 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 0c54c51c8..b43bd8dd7 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 64458bce5..fab4c6ec2 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 b4721aeb4..1e10d0e2a 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 aaf52be31..472a1a2b1 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 e4ea8872e..6f8b7c779 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 261d81c4f..c76f44c26 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 9feb5ad0e..1a3b29f72 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 1dd8b36f8..31d1fe678 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 41c55f968..48ea4c2b6 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 341a60b73..4654eae35 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 9099d0366..d8459a615 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 f7f249ad5..589686a8a 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 d2d21a887..0b73cd018 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 fd02b56d8..421d3a8d5 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 7df3d1789..43a838b7b 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 4567d9ae6..968ff6a05 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 2909d6295..45c95b5d8 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 c9c93232f..010a0699d 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 9c8f8673f..0a5b8b0f4 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 9e4e12361..dd91f181b 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 304473e42..f6e63bc64 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 27561d363..64a71f072 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 d7973f017..4f19246b3 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 fe5866575..516234981 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 2a52f4117..97c270212 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 485a76a31..c98a9f216 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 551366d2b..96465ca4a 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 10a66baa5..98dfeb626 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 5825c7412..9462f8704 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 d9788f537..29f24073c 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 3a5961f16..b8352be5c 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 2c1984bd5..1c39cb400 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 905320c1c..1aa66cb94 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 21f265c18..65c561057 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 a1ac929b3..d8a1bd046 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 bd68623d3..6fa47576c 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 129b2d10a..2174aa0d4 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 f271b91c7..f28157deb 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 532394c2e..ea30c0a8e 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 c4d4d5e7b..6351c7116 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 3629d871d..35c5a0c92 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 6969e701f..717daa028 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 188ed1cc1..aaf89c24a 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 0febb1e2b..bda625f6e 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 a897f71ce..4f1835b10 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 d7490206e..b3e172b67 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 e2eb0f1e5..601a5fe47 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 57ac51345..95bf73e3a 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 246e1dfd5..2da6b73f9 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 aecb05a10..58a0b6597 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 63c552fa1..f35276cf6 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 d6496c3db..1fc5b7e06 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 03f1bd61e..dad87233d 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 728cdb922..9296679d2 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 8184ac51f..88f2c0783 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 44d9ad344..e595b6e80 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 a82b12be1..af855d579 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 da64ec566..cc2c9c0f3 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 5e5b637ce..e2433c3d5 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 6b6b2576c..176833dbd 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 c024102a2..8ea63809a 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 c833ebd1d..6514008e3 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 dad843def..1b575c741 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 40c66a59d..0d03334e0 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 fa72006dd..2f59a8864 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 71df573ca..df3f6242a 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 f7a6fa477..b2f95b34c 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 244b39824..6e9fbf2d2 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 1cb9725ad..bdf62f778 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 4fda67bea..098b846cc 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 1fe23d851..ddbe6bbd5 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 4252a24eb..41e6ac372 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 d80c45cff..52dd4f8b8 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 657f285d3..7e56e2cd8 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 f5c0fc0d3..19b4e8824 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 c29996e64..8f681590a 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 f3957df65..bf946bd6a 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 11688b0f1..89fcbc28a 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 dd9a76f3f..d08117094 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 fcbc8b779..42e662c83 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 b53708f0f..846e5fe2a 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 1229ce1fc..5f3145d76 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 b855789c7..3450dd7e0 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 8856dfa24..ebfd3e1f3 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 76a2d3b60..ab359890c 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 e4d94e9b4..8c52a0a3b 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 b2fb27921..145fce3f9 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 26fb2ffb7..7d94323cd 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 234e16f7a..c16c14b1a 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 bd85d4c55..75548f0bd 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 a434f3f00..75fee60cd 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 4318a27fa..34680bec9 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 876f9106a..229c65c1c 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 a244e889c..7433f574f 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 973d87279..4e4eda3c4 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 71cba0f3c..92b81d166 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 83c5fd373..f4e17f043 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 66017c6b7..8ca7c0425 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 1ef2bf99d..faa2e9bcc 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 7d2e5ce76..302e327da 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 fdafae60d..000172240 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 b6cd21e39..6e50e39d5 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 7248f31a0..d507ce679 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 4f01d6457..d5c7f9b20 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 02534e59c..f1dfd73fa 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 dddf3c807..fbcb8e307 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 63a98d37a..4f7665533 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 47df52507..bf774beed 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 a431e6361..d0b120f3c 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 0a4fb3682..a1dc4bdb2 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 e4a5ce8f0..f6e6a6dfa 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 028e9f71a..219b5055d 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 4b885fccb..73719d2b3 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 c2ae7bd44..a90ac21e8 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 176ea27f2..5ab568ca5 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 1dddeaa25..eacf8f969 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 b06ecbe39..04d664923 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 9fb828220..529909af2 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 f5768a3bd..3ba0909c9 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 02e492e9e..f3121e7ba 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 31a0065d7..8a7648bc7 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 3ffb3ce65..c484c0ffc 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 e48a70805..88aa20b0d 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 53d87bf87..3bac1ff46 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 10f827715..871d66927 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 7afee6683..af25bc67f 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 944405560..f68f99217 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 3929561ab..77fa04221 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 08df584df..c4b7155b0 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 268ce7a84..7c0f4a637 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 e8808125c..0dd06550a 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 e03cbca60..a8ca42283 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 bee5d649c..289e808b4 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 d21ac35e7..b2dd3620a 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 b9b9e5643..8750a5563 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 6763cdb21..d040ca38d 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 38f77c6e7..4ef46a752 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 8a7f00d2d..baa4d0d5c 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 caf7f5323..206c83118 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 c8d4600c7..10c8d43ad 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 2cdd6e63d..cc237d510 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 ce726b86f..f2de56b2a 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 5c671cbc6..868a322df 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 1c194166d..491d536ff 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 6ac2fda1c..75e47a0aa 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 041a5d81d..7690fa2f9 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 01ba0527f..6e34b985c 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 e5956b412..b88671cbd 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 417cfde35..eda5eeee3 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 ff7ba8ad2..d6a73fba5 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 cd7582055..dcb31dd5d 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 c611d1f25..ddeabd872 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 80aab6481..42f78478d 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 7f33184d6..e357d2e21 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 cc31b4422..dcb0ad45d 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 dc4451f75..fff419201 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 c729504cd..fcde2891e 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 3088a0600..5f8234681 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 4c00fcbef..352b3b9e3 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 956849844..fe3019946 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 915e0bd32..97be81c2b 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 8b8ad56d3..ed71a6c24 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 da557fb49..e0020314a 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 a0fb1f629..257111da8 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 3a6fd3623..a1b366742 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 b2db59db8..290bc319d 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 4363cec1b..7a9c8fd15 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 f041d9cf4..7a98001d7 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 9133964b8..81f2bf428 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 16a4f8d5e..df52284bf 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 f68a87beb..4ec14bf91 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 64cb5c9db..4621efc19 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 75d5d2216..1658e543e 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 2606df163..d79844833 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 fadfc63b2..68683c78d 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 b71ed7c75..549a1e478 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 9ec58588e..e8d48c35e 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 fb1aaebf5..4c332f0fc 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 e803e222b..aa779e10a 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 ad411cd67..80cb3e80f 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 a395ddc87..ac311abb0 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 78dfc7c2e..a0d2da249 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 23515cf39..78cf4aa47 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 f16f9caf3..2bdac2400 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 06ad98d5d..f15f65cb5 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 88c9a02b4..e73b55658 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 6b6884f1e..91a044be7 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 d5095be66..5c8856340 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 13a0fce75..31e190bc6 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 6b9f05b0e..d7054bd45 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 9afcc45e8..7a11c9007 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 893247043..304cc0b39 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 e829868be..f102de35b 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 6d5f38d83..71b7df6aa 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 cadbfac64..f9555e0f9 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 b7de49daa..92f068a99 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 60eba1401..22563eeb6 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 55f6b859a..af641b864 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 38255a787..0a8446513 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 193b3cf36..007e80cf8 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 388a8bc96..913fbbf0c 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 919078ddc..a85107a0e 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 e3bcf690f..5d8ec977a 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 22f8310cc..5caad2847 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 0f432e98d..9a7dda189 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 6ccf10ba3..513d628dd 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 bcb23c2ac..31e1ee981 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 9741e93f1..7c3ef5e61 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 a113346d4..0d60984a6 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 75073c39d..524659b9c 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 d29824b3a..8aff9657d 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 8dc30ad34..337d823ce 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 7dc541512..01c6804b1 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 a9b974be6..f4b8e1a66 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 4b520fa7b..32669d89d 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 6eddf4a54..814ab9526 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 84b25955d..bbb135e28 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 8d069a451..c88f0d19a 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 d6a84c711..469af98f3 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 201d664aa..d64901d34 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 cad720e40..e9693a1be 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 b40fa7f86..2b81b712f 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 527f17eb0..159f4d62a 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 0a8820f2d..6603795fc 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 530888b22..65a9e1613 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 96d4a0dce..cc681e406 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 f836e792b..046890c51 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 1167b60b6..c95cbbf64 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 f16afc07d..f08b9664e 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 1e958109e..3e2bc4a2a 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 2c09c66b6..5f6d6b5ac 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 bd4fcbb93..093c301f5 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 a234ad1c9..59deb5037 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 9831c8334..2a9245ebc 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 d90334be1..06d69e270 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 ca81d549a..b6cbc75d2 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 f819201d0..a014d3af9 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 5b213de51..0279839b2 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 ba7f6fa3f..4a3d77ab3 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 791b97d20..f797911a5 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 ec5413299..7c07d178f 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 4f4839002..8f15807bf 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 af60daa03..51d9e8956 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 36cbf2472..5b78fb47e 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 2a2b1b3b2..5c59f1829 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 b662f1126..decc12804 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 4e5b96531..09d48e582 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 bbfc3048e..8db03cf33 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 fa1d1c9df..d13e6eeaf 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 849e0b6be..7929e27c1 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 1fe4d2d53..e98817c75 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 ab50e06a9..023fde92d 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 2e656e8c0..5dc0b06ad 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 90974456e..e036f6dee 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 131e42407..eb1a41930 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 b4bd89b32..c1efe20a4 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 1bfd6b4cf..0169b7d89 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 fab287828..b315347dd 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 0bb3e03cb..a6fc1ed72 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 923d94844..8d942343e 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 fce48bfe8..739f7e2ce 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 5a740aa23..9aceba378 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 23d595b3e..79bf4db94 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 0a6ff2cc8..aecd5e2a9 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 8d0da813d..ba923e708 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 f0cc7958e..078915ce6 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 a41a12c8d..59fb8e2dc 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 51250758f..7d1960d84 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 95ec238ce..43e0b502a 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 d01d2e0b6..8aa5057d5 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 3a9094ae7..da51ae5ca 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 c526ea469..3103e2942 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 9d244e0a1..03eddd03c 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 9a16d7651..6e1ad05df 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 f90597378..4c583d607 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 ee67636cb..64f923f5b 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 5422644d8..79c86acdc 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 d1825ffaf..64b481d4d 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 b1bd2301c..ea8c44f88 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 bbde42b2f..abaaa1499 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 111757abf..05c605098 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 13e389245..080843c94 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 new file mode 100644 index 000000000..eb38d115f Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/6_292.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_3.png b/TMessagesProj/src/main/assets/emoji/6_3.png index a2f10d997..2b8a4ab5a 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 4acc76bf0..87750a214 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 084b6675f..1d34a6e7f 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 8888a5e75..1bec5efcf 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 33c137471..2243e5f7c 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 9b112212a..229dc2389 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 c5c31c3a0..de876b9a5 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 dd084c4b4..a195206b6 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 5f039a121..9937af781 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 9cc3ddab3..bd7fe19c0 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 373dd41d6..2a5b72013 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 f05b5a2cb..52e79bdef 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 10bfd588e..134d1df0e 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 10263424b..8fc587504 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 6c7fc2fd3..f3f54c49f 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 8ac18de91..4052bc01d 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 570614f33..50ed458e2 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 537baac20..77652b1db 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 c41b47cea..668bdf6c0 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 a1dd99af1..147b6d4c1 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 0d4d276c4..75d95c3be 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 86044b593..cc85d65d1 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 ddbf7c1a8..ba237042a 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 8e776f1a4..4f7870fb5 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 d3f5bba9a..57e20fad6 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 ff42d052a..119b67095 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 cd093b39b..180cf864f 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 d41053abf..943404983 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 dabacf764..fb68ff546 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 44cff0899..5dbc61d8a 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 23e1f0070..cd3cbef82 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 325203b92..27e6d66fe 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 daf44568a..6f181a20f 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 765870618..a9fd3ca1a 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 3c3bc6bee..7a003db93 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 f1fb3f99b..5012b8e5a 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 afdd69243..12457e5b4 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 fe1c9d5cd..9b6b3991d 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 0ad41d343..868730c12 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 c3021c799..f0494d483 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 81d11c9ea..e1fa3450b 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 1a527270c..b27ff8130 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 54c918fe4..d2cec6004 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 f3f7581a9..6a84e32b3 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 db7a715c0..3623001dc 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 ac5acad6e..efd5fc561 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 302e0aba3..dc6bec03e 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 b8f8fc56b..d7c1dd58f 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 cfd1a30ec..97a2fba62 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 1c143fce7..4be767676 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 eef687b76..f64af9798 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 3686d9ee8..803a4e6c8 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 7e8dee856..f05705566 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 a3769d604..93d9728e5 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 8bca3fbbf..2c9634510 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 52d17cb4c..b66f1c85f 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 1828670b4..8aeda3922 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 05a3fde76..c868b936e 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 add25920d..45d19af81 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 75782cdd7..00a77c739 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 abe851f02..5f45d7269 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 fe8d15506..e13c43537 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 a5884b1ad..6d068ffd3 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 115394f44..da8d4aad6 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 bb283ee00..e02217cc3 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 a3afb1cf6..ed74d9dd0 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 d6918dad9..f8f21bbc5 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 9550ddadf..3ec5c7575 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 2af0f6f90..8be7e8f2a 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 177f82a3f..c61f5773c 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 ed50d1bf8..50021e82f 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 9ccd06b15..d38fad6a5 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 21b7cb8a8..f3ab8f688 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 c5f1a6ee0..18ae9c194 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 375b72bc8..b4ad88a2d 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 1b955eaf2..91e86aff3 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 00d97280f..c88b8ed68 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 d833812ed..a48390fc2 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 f5c80e29b..dbcb52a63 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 e34edea3e..8600d3b3f 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 debfa0981..f2e352d0f 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 1180d3f9b..9af2f176a 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 8a685df77..a6f161466 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 be5e0a7ce..5359be529 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 13f536176..a6ce04e07 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 8e7d972ee..b0b5d0ef4 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 eb7dba973..55c5a1169 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 8bf23c26b..73e8f44a5 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 d08586b84..d8b58bf54 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 b6960f72e..520abba14 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 611b5238a..2a8766f64 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 a0f7716e3..3c3581e6f 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 b166bc255..9b7e5740c 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 fed4b2b4e..2d911cfa9 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 837e57ac8..5270bbe04 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 d7b4e8ed9..eba349619 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 2ee237fed..f4ad246f5 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 4c8c24fff..76ebb1157 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 6d21a6fb5..438dd1b1f 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 9927e9eb9..7b10a7a85 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 2b55b27cc..444d766f2 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 980258b60..97214e379 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 15f757664..6f1cbb30a 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 772c7089d..1a9634357 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 d0f7b629b..db3803b51 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 a33aac457..d63d9077c 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 b5e8ac57a..b4fa427ff 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 54a679586..3308fc912 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 197f2ea6b..7f3fa8356 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 65e4b6142..484047ee0 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 f130790bd..29e7aa655 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 8e602c8ac..f8289fad9 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 7e897fef8..062cf729d 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 b9314f4f9..e4f317ef6 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 46c628b79..cbb63e5ef 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 e4f769dd2..43f4b3a81 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 1e654031b..5f3c5e979 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 41fd4779d..603194a9c 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 64b5559df..250be0990 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 2e6eb6404..dd5c8a05c 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 0f5523a97..fceef0f67 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 7a6b03af3..4b241980b 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 c6a822041..323e079d2 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 cc1e951bb..5df111131 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 cb823444b..84ecaaca0 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 fd9ff284e..11601dc84 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 67243c9d9..2d5792de5 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 76340e50d..b2c07bc51 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 48f5840fa..00b91cbc2 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 ea0dc831b..492dcb696 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 93d5b0f9e..0958c22ed 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 91f8ca421..f0449356d 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 86f2d6c1c..a9e70800d 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 60e4b2a53..3009e2d28 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 875cd83ba..4295eb3cb 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 54c10ecac..49cbf5444 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 c26fa0813..07a5de82e 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 541c154d9..b771d9cd1 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 b3b3e9263..7f5454068 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 7165e8afa..fb8eaffdc 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 e4800ce09..9db91a36e 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 6a6a65e4b..368ac9632 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 e0ffb5cde..137edebbe 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 378f19d0a..a9640f8b3 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 0d9c1311a..d9d410413 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 d3d3bdb1c..3347d9bb4 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 00c351eb5..71b59fe04 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 9822ebff6..7576fd3bf 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 077acf9e9..cff727b1d 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 3fd01b204..f57134924 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 2f691e66c..14524bb8b 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 a016ac3d6..28e765fd5 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 b6e7a5e28..98f5c462c 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 2f393fb5c..524e97163 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 1ba3bedfe..8affad092 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 2e715489c..0c71c0a30 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 593842142..8a98991a3 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 a6e8cfff3..a77eba2d4 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 131b679a8..de0d3484c 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 3f15a2431..9c3ff1d3e 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 6b79fe8e8..51dcf8e5f 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 64c17ae23..4d09102e0 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 eebe77ddf..64a313d5f 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 48dd086d3..c73dd831b 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 8c24cd8dd..164d7fbff 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 b3f91b6d4..8b8b74b8c 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 fb3c2e95b..f5cd8627c 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 1345abac0..a542f603e 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 6756ff12d..e3e820dda 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 605bc16ab..bbc4be279 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 c32c5f584..9053714e5 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 6544a6293..c1dffdda8 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 275328ae6..ac0592a63 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 e2117fb24..797d2951a 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 362b4b476..078ec6284 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 e01609cc0..553edb7ae 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 360798e8e..a90682790 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 7c9eb1d23..f9e2b6f01 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 69e392d55..4a0f248f3 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 7022fd604..94f7ae222 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 2002b0d1a..e7b7e3f61 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 914f8eee5..1bb46d43c 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 92dd718cd..b5526ad61 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 9faca53fa..430ced2be 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 17403f030..a05d2dde6 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 1eb32840b..b0a7f7dc0 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 1f5c94f20..f1690a503 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 9ac6e3fd5..d51c73885 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 07a307e49..ab785a0d2 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 866c35776..256f1712f 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 a26c9097b..49ab12f93 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 40fec8d92..291ab0806 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 cb3183e0b..a27e239f3 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 0daa9a5e6..7e1371f6e 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 2286582dc..46e1ef853 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 8afefd9aa..2446b2d54 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 aade61b16..7eb89bbd6 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 4f193f9cc..1ddf0049d 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 85bbd728d..bad1e3774 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 d4a974562..539b3b99b 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 cf62676b0..e0c46ef55 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 e7a0a7611..3c028be5a 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 a4b5ff3e3..8ffb6367f 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 7d5548db8..6ffd88171 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 9044b285e..14a2b4215 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 916a2fe5c..f47c047d1 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 03320c292..f3fecb612 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 b2befe260..816688722 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 61b644958..cacee36e9 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 bc5bc4cb7..5adb35c55 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 53c199df6..f06d6ec15 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 3cca90cc5..4716667e2 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 e37591b11..ab68d2c76 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 b8774f88f..2f710f147 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 be392caf4..260fd3e6c 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 cd55e760c..c514425af 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 88b847490..613846852 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 cc4642b3b..a867f4d65 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 267699b75..c69c736fe 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 6028d6d81..635036ffe 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 15d33cbce..f3dfe551d 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 3c18ce470..963ed0a63 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 539b180f3..2de722d1b 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 aca0af134..ccb1ce064 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 9edf0ae81..419779276 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 076652b06..ec13e836d 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 ca53f1f24..da9eebf54 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 d1809f25a..f32bd4821 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 7073f10a3..d4dd941aa 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 0bf936e2f..7c1969105 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 b0987f8cd..1297a29c5 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 cf9c0e35a..b2b23d46d 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 082c841a6..74c8fd05c 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 dfab7dc3c..9bf93a4e2 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 cf00c762e..da6f2ec5a 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 f22aa9944..aeb128335 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 3dd62fe00..998b01553 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 4f22d04d2..c5cd05a36 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 e29f70dbf..e0aee11e3 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 4c9889fa2..b2824e492 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 b02e6624a..f80de6e61 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 2a26fec31..477140d6c 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 69edf34c5..f173b383a 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 3bd599eea..4b3043801 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 f871afaea..033e4aaf4 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 30bde5f29..d83d7f0c7 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 8fddb85af..b18ed451e 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 20c41a9ca..56bb8140e 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 fef01c201..4e7cf9f57 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 18924a4bc..3c81aad5c 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 d29efca35..16384aedb 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 677569019..669e22a67 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 b311c72d7..30fae24dc 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 8ab56cd6c..f6ca945ca 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 38f39dbe1..52e42486a 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 1dde63823..31e703513 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 d050f2880..949554e44 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 63a10c8c9..c9dc26940 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 5914a7025..9a8a0a6e6 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 e3ec332e8..f711a9a0b 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 84301a939..6e7e7c459 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 33951e8e9..489ba6b4c 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 1f0e86705..ec379195b 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 f07d03ada..83ba6fba6 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 3045004aa..9834b97fe 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 fb897fd06..fc782e899 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 23e8ad457..a576370f0 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 ea292af79..b15ac1de8 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 52312e4d0..ae4d506a0 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 a643423ac..fdb9e41d6 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 cb094245d..df40b9a8e 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 d6ae732e9..cb394146b 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 2fc4ad17a..cca34bcb4 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 96ea2bfb4..708dc82e6 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 814eeb414..7ca22918a 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 24827d916..df90b9d95 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 0083e9e20..915700213 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 36cc7d22a..bdf1cf1a6 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 db3229b46..2b98461b0 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 71d497649..3e758e42e 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 9904fb443..b6681b8ee 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 23c5d1710..256ac36a6 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 eeaf2daa3..91e331f1c 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 9d74c72e8..a8a50c31e 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 6ac1955ff..43aacdd3c 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 9754bd76f..76d85b299 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 f46a0e7bb..9a46ffdff 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 8f12311f9..3eba2b5ac 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 8a44c6861..572f908c3 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 44f501b70..1718eaa61 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 115502e5e..0d9e33e70 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 bca6f4995..358bbe0f4 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 c439d31c9..7c46e45b0 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 1117fdfa7..619482265 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 c40ffb92d..a59818017 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 f179f2442..214001b51 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 d08f0d1e0..5d73a08a7 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 f2b8de561..343a5ce11 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 e33ab840e..35e3cd662 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 1cd1621ab..2aecf487b 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 b8b0d0b79..400f8ff73 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 2d166ab99..7b1ddcbc0 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 73c3b4d2f..c274e6725 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 6bf3f3e49..fdb7b4221 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 1b8cc317e..f1f455339 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 63e792a8a..e7058bea1 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 fb43bd6ee..316872b30 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 cef85cb58..a7577114c 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 dcad6d8df..c0043d7aa 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 7cdf1c31d..c00325c40 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 d062d5402..384059b63 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 cf694758a..3cdd89516 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 ef2b0c9d6..91015f3fb 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 c255c83a5..edf0c25e5 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 02880dfe7..8ac5017b8 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 55aca888e..1feed4bff 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 c4b976370..e3c19282a 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 01983816f..dcfa3f70f 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 8a55b838a..bae98bda6 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 fee1f8ac3..d561b3b84 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 5be6822cb..7d33cc649 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 311cb8fd5..51029c1a3 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 f362b69f4..c3658dac5 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 b05eb8133..91ce89e96 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 c15e9e066..b1f526354 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 bd03e6adf..ad08e03f8 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 98383f0dd..530ac0442 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 87dd7308e..f1c1a9ce9 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 59c26bb47..e676c99b6 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 87e00b8a1..bdc89449a 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 52501f73f..5ab1bda3f 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 37e6b3283..eb4c9a304 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 189027904..504f81456 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 b7230b5cb..68c3e3d62 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 af69723db..0e55cbd47 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 7f82af68f..a3aea6af6 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/assets/night.attheme b/TMessagesProj/src/main/assets/night.attheme index cdaeaf07d..f52de5258 100644 --- a/TMessagesProj/src/main/assets/night.attheme +++ b/TMessagesProj/src/main/assets/night.attheme @@ -55,7 +55,7 @@ chats_menuPhoneCats=-8224126 chat_outPreviewLine=-6631937 dialogScrollGlow=-657931 chat_messagePanelHint=1694498815 -windowBackgroundGray=-16119286 +windowBackgroundGray=-16777216 chat_inViaBotNameText=-8796932 chat_outVoiceSeekbar=-10245406 player_actionBarTitle=-1 @@ -216,7 +216,7 @@ windowBackgroundWhiteBlueText=-10177041 avatar_nameInMessageCyan=-10623523 chat_inLocationBackground=-12829636 statisticChartHighlightColor=-2030043137 -radioBackground=-1635939431 +radioBackground=-10461088 profile_tabText=2030043135 contextProgressOuter1=-11555592 chat_inFileIcon=-14145496 @@ -232,7 +232,7 @@ chat_outVenueInfoText=-7023626 chat_outContactPhoneText=-7023626 chat_inAudioTitleText=-8796932 chat_messageLinkIn=-8796932 -chats_menuBackground=-15132390 +chats_menuBackground=-14408666 windowBackgroundCheckText=-1 chat_serviceBackground=-1774766281 chats_secretIcon=-9316522 @@ -401,7 +401,7 @@ statisticChartChevronColor=-9012091 chats_menuItemText=-184549377 chats_message=-8224126 chat_outReplyNameText=-6301185 -chats_menuTopBackgroundCats=-15658477 +chats_menuTopBackgroundCats=-15000805 chat_outReplyMediaMessageText=-7023626 chat_textSelectBackground=1516415459 chat_messagePanelVoiceDelete=-1 @@ -452,15 +452,15 @@ chat_sentError=-633010 player_progressBackground=-12829636 avatar_actionBarSelectorRed=-12758164 chat_inAudioDurationSelectedText=-7490861 -windowBackgroundWhiteGrayText2=1694367231 +windowBackgroundWhiteGrayText2=1862139391 chat_outAudioSeekbarSelected=-562182145 chat_outLoaderPhotoIconSelected=-1 player_actionBarTop=-14671840 windowBackgroundWhiteGrayText8=-8553091 windowBackgroundWhiteGrayText5=-8549479 windowBackgroundWhiteGrayText6=-8553091 -windowBackgroundWhiteGrayText3=-8553091 -windowBackgroundWhiteGrayText4=-10987432 +windowBackgroundWhiteGrayText3=-7960954 +windowBackgroundWhiteGrayText4=-9803158 chat_inTimeText=-8552575 dialogRadioBackground=-10855846 statisticChartRipple=748994002 @@ -502,4 +502,4 @@ chat_topPanelBackground=-15066597 chat_outSentClock=-6698513 dialogBackgroundGray=-14013910 chat_searchPanelText=-10767620 -chat_inContactIcon=-1 \ No newline at end of file +chat_inContactIcon=-1 diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java index 545f96120..095c5ebb8 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java @@ -215,6 +215,9 @@ public class DefaultItemAnimator extends SimpleItemAnimator { return true; } + protected float animateByScale(View view) { + return 0; // animates from (1f - animateByScale()) to 1f + } public void setDelayAnimations(boolean value) { delayAnimations = value; @@ -228,7 +231,13 @@ public class DefaultItemAnimator extends SimpleItemAnimator { // wanted to achieve an effect of next items covering current ((ViewGroup) view.getParent()).bringChildToFront(view); } - animation.setDuration(getRemoveDuration()).setStartDelay(getRemoveDelay()).alpha(0).setListener( + animation + .setDuration(getRemoveDuration()) + .setStartDelay(getRemoveDelay()) + .alpha(0) + .scaleX(1f - animateByScale(view)) + .scaleY(1f - animateByScale(view)) + .setListener( new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animator) { @@ -239,6 +248,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { public void onAnimationEnd(Animator animator) { animation.setListener(null); view.setAlpha(1); + if (animateByScale(view) > 0) { + view.setScaleX(1f); + view.setScaleY(1f); + } view.setTranslationX(0); view.setTranslationY(0); dispatchRemoveFinished(holder); @@ -252,6 +265,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { public boolean animateAdd(final RecyclerView.ViewHolder holder) { resetAnimation(holder); holder.itemView.setAlpha(0); + if (animateByScale(holder.itemView) > 0) { + holder.itemView.setScaleX(1f - animateByScale(holder.itemView)); + holder.itemView.setScaleY(1f - animateByScale(holder.itemView)); + } mPendingAdditions.add(holder); checkIsRunning(); return true; @@ -261,7 +278,12 @@ public class DefaultItemAnimator extends SimpleItemAnimator { final View view = holder.itemView; final ViewPropertyAnimator animation = view.animate(); mAddAnimations.add(holder); - animation.alpha(1).setDuration(getAddDuration()).setStartDelay(getAddDelay()) + animation + .alpha(1) + .scaleX(1f) + .scaleY(1f) + .setDuration(getAddDuration()) + .setStartDelay(getAddDelay()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animator) { @@ -271,6 +293,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { @Override public void onAnimationCancel(Animator animator) { view.setAlpha(1); + if (animateByScale(view) > 0) { + view.setScaleX(1f); + view.setScaleY(1f); + } } @Override @@ -391,6 +417,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { newHolder.itemView.setTranslationX(-deltaX); newHolder.itemView.setTranslationY(-deltaY); newHolder.itemView.setAlpha(0); + if (animateByScale(newHolder.itemView) > 0) { + newHolder.itemView.setScaleX(1f - animateByScale(newHolder.itemView)); + newHolder.itemView.setScaleY(1f - animateByScale(newHolder.itemView)); + } } mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY)); checkIsRunning(); @@ -407,45 +437,68 @@ public class DefaultItemAnimator extends SimpleItemAnimator { mChangeAnimations.add(changeInfo.oldHolder); oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX); oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY); - oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchChangeStarting(changeInfo.oldHolder, true); - } + oldViewAnim + .alpha(0); + if (animateByScale(view) > 0) { + oldViewAnim + .scaleX(1f - animateByScale(view)) + .scaleY(1f - animateByScale(view)); + } + oldViewAnim + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.oldHolder, true); + } - @Override - public void onAnimationEnd(Animator animator) { - oldViewAnim.setListener(null); - view.setAlpha(1); - view.setTranslationX(0); - view.setTranslationY(0); - dispatchChangeFinished(changeInfo.oldHolder, true); - mChangeAnimations.remove(changeInfo.oldHolder); - dispatchFinishedWhenDone(); - } - }).start(); + @Override + public void onAnimationEnd(Animator animator) { + oldViewAnim.setListener(null); + view.setAlpha(1); + if (animateByScale(view) > 0) { + view.setScaleX(1f); + view.setScaleY(1f); + } + view.setTranslationX(0); + view.setTranslationY(0); + dispatchChangeFinished(changeInfo.oldHolder, true); + mChangeAnimations.remove(changeInfo.oldHolder); + dispatchFinishedWhenDone(); + } + }).start(); } if (newView != null) { final ViewPropertyAnimator newViewAnimation = newView.animate(); mChangeAnimations.add(changeInfo.newHolder); - newViewAnimation.translationX(0).translationY(0).setDuration(getChangeAddDuration()) - .setStartDelay(getChangeDelay() + (getChangeDuration() - getChangeAddDuration())) - .alpha(1).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animator) { - dispatchChangeStarting(changeInfo.newHolder, false); + newViewAnimation + .translationX(0).translationY(0) + .setDuration(getChangeAddDuration()) + .setStartDelay(getChangeDelay() + (getChangeDuration() - getChangeAddDuration())) + .alpha(1); + if (animateByScale(newView) > 0) { + newViewAnimation.scaleX(1f).scaleY(1f); + } + newViewAnimation + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.newHolder, false); + } + @Override + public void onAnimationEnd(Animator animator) { + newViewAnimation.setListener(null); + newView.setAlpha(1); + if (animateByScale(newView) > 0) { + newView.setScaleX(1f); + newView.setScaleY(1f); } - @Override - public void onAnimationEnd(Animator animator) { - newViewAnimation.setListener(null); - newView.setAlpha(1); - newView.setTranslationX(0); - newView.setTranslationY(0); - dispatchChangeFinished(changeInfo.newHolder, false); - mChangeAnimations.remove(changeInfo.newHolder); - dispatchFinishedWhenDone(); - } - }).start(); + newView.setTranslationX(0); + newView.setTranslationY(0); + dispatchChangeFinished(changeInfo.newHolder, false); + mChangeAnimations.remove(changeInfo.newHolder); + dispatchFinishedWhenDone(); + } + }).start(); } } @@ -479,6 +532,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { return false; } item.itemView.setAlpha(1); + if (animateByScale(item.itemView) > 0) { + item.itemView.setScaleX(1f); + item.itemView.setScaleY(1f); + } item.itemView.setTranslationX(0); item.itemView.setTranslationY(0); dispatchChangeFinished(item, oldItem); @@ -541,6 +598,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { ArrayList additions = mAdditionsList.get(i); if (additions.remove(item)) { view.setAlpha(1); + if (animateByScale(view) > 0) { + view.setScaleX(1f); + view.setScaleY(1f); + } dispatchAddFinished(item); if (additions.isEmpty()) { mAdditionsList.remove(i); @@ -653,6 +714,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { for (int i = count - 1; i >= 0; i--) { RecyclerView.ViewHolder item = mPendingAdditions.get(i); item.itemView.setAlpha(1); + if (animateByScale(item.itemView) > 0) { + item.itemView.setScaleX(1f); + item.itemView.setScaleY(1f); + } dispatchAddFinished(item); mPendingAdditions.remove(i); } @@ -690,6 +755,10 @@ public class DefaultItemAnimator extends SimpleItemAnimator { RecyclerView.ViewHolder item = additions.get(j); View view = item.itemView; view.setAlpha(1); + if (animateByScale(view) > 0) { + view.setScaleX(1f); + view.setScaleY(1f); + } dispatchAddFinished(item); additions.remove(j); if (additions.isEmpty()) { diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java index 7d43885f2..6e3401248 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java @@ -41,7 +41,7 @@ public class LinearSmoothScroller extends RecyclerView.SmoothScroller { private static final float MILLISECONDS_PER_INCH = 25f; - private static final int TARGET_SEEK_SCROLL_DISTANCE_PX = 10000; + protected static final int TARGET_SEEK_SCROLL_DISTANCE_PX = 10000; /** * Align child view's left or top with parent view's left or top @@ -76,7 +76,7 @@ public class LinearSmoothScroller extends RecyclerView.SmoothScroller { // Trigger a scroll to a further distance than TARGET_SEEK_SCROLL_DISTANCE_PX so that if target // view is not laid out until interim target position is reached, we can detect the case before // scrolling slows down and reschedule another interim target scroll - private static final float TARGET_SEEK_EXTRA_SCROLL_RATIO = 1.2f; + protected static final float TARGET_SEEK_EXTRA_SCROLL_RATIO = 1.2f; protected final LinearInterpolator mLinearInterpolator = new LinearInterpolator(); diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScrollerCustom.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScrollerCustom.java index 455b2ade1..f225f5f0d 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScrollerCustom.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearSmoothScrollerCustom.java @@ -40,22 +40,37 @@ public class LinearSmoothScrollerCustom extends RecyclerView.SmoothScroller { public static final int POSITION_END = 1; public static final int POSITION_TOP = 2; + private float durationMultiplier = 1f; + private int offset; + public LinearSmoothScrollerCustom(Context context, int position) { MILLISECONDS_PER_PX = MILLISECONDS_PER_INCH / context.getResources().getDisplayMetrics().densityDpi; scrollPosition = position; } + public LinearSmoothScrollerCustom(Context context, int position, float durationMultiplier) { + this.durationMultiplier = durationMultiplier; + MILLISECONDS_PER_PX = MILLISECONDS_PER_INCH / context.getResources().getDisplayMetrics().densityDpi * durationMultiplier; + scrollPosition = position; + } + @Override protected void onStart() { } + public void setOffset(int offset) { + this.offset = offset; + } + @Override protected void onTargetFound(View targetView, RecyclerView.State state, Action action) { final int dy = calculateDyToMakeVisible(targetView); final int time = calculateTimeForDeceleration(dy); if (time > 0) { - action.update(0, -dy, Math.max(400, time), mDecelerateInterpolator); + action.update(0, -dy, Math.max((int) (400 * durationMultiplier), time), mDecelerateInterpolator); + } else { + onEnd(); } } @@ -127,13 +142,13 @@ public class LinearSmoothScrollerCustom extends RecyclerView.SmoothScroller { int boxSize = end - start; int viewSize = bottom - top; if (scrollPosition == POSITION_TOP) { - start = layoutManager.getPaddingTop(); + start = layoutManager.getPaddingTop() + offset; } else if (viewSize > boxSize) { start = 0; } else if (scrollPosition == POSITION_MIDDLE) { start = (boxSize - viewSize) / 2; } else { - start = (layoutManager.getPaddingTop() - AndroidUtilities.dp(88)); + start = (layoutManager.getPaddingTop() + offset - AndroidUtilities.dp(88)); } end = start + viewSize; final int dtStart = start - top; @@ -155,4 +170,8 @@ public class LinearSmoothScrollerCustom extends RecyclerView.SmoothScroller { } return null; } + + public void onEnd() { + + } } diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java index 82626f636..e955374f6 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/RecyclerView.java @@ -2363,6 +2363,35 @@ public class RecyclerView extends ViewGroup implements ScrollingView, } } + /** + * Animate a scroll by the given amount of pixels along either axis. + * + * @param dx Pixels to scroll horizontally + * @param dy Pixels to scroll vertically + * @param duration Duration of scrolling + * @param interpolator {@link Interpolator} to be used for scrolling. If it is + * {@code null}, RecyclerView is going to use the default interpolator. + */ + public void smoothScrollBy(@Px int dx, @Px int dy, int duration, @Nullable Interpolator interpolator) { + if (mLayout == null) { + Log.e(TAG, "Cannot smooth scroll without a LayoutManager set. " + + "Call setLayoutManager with a non-null argument."); + return; + } + if (mLayoutSuppressed) { + return; + } + if (!mLayout.canScrollHorizontally()) { + dx = 0; + } + if (!mLayout.canScrollVertically()) { + dy = 0; + } + if (dx != 0 || dy != 0) { + mViewFlinger.smoothScrollBy(dx, dy, duration, interpolator); + } + } + /** * Begin a standard fling with an initial velocity along each axis in pixels per second. * If the velocity given is below the system-defined minimum this method will return false @@ -4103,7 +4132,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView, try { for (int i = mChildHelper.getChildCount() - 1; i >= 0; i--) { ViewHolder holder = getChildViewHolderInt(mChildHelper.getChildAt(i)); - if (holder.shouldIgnore()) { + if (holder == null || holder.shouldIgnore()) { continue; } long key = getChangedHolderKey(holder); @@ -4148,7 +4177,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView, StringBuilder builder = new StringBuilder(); for (int i = mChildHelper.getChildCount() - 1; i >= 0; i--) { ViewHolder holder = getChildViewHolderInt(mChildHelper.getChildAt(i)); - if (holder.shouldIgnore()) { + if (holder == null || holder.shouldIgnore()) { continue; } builder.append("Holder at" + i + " " + holder + "\n"); @@ -4264,7 +4293,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView, int maxPositionPreLayout = Integer.MIN_VALUE; for (int i = 0; i < count; ++i) { final ViewHolder holder = getChildViewHolderInt(mChildHelper.getChildAt(i)); - if (holder.shouldIgnore()) { + if (holder == null || holder.shouldIgnore()) { continue; } final int pos = holder.getLayoutPosition(); @@ -10242,7 +10271,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView, } } - void onSmoothScrollerStopped(SmoothScroller smoothScroller) { + public void onSmoothScrollerStopped(SmoothScroller smoothScroller) { if (mSmoothScroller == smoothScroller) { mSmoothScroller = null; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index 993b9245e..5f74d2478 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -101,6 +101,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; +import androidx.core.math.MathUtils; import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; @@ -115,6 +116,7 @@ import com.google.android.gms.tasks.Task; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.browser.Browser; +import org.telegram.messenger.utils.CustomHtml; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; @@ -437,7 +439,9 @@ public class AndroidUtilities { @Override public void onClick(@NonNull View view) { - runnable.run(); + if (runnable != null) { + runnable.run(); + } } }, index, index + len, 0); } @@ -446,7 +450,7 @@ public class AndroidUtilities { public static void recycleBitmaps(ArrayList bitmapToRecycle) { if (bitmapToRecycle != null && !bitmapToRecycle.isEmpty()) { - AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(UserConfig.selectedAccount).doOnIdle(() -> { + AndroidUtilities.runOnUIThread(() -> Utilities.globalQueue.postRunnable(() -> { for (int i = 0; i < bitmapToRecycle.size(); i++) { Bitmap bitmap = bitmapToRecycle.get(i); if (bitmap != null && !bitmap.isRecycled()) { @@ -921,19 +925,20 @@ public class AndroidUtilities { } } - public static boolean isGoogleMapsInstalled(final BaseFragment fragment) { + public static boolean isMapsInstalled(BaseFragment fragment) { + String pkg = ApplicationLoader.getMapsProvider().getMapsAppPackageName(); try { - ApplicationLoader.applicationContext.getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0); + ApplicationLoader.applicationContext.getPackageManager().getApplicationInfo(pkg, 0); return true; } catch (PackageManager.NameNotFoundException e) { if (fragment.getParentActivity() == null) { return false; } AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity()); - builder.setMessage(LocaleController.getString("InstallGoogleMaps", R.string.InstallGoogleMaps)); + builder.setMessage(LocaleController.getString(ApplicationLoader.getMapsProvider().getInstallMapsString())); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialogInterface, i) -> { try { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps")); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + pkg)); fragment.getParentActivity().startActivityForResult(intent, 500); } catch (Exception e1) { FileLog.e(e1); @@ -2497,14 +2502,23 @@ public class AndroidUtilities { return Build.VERSION.SDK_INT < Build.VERSION_CODES.S || !OneUIUtilities.hasBuiltInClipboardToasts(); } - public static void addToClipboard(CharSequence str) { + public static boolean addToClipboard(CharSequence str) { try { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", str); - clipboard.setPrimaryClip(clip); + + if (str instanceof Spanned) { + android.content.ClipData clip = android.content.ClipData.newHtmlText("label", str, CustomHtml.toHtml((Spanned) str)); + clipboard.setPrimaryClip(clip); + return true; + } else { + android.content.ClipData clip = android.content.ClipData.newPlainText("label", str); + clipboard.setPrimaryClip(clip); + return true; + } } catch (Exception e) { FileLog.e(e); } + return false; } public static void addMediaToGallery(String fromPath) { @@ -3057,7 +3071,7 @@ public class AndroidUtilities { } } if (Build.VERSION.SDK_INT >= 24) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), realMimeType != null ? realMimeType : "text/plain"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), realMimeType != null ? realMimeType : "text/plain"); } else { intent.setDataAndType(Uri.fromFile(f), realMimeType != null ? realMimeType : "text/plain"); } @@ -3066,7 +3080,7 @@ public class AndroidUtilities { activity.startActivityForResult(intent, 500); } catch (Exception e) { if (Build.VERSION.SDK_INT >= 24) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), "text/plain"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), "text/plain"); } else { intent.setDataAndType(Uri.fromFile(f), "text/plain"); } @@ -3115,7 +3129,7 @@ public class AndroidUtilities { return true; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), realMimeType != null ? realMimeType : "text/plain"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), realMimeType != null ? realMimeType : "text/plain"); } else { intent.setDataAndType(Uri.fromFile(f), realMimeType != null ? realMimeType : "text/plain"); } @@ -3124,7 +3138,7 @@ public class AndroidUtilities { activity.startActivityForResult(intent, 500); } catch (Exception e) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), "text/plain"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), "text/plain"); } else { intent.setDataAndType(Uri.fromFile(f), "text/plain"); } @@ -3253,7 +3267,7 @@ public class AndroidUtilities { } } if (Build.VERSION.SDK_INT >= 24) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), realMimeType != null ? realMimeType : "text/plain"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), realMimeType != null ? realMimeType : "text/plain"); } else { intent.setDataAndType(Uri.fromFile(f), realMimeType != null ? realMimeType : "text/plain"); } @@ -3262,7 +3276,7 @@ public class AndroidUtilities { activity.startActivityForResult(intent, 500); } catch (Exception e) { if (Build.VERSION.SDK_INT >= 24) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), "text/plain"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), "text/plain"); } else { intent.setDataAndType(Uri.fromFile(f), "text/plain"); } @@ -3826,15 +3840,6 @@ public class AndroidUtilities { return lerp(ab[0], ab[1], f); } - public static int lerpColor(int a, int b, float f) { - return Color.argb( - lerp(Color.alpha(a), Color.alpha(b), f), - lerp(Color.red(a), Color.red(b), f), - lerp(Color.green(a), Color.green(b), f), - lerp(Color.blue(a), Color.blue(b), f) - ); - } - public static void lerp(RectF a, RectF b, float f, RectF to) { if (to != null) { to.set( @@ -3857,6 +3862,12 @@ public class AndroidUtilities { } } + public static float cascade(float fullAnimationT, int position, int count, float waveLength) { + final float waveDuration = 1f / count * waveLength; + final float waveOffset = position / (float) count * (1f - waveDuration); + return MathUtils.clamp((fullAnimationT - waveOffset) / waveDuration, 0, 1); + } + public static float computeDampingRatio(float tension /* stiffness */, float friction /* damping */, float mass) { return friction / (2f * (float) Math.sqrt(mass * tension)); } @@ -4337,7 +4348,7 @@ public class AndroidUtilities { try (FileOutputStream out = new FileOutputStream(file)) { bitmap.compress(format, 100, out); out.close(); - return FileProvider.getUriForFile(ApplicationLoader.applicationContext, BuildConfig.APPLICATION_ID + ".provider", file); + return FileProvider.getUriForFile(ApplicationLoader.applicationContext, ApplicationLoader.getApplicationId() + ".provider", file); } catch (Exception e) { FileLog.e(e); } @@ -4362,4 +4373,23 @@ public class AndroidUtilities { // return false; // } } + + public static CharSequence trim(CharSequence text, int[] newStart) { + if (text == null) { + return null; + } + int len = text.length(); + int st = 0; + + while (st < len && text.charAt(st) <= ' ') { + st++; + } + while (st < len && text.charAt(len - 1) <= ' ') { + len--; + } + if (newStart != null) { + newStart[0] = st; + } + return (st > 0 || len < text.length()) ? text.subSequence(st, len) : text; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java index f12328577..0dd1e0e02 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java @@ -29,14 +29,12 @@ import android.os.Handler; import android.os.PowerManager; import android.os.SystemClock; import android.telephony.TelephonyManager; -import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.multidex.MultiDex; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.firebase.messaging.FirebaseMessaging; import org.telegram.messenger.voip.VideoCapturerDevice; import org.telegram.tgnet.ConnectionsManager; @@ -48,6 +46,8 @@ import java.io.File; public class ApplicationLoader extends Application { + private static ApplicationLoader applicationLoaderInstance; + @SuppressLint("StaticFieldLeak") public static volatile Context applicationContext; public static volatile NetworkInfo currentNetworkInfo; @@ -69,7 +69,9 @@ public class ApplicationLoader extends Application { public static boolean canDrawOverlays; public static volatile long mainInterfacePausedStageQueueTime; - public static boolean hasPlayServices; + private static PushListenerController.IPushListenerServiceProvider pushProvider; + private static IMapsProvider mapsProvider; + private static ILocationServiceProvider locationServiceProvider; @Override protected void attachBaseContext(Context base) { @@ -77,6 +79,56 @@ public class ApplicationLoader extends Application { MultiDex.install(this); } + public static ILocationServiceProvider getLocationServiceProvider() { + if (locationServiceProvider == null) { + locationServiceProvider = applicationLoaderInstance.onCreateLocationServiceProvider(); + locationServiceProvider.init(applicationContext); + } + return locationServiceProvider; + } + + protected ILocationServiceProvider onCreateLocationServiceProvider() { + return new GoogleLocationProvider(); + } + + public static IMapsProvider getMapsProvider() { + if (mapsProvider == null) { + mapsProvider = applicationLoaderInstance.onCreateMapsProvider(); + } + return mapsProvider; + } + + protected IMapsProvider onCreateMapsProvider() { + return new GoogleMapsProvider(); + } + + public static PushListenerController.IPushListenerServiceProvider getPushProvider() { + if (pushProvider == null) { + pushProvider = applicationLoaderInstance.onCreatePushProvider(); + } + return pushProvider; + } + + protected PushListenerController.IPushListenerServiceProvider onCreatePushProvider() { + return PushListenerController.GooglePushListenerServiceProvider.INSTANCE; + } + + public static String getApplicationId() { + return applicationLoaderInstance.onGetApplicationId(); + } + + protected String onGetApplicationId() { + return null; + } + + public static boolean isHuaweiStoreBuild() { + return applicationLoaderInstance.isHuaweiBuild(); + } + + protected boolean isHuaweiBuild() { + return false; + } + public static File getFilesDirFixed() { for (int a = 0; a < 10; a++) { File path = ApplicationLoader.applicationContext.getFilesDir(); @@ -168,7 +220,7 @@ public class ApplicationLoader extends Application { } ApplicationLoader app = (ApplicationLoader) ApplicationLoader.applicationContext; - app.initPlayServices(); + app.initPushServices(); if (BuildVars.LOGS_ENABLED) { FileLog.d("app initied"); } @@ -188,6 +240,7 @@ public class ApplicationLoader extends Application { @Override public void onCreate() { + applicationLoaderInstance = this; try { applicationContext = getApplicationContext(); } catch (Throwable ignore) { @@ -262,48 +315,16 @@ public class ApplicationLoader extends Application { } } - private void initPlayServices() { + private void initPushServices() { AndroidUtilities.runOnUIThread(() -> { - if (hasPlayServices = checkPlayServices()) { - final String currentPushString = SharedConfig.pushString; - if (!TextUtils.isEmpty(currentPushString)) { - if (BuildVars.DEBUG_PRIVATE_VERSION && BuildVars.LOGS_ENABLED) { - FileLog.d("GCM regId = " + currentPushString); - } - } else { - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM Registration not found."); - } - } - Utilities.globalQueue.postRunnable(() -> { - try { - SharedConfig.pushStringGetTimeStart = SystemClock.elapsedRealtime(); - FirebaseMessaging.getInstance().getToken() - .addOnCompleteListener(task -> { - SharedConfig.pushStringGetTimeEnd = SystemClock.elapsedRealtime(); - if (!task.isSuccessful()) { - if (BuildVars.LOGS_ENABLED) { - FileLog.d("Failed to get regid"); - } - SharedConfig.pushStringStatus = "__FIREBASE_FAILED__"; - GcmPushListenerService.sendRegistrationToServer(null); - return; - } - String token = task.getResult(); - if (!TextUtils.isEmpty(token)) { - GcmPushListenerService.sendRegistrationToServer(token); - } - }); - } catch (Throwable e) { - FileLog.e(e); - } - }); + if (getPushProvider().hasServices()) { + getPushProvider().onRequestPushToken(); } else { if (BuildVars.LOGS_ENABLED) { - FileLog.d("No valid Google Play Services APK found."); + FileLog.d("No valid " + getPushProvider().getLogTitle() + " APK found."); } SharedConfig.pushStringStatus = "__NO_GOOGLE_PLAY_SERVICES__"; - GcmPushListenerService.sendRegistrationToServer(null); + PushListenerController.sendRegistrationToServer(getPushProvider().getPushType(), null); } }, 1000); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java b/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java index 5146f63ee..9c048876a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java @@ -14,6 +14,7 @@ import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClientStateListener; import com.android.billingclient.api.BillingFlowParams; import com.android.billingclient.api.BillingResult; +import com.android.billingclient.api.ConsumeParams; import com.android.billingclient.api.ProductDetails; import com.android.billingclient.api.ProductDetailsResponseListener; import com.android.billingclient.api.Purchase; @@ -24,15 +25,20 @@ import com.android.billingclient.api.QueryPurchasesParams; import com.google.android.exoplayer2.util.Util; import org.json.JSONObject; +import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.PremiumPreviewFragment; import java.io.InputStream; +import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.Currency; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; public class BillingController implements PurchasesUpdatedListener, BillingClientStateListener { public final static String PREMIUM_PRODUCT_ID = "telegram_premium"; @@ -67,6 +73,24 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien .build(); } + public String formatCurrency(long amount, String currency) { + return formatCurrency(amount, currency, getCurrencyExp(currency)); + } + + public String formatCurrency(long amount, String currency, int exp) { + if (currency.isEmpty()) { + return String.valueOf(amount); + } + Currency cur = Currency.getInstance(currency); + if (cur != null) { + NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); + numberFormat.setCurrency(cur); + + return numberFormat.format(amount / Math.pow(10, exp)); + } + return amount + " " + currency; + } + public int getCurrencyExp(String currency) { Integer exp = currencyExpMap.get(currency); if (exp == null) { @@ -79,17 +103,17 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien if (isReady()) { return; } - if (BuildVars.useInvoiceBilling()) { - try { - Context ctx = ApplicationLoader.applicationContext; - InputStream in = ctx.getAssets().open("currencies.json"); - JSONObject obj = new JSONObject(new String(Util.toByteArray(in), "UTF-8")); - parseCurrencies(obj); - in.close(); - } catch (Exception e) { - FileLog.e(e); - } - } else { + try { + Context ctx = ApplicationLoader.applicationContext; + InputStream in = ctx.getAssets().open("currencies.json"); + JSONObject obj = new JSONObject(new String(Util.toByteArray(in), "UTF-8")); + parseCurrencies(obj); + in.close(); + } catch (Exception e) { + FileLog.e(e); + } + + if (!BuildVars.useInvoiceBilling()) { billingClient.startConnection(this); } } @@ -131,40 +155,130 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien resultListeners.put(productId, listener); } - public boolean launchBillingFlow(Activity activity, List productDetails) { + public void launchBillingFlow(Activity activity, AccountInstance accountInstance, TLRPC.InputStorePaymentPurpose paymentPurpose, List productDetails) { + launchBillingFlow(activity, accountInstance, paymentPurpose, productDetails, false); + } + + public void launchBillingFlow(Activity activity, AccountInstance accountInstance, TLRPC.InputStorePaymentPurpose paymentPurpose, List productDetails, boolean checkedConsume) { if (!isReady()) { - return false; + return; } - return billingClient.launchBillingFlow(activity, BillingFlowParams.newBuilder() + + if (paymentPurpose instanceof TLRPC.TL_inputStorePaymentGiftPremium && !checkedConsume) { + queryPurchases(BillingClient.ProductType.INAPP, (billingResult, list) -> { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + Runnable callback = () -> launchBillingFlow(activity, accountInstance, paymentPurpose, productDetails, true); + + AtomicInteger productsToBeConsumed = new AtomicInteger(0); + List productsConsumed = new ArrayList<>(); + for (Purchase purchase : list) { + if (purchase.isAcknowledged()) { + for (BillingFlowParams.ProductDetailsParams params : productDetails) { + String productId = params.zza().getProductId(); + if (purchase.getProducts().contains(productId)) { + productsToBeConsumed.incrementAndGet(); + billingClient.consumeAsync(ConsumeParams.newBuilder() + .setPurchaseToken(purchase.getPurchaseToken()) + .build(), (billingResult1, s) -> { + if (billingResult1.getResponseCode() == BillingClient.BillingResponseCode.OK) { + productsConsumed.add(productId); + + if (productsToBeConsumed.get() == productsConsumed.size()) { + callback.run(); + } + } + }); + break; + } + } + } else { + onPurchasesUpdated(BillingResult.newBuilder().setResponseCode(BillingClient.BillingResponseCode.OK).build(), Collections.singletonList(purchase)); + return; + } + } + + if (productsToBeConsumed.get() == 0) { + callback.run(); + } + } + }); + return; + } + + boolean ok = billingClient.launchBillingFlow(activity, BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetails) .build()).getResponseCode() == BillingClient.BillingResponseCode.OK; + + if (ok) { + for (BillingFlowParams.ProductDetailsParams params : productDetails) { + accountInstance.getUserConfig().billingPaymentPurpose = paymentPurpose; + accountInstance.getUserConfig().awaitBillingProductIds.add(params.zza().getProductId()); // params.getProductDetails().getProductId() + } + accountInstance.getUserConfig().saveConfig(false); + } } @Override public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List list) { FileLog.d("Billing purchases updated: " + billingResult + ", " + list); + if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) { + PremiumPreviewFragment.sentPremiumBuyCanceled(); + } + + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + AccountInstance acc = AccountInstance.getInstance(i); + if (!acc.getUserConfig().awaitBillingProductIds.isEmpty()) { + acc.getUserConfig().awaitBillingProductIds.clear(); + acc.getUserConfig().billingPaymentPurpose = null; + acc.getUserConfig().saveConfig(false); + } + } + + return; + } if (list == null) { return; } for (Purchase purchase : list) { - if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { - if (!purchase.isAcknowledged()) { - if (!requestingTokens.contains(purchase.getPurchaseToken())) { - requestingTokens.add(purchase.getPurchaseToken()); - TLRPC.TL_payments_assignPlayMarketTransaction req = new TLRPC.TL_payments_assignPlayMarketTransaction(); - req.purchase_token = purchase.getPurchaseToken(); - AccountInstance acc = AccountInstance.getInstance(UserConfig.selectedAccount); - acc.getConnectionsManager().sendRequest(req, (response, error) -> { - if (response instanceof TLRPC.Updates) { - acc.getMessagesController().processUpdates((TLRPC.Updates) response, false); - requestingTokens.remove(purchase.getPurchaseToken()); + if (!requestingTokens.contains(purchase.getPurchaseToken())) { + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + AccountInstance acc = AccountInstance.getInstance(i); + if (acc.getUserConfig().awaitBillingProductIds.containsAll(purchase.getProducts()) && purchase.getPurchaseState() != Purchase.PurchaseState.PENDING) { + acc.getUserConfig().awaitBillingProductIds.removeAll(purchase.getProducts()); + acc.getUserConfig().saveConfig(false); - for (String productId : purchase.getProducts()) { - Consumer listener = resultListeners.remove(productId); - listener.accept(billingResult); - } + if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { + if (!purchase.isAcknowledged()) { + requestingTokens.add(purchase.getPurchaseToken()); + TLRPC.TL_payments_assignPlayMarketTransaction req = new TLRPC.TL_payments_assignPlayMarketTransaction(); + req.receipt = new TLRPC.TL_dataJSON(); + req.receipt.data = purchase.getOriginalJson(); + req.purpose = acc.getUserConfig().billingPaymentPurpose; + acc.getConnectionsManager().sendRequest(req, (response, error) -> { + if (response instanceof TLRPC.Updates) { + acc.getMessagesController().processUpdates((TLRPC.Updates) response, false); + requestingTokens.remove(purchase.getPurchaseToken()); + + for (String productId : purchase.getProducts()) { + Consumer listener = resultListeners.remove(productId); + if (listener != null) { + listener.accept(billingResult); + } + } + + if (req.purpose instanceof TLRPC.TL_inputStorePaymentGiftPremium) { + billingClient.consumeAsync(ConsumeParams.newBuilder() + .setPurchaseToken(purchase.getPurchaseToken()) + .build(), (billingResult1, s) -> {}); + } + } + }, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagInvokeAfter); + + acc.getUserConfig().billingPaymentPurpose = null; + acc.getUserConfig().saveConfig(false); } - }); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 3608369b4..34312bf07 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -20,14 +20,16 @@ public class BuildVars { public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29; - public static int BUILD_VERSION = 2722; - public static String BUILD_VERSION_STRING = "8.8.5"; + public static int BUILD_VERSION = 2751; + public static String BUILD_VERSION_STRING = "8.9.0"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; public static String SMS_HASH = isStandaloneApp() ? "w0lkcmTZkKh" : (DEBUG_VERSION ? "O2P2z+/jBpJ" : "oLeq9AcOZkT"); public static String PLAYSTORE_APP_URL = "https://play.google.com/store/apps/details?id=org.telegram.messenger"; + public static String HUAWEI_APP_ID = "101184875"; + // You can use this flag to disable Google Play Billing (If you're making fork and want it to be in Google Play) public static boolean IS_BILLING_UNAVAILABLE = false; @@ -39,7 +41,7 @@ public class BuildVars { } public static boolean useInvoiceBilling() { - return DEBUG_VERSION || isStandaloneApp() || isBetaApp(); + return DEBUG_VERSION || isStandaloneApp() || isBetaApp() || isHuaweiStoreApp(); } private static Boolean standaloneApp; @@ -57,4 +59,9 @@ public class BuildVars { } return betaApp; } + + + public static boolean isHuaweiStoreApp() { + return ApplicationLoader.isHuaweiStoreBuild(); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java index f31887fdf..15708edca 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java @@ -69,6 +69,7 @@ public class ContactsController extends BaseController { private ArrayList forwardsPrivacyRules; private ArrayList phonePrivacyRules; private ArrayList addedByPhonePrivacyRules; + private ArrayList voiceMessagesRules; private TLRPC.TL_globalPrivacySettings globalPrivacySettings; public final static int PRIVACY_RULES_TYPE_LASTSEEN = 0; @@ -79,8 +80,9 @@ public class ContactsController extends BaseController { public final static int PRIVACY_RULES_TYPE_FORWARDS = 5; public final static int PRIVACY_RULES_TYPE_PHONE = 6; public final static int PRIVACY_RULES_TYPE_ADDED_BY_PHONE = 7; + public final static int PRIVACY_RULES_TYPE_VOICE_MESSAGES = 8; - public final static int PRIVACY_RULES_TYPE_COUNT = 8; + public final static int PRIVACY_RULES_TYPE_COUNT = 9; private class MyContentObserver extends ContentObserver { @@ -2386,6 +2388,9 @@ public class ContactsController extends BaseController { case PRIVACY_RULES_TYPE_PHONE: req.key = new TLRPC.TL_inputPrivacyKeyPhoneNumber(); break; + case PRIVACY_RULES_TYPE_VOICE_MESSAGES: + req.key = new TLRPC.TL_inputPrivacyKeyVoiceMessages(); + break; case PRIVACY_RULES_TYPE_ADDED_BY_PHONE: default: req.key = new TLRPC.TL_inputPrivacyKeyAddedByPhone(); @@ -2420,6 +2425,9 @@ public class ContactsController extends BaseController { case PRIVACY_RULES_TYPE_PHONE: phonePrivacyRules = rules.rules; break; + case PRIVACY_RULES_TYPE_VOICE_MESSAGES: + voiceMessagesRules = rules.rules; + break; case PRIVACY_RULES_TYPE_ADDED_BY_PHONE: default: addedByPhonePrivacyRules = rules.rules; @@ -2451,7 +2459,7 @@ public class ContactsController extends BaseController { return loadingGlobalSettings != 2; } - public boolean getLoadingPrivicyInfo(int type) { + public boolean getLoadingPrivacyInfo(int type) { return loadingPrivacyInfo[type] != 2; } @@ -2477,6 +2485,8 @@ public class ContactsController extends BaseController { return phonePrivacyRules; case PRIVACY_RULES_TYPE_ADDED_BY_PHONE: return addedByPhonePrivacyRules; + case PRIVACY_RULES_TYPE_VOICE_MESSAGES: + return voiceMessagesRules; } return null; } @@ -2507,6 +2517,9 @@ public class ContactsController extends BaseController { case PRIVACY_RULES_TYPE_ADDED_BY_PHONE: addedByPhonePrivacyRules = rules; break; + case PRIVACY_RULES_TYPE_VOICE_MESSAGES: + voiceMessagesRules = rules; + break; } getNotificationCenter().postNotificationName(NotificationCenter.privacyRulesUpdated); reloadContactsStatuses(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueueMainThreadSync.java b/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueueMainThreadSync.java index 7d9e310a0..b69fa4c44 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueueMainThreadSync.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueueMainThreadSync.java @@ -46,7 +46,7 @@ public class DispatchQueueMainThreadSync extends Thread { private void checkThread() { if (BuildVars.DEBUG_PRIVATE_VERSION && Thread.currentThread() != ApplicationLoader.applicationHandler.getLooper().getThread()) { - throw new IllegalStateException("Disaptch thread"); +// throw new IllegalStateException("Disaptch thread"); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueuePoolBackground.java b/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueuePoolBackground.java new file mode 100644 index 000000000..0788fadf4 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueuePoolBackground.java @@ -0,0 +1,141 @@ +package org.telegram.messenger; + +import android.os.SystemClock; +import android.util.SparseIntArray; + +import androidx.annotation.UiThread; + +import java.util.ArrayList; + +public class DispatchQueuePoolBackground { + + private ArrayList queues = new ArrayList<>(10); + private SparseIntArray busyQueuesMap = new SparseIntArray(); + private ArrayList busyQueues = new ArrayList<>(10); + private int maxCount; + private int createdCount; + private int guid; + private int totalTasksCount; + private boolean cleanupScheduled; + + + static ArrayList updateTaskCollection; + private static DispatchQueuePoolBackground backgroundQueue; + + + private Runnable cleanupRunnable = new Runnable() { + @Override + public void run() { + if (!queues.isEmpty()) { + long currentTime = SystemClock.elapsedRealtime(); + for (int a = 0; a < queues.size(); a++) { + DispatchQueue queue = queues.get(a); + if (queue.getLastTaskTime() < currentTime - 30000) { + queue.recycle(); + queues.remove(a); + createdCount--; + a--; + } + } + } + if (!queues.isEmpty() || !busyQueues.isEmpty()) { + Utilities.globalQueue.postRunnable(this, 30000); + cleanupScheduled = true; + } else { + cleanupScheduled = false; + } + } + }; + + private DispatchQueuePoolBackground(int count) { + maxCount = count; + guid = Utilities.random.nextInt(); + } + + private void execute(ArrayList runnables) { + for (int i = 0; i < runnables.size(); i++) { + Runnable runnable = runnables.get(i); + if (runnable == null) { + continue; + } + DispatchQueue queue; + if (!busyQueues.isEmpty() && (totalTasksCount / 2 <= busyQueues.size() || queues.isEmpty() && createdCount >= maxCount)) { + queue = busyQueues.remove(0); + } else if (queues.isEmpty()) { + queue = new DispatchQueue("DispatchQueuePoolThreadSafety" + guid + "_" + Utilities.random.nextInt()); + queue.setPriority(Thread.MAX_PRIORITY); + createdCount++; + } else { + queue = queues.remove(0); + } + if (!cleanupScheduled) { + Utilities.globalQueue.postRunnable(cleanupRunnable, 30000); + cleanupScheduled = true; + } + totalTasksCount++; + busyQueues.add(queue); + int count = busyQueuesMap.get(queue.index, 0); + busyQueuesMap.put(queue.index, count + 1); + queue.postRunnable(() -> { + runnable.run(); + Utilities.globalQueue.postRunnable(() -> { + totalTasksCount--; + int remainingTasksCount = busyQueuesMap.get(queue.index) - 1; + if (remainingTasksCount == 0) { + busyQueuesMap.delete(queue.index); + busyQueues.remove(queue); + queues.add(queue); + } else { + busyQueuesMap.put(queue.index, remainingTasksCount); + } + }); + }); + } + } + + private final static ArrayList> freeCollections = new ArrayList<>(); + + private static final Runnable finishCollectUpdateRunnable = new Runnable() { + @Override + public void run() { + finishCollectUpdateRunnables(); + } + }; + + @UiThread + public static void execute(Runnable runnable) { + if (BuildVars.DEBUG_PRIVATE_VERSION && Thread.currentThread() != ApplicationLoader.applicationHandler.getLooper().getThread()) { + throw new RuntimeException("wrong thread"); + } + if (updateTaskCollection == null) { + if (!freeCollections.isEmpty()) { + updateTaskCollection = freeCollections.remove(freeCollections.size() - 1); + } else { + updateTaskCollection = new ArrayList<>(100); + } + AndroidUtilities.runOnUIThread(finishCollectUpdateRunnable); + } + + updateTaskCollection.add(runnable); + } + + private static void finishCollectUpdateRunnables() { + if (updateTaskCollection == null || updateTaskCollection.isEmpty()) { + updateTaskCollection = null; + return; + } + ArrayList arrayList = updateTaskCollection; + updateTaskCollection = null; + if (backgroundQueue == null) { + backgroundQueue = new DispatchQueuePoolBackground(Math.max(1, Runtime.getRuntime().availableProcessors() - 2)); + } + Utilities.globalQueue.postRunnable(() -> { + backgroundQueue.execute(arrayList); + arrayList.clear(); + AndroidUtilities.runOnUIThread(() -> { + freeCollections.add(arrayList); + }); + }); + + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueuePoolMainThreadSync.java b/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueuePoolMainThreadSync.java deleted file mode 100644 index 6f0a924ae..000000000 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DispatchQueuePoolMainThreadSync.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.telegram.messenger; - -import android.os.SystemClock; -import android.util.SparseIntArray; - -import androidx.annotation.UiThread; - -import java.util.LinkedList; - -public class DispatchQueuePoolMainThreadSync { - - private LinkedList queues = new LinkedList<>(); - private SparseIntArray busyQueuesMap = new SparseIntArray(); - private LinkedList busyQueues = new LinkedList<>(); - private int maxCount; - private int createdCount; - private int guid; - private int totalTasksCount; - private boolean cleanupScheduled; - - private Runnable cleanupRunnable = new Runnable() { - @Override - public void run() { - if (!queues.isEmpty()) { - long currentTime = SystemClock.elapsedRealtime(); - for (int a = 0, N = queues.size(); a < N; a++) { - DispatchQueueMainThreadSync queue = queues.get(a); - if (queue.getLastTaskTime() < currentTime - 30000) { - queue.recycle(); - queues.remove(a); - createdCount--; - a--; - N--; - } - } - } - if (!queues.isEmpty() || !busyQueues.isEmpty()) { - AndroidUtilities.runOnUIThread(this, 30000); - cleanupScheduled = true; - } else { - cleanupScheduled = false; - } - } - }; - - public DispatchQueuePoolMainThreadSync(int count) { - maxCount = count; - guid = Utilities.random.nextInt(); - } - - @UiThread - public void execute(Runnable runnable) { - DispatchQueueMainThreadSync queue; - if (!busyQueues.isEmpty() && (totalTasksCount / 2 <= busyQueues.size() || queues.isEmpty() && createdCount >= maxCount)) { - queue = busyQueues.remove(0); - } else if (queues.isEmpty()) { - queue = new DispatchQueueMainThreadSync("DispatchQueuePool" + guid + "_" + Utilities.random.nextInt()); - queue.setPriority(Thread.MAX_PRIORITY); - createdCount++; - } else { - queue = queues.remove(0); - } - if (!cleanupScheduled) { - AndroidUtilities.runOnUIThread(cleanupRunnable, 30000); - cleanupScheduled = true; - } - totalTasksCount++; - busyQueues.add(queue); - int count = busyQueuesMap.get(queue.index, 0); - busyQueuesMap.put(queue.index, count + 1); - queue.postRunnable(() -> { - runnable.run(); - AndroidUtilities.runOnUIThread(() -> { - totalTasksCount--; - int remainingTasksCount = busyQueuesMap.get(queue.index) - 1; - if (remainingTasksCount == 0) { - busyQueuesMap.delete(queue.index); - busyQueues.remove(queue); - queues.add(queue); - } else { - busyQueuesMap.put(queue.index, remainingTasksCount); - } - }); - }); - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DocumentObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/DocumentObject.java index 67654925a..08fc8fb5d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DocumentObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DocumentObject.java @@ -60,7 +60,7 @@ public class DocumentObject { if (photoPathSize != null && w != 0 && h != 0) { SvgHelper.SvgDrawable pathThumb = SvgHelper.getDrawableByPath(SvgHelper.decompress(photoPathSize.bytes), w, h); if (pathThumb != null) { - pathThumb.setupGradient(colorKey, alpha); + pathThumb.setupGradient(colorKey, alpha, false); } return pathThumb; } @@ -68,6 +68,26 @@ public class DocumentObject { return null; } + public static SvgHelper.SvgDrawable getCircleThumb(float radius, String colorKey, float alpha) { + return getCircleThumb(radius, colorKey, null, alpha); + } + + public static SvgHelper.SvgDrawable getCircleThumb(float radius, String colorKey, Theme.ResourcesProvider resourcesProvider, float alpha) { + try { + SvgHelper.SvgDrawable drawable = new SvgHelper.SvgDrawable(); + SvgHelper.Circle circle = new SvgHelper.Circle(256, 256, radius * 512); + drawable.commands.add(circle); + drawable.paints.put(circle, new Paint(Paint.ANTI_ALIAS_FLAG)); + drawable.width = 512; + drawable.height = 512; + drawable.setupGradient(colorKey, alpha, false); + return drawable; + } catch (Exception e) { + FileLog.e(e); + return null; + } + } + public static SvgHelper.SvgDrawable getSvgThumb(TLRPC.Document document, String colorKey, float alpha) { return getSvgThumb(document, colorKey, alpha, 1.0f); } @@ -81,7 +101,7 @@ public class DocumentObject { drawable.paints.put(path, new Paint(Paint.ANTI_ALIAS_FLAG)); drawable.width = 512; drawable.height = 512; - drawable.setupGradient(colorKey, alpha); + drawable.setupGradient(colorKey, alpha, false); return drawable; } @@ -105,7 +125,7 @@ public class DocumentObject { if (w != 0 && h != 0) { pathThumb = SvgHelper.getDrawableByPath(SvgHelper.decompress(size.bytes), (int) (w * zoom), (int) (h * zoom)); if (pathThumb != null) { - pathThumb.setupGradient(colorKey, alpha); + pathThumb.setupGradient(colorKey, alpha, false); } } break; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java b/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java index 567088099..9ed7143d8 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java @@ -1155,13 +1155,14 @@ public class DownloadController extends BaseController implements NotificationCe } public void onDownloadComplete(MessageObject parentObject) { - if (parentObject == null) { + if (parentObject == null || parentObject.getDocument() == null) { return; } + TLRPC.Document document = parentObject.getDocument(); AndroidUtilities.runOnUIThread(() -> { boolean removed = false; for (int i = 0; i < downloadingFiles.size(); i++) { - if (downloadingFiles.get(i).getDocument().id == parentObject.getDocument().id) { + if (downloadingFiles.get(i).getDocument() != null && downloadingFiles.get(i).getDocument().id == document.id) { downloadingFiles.remove(i); removed = true; break; @@ -1171,7 +1172,7 @@ public class DownloadController extends BaseController implements NotificationCe if (removed) { boolean contains = false; for (int i = 0; i < recentDownloadingFiles.size(); i++) { - if (recentDownloadingFiles.get(i).getDocument().id == parentObject.getDocument().id) { + if (recentDownloadingFiles.get(i).getDocument() != null && recentDownloadingFiles.get(i).getDocument().id == document.id) { contains = true; break; } @@ -1402,4 +1403,13 @@ public class DownloadController extends BaseController implements NotificationCe } }); } + + public boolean isDownloading(int messageId) { + for (int i = 0; i < downloadingFiles.size(); i++) { + if (downloadingFiles.get(i).messageOwner.id == messageId) { + return true; + } + } + return false; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java index beb37e394..59c99d67b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java @@ -24,26 +24,18 @@ import android.text.TextPaint; import android.text.TextUtils; import android.text.style.DynamicDrawableSpan; import android.text.style.ImageSpan; -import android.util.Pair; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import org.telegram.ui.Components.AnimatedEmojiSpan; -import org.telegram.tgnet.TLRPC; -import org.telegram.ui.ActionBar.Theme; -import org.telegram.ui.Cells.ChatMessageCell; - -import java.io.File; import java.io.InputStream; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Locale; -import java.util.concurrent.atomic.AtomicReference; public class Emoji { @@ -52,7 +44,16 @@ public class Emoji { private static int bigImgSize; private static boolean inited = false; private static Paint placeholderPaint; - private static int[] emojiCounts = new int[]{1906, 199, 123, 332, 128, 222, 292, 259}; + private static int[] emojiCounts = new int[]{ + EmojiData.data[0].length, + EmojiData.data[1].length, + EmojiData.data[2].length, + EmojiData.data[3].length, + EmojiData.data[4].length, + EmojiData.data[5].length, + EmojiData.data[6].length, + EmojiData.data[7].length + }; private static Bitmap[][] emojiBmp = new Bitmap[8][]; private static boolean[][] loadingEmoji = new boolean[8][]; @@ -234,7 +235,7 @@ public class Emoji { private boolean fullSize = false; private static Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); private static Rect rect = new Rect(); - public int placeholderColor = 0x20000000; + public int placeholderColor = 0x10000000; public EmojiDrawable(DrawableInfo i) { info = i; @@ -404,7 +405,7 @@ public class Emoji { startIndex = -1; startLength = 0; doneEmoji = false; - } else if (c != 0xfe0f) { + } else if (c != 0xfe0f && c != '\n' && c != ' ' && c != '\t') { notOnlyEmoji = true; } if (doneEmoji && i + 2 < length) { @@ -419,7 +420,7 @@ public class Emoji { } else if (emojiCode.length() >= 2 && emojiCode.charAt(0) == 0xD83C && emojiCode.charAt(1) == 0xDFF4 && next == 0xDB40) { i++; while (true) { - emojiCode.append(cs.subSequence(i, i + 2)); + emojiCode.append(cs.charAt(i)).append(cs.charAt(i + 1)); startLength += 2; i += 2; if (i >= cs.length() || cs.charAt(i) != 0xDB40) { @@ -427,7 +428,6 @@ public class Emoji { break; } } - } } previousGoodIndex = i; @@ -487,19 +487,14 @@ public class Emoji { } public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew) { - return replaceEmoji(cs, fontMetrics, size, createNew, null, false, null); - } - - public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew, boolean allowAnimated, AtomicReference> viewRef) { - return replaceEmoji(cs, fontMetrics, size, createNew, null, allowAnimated, viewRef); + return replaceEmoji(cs, fontMetrics, size, createNew, null); } public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew, int[] emojiOnly) { - return replaceEmoji(cs, fontMetrics, size, createNew, emojiOnly, false, null); + return replaceEmoji(cs, fontMetrics, size, createNew, emojiOnly, false); } - public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew, int[] emojiOnly, boolean allowAnimated, AtomicReference> viewRef) { - allowAnimated = false; + public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew, int[] emojiOnly, boolean limit) { if (SharedConfig.useSystemEmoji || cs == null || cs.length() == 0) { return cs; } @@ -511,21 +506,36 @@ public class Emoji { } ArrayList emojis = parseEmojis(s, emojiOnly); + AnimatedEmojiSpan[] animatedEmojiSpans = s.getSpans(0, s.length(), AnimatedEmojiSpan.class); EmojiSpan span; Drawable drawable; for (int i = 0; i < emojis.size(); ++i) { - EmojiSpanRange emojiRange = emojis.get(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; + } + } drawable = Emoji.getEmojiDrawable(emojiRange.code); if (drawable != null) { span = new EmojiSpan(drawable, DynamicDrawableSpan.ALIGN_BOTTOM, size, fontMetrics); + span.emoji = emojiRange.code == null ? null : emojiRange.code.toString(); s.setSpan(span, 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) >= 50) { + int limitCount = SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH ? 100 : 50; + if ((Build.VERSION.SDK_INT < 23 || Build.VERSION.SDK_INT >= 29)/* && !BuildVars.DEBUG_PRIVATE_VERSION*/ && (i + 1) >= limitCount) { break; } } @@ -533,8 +543,9 @@ public class Emoji { } public static class EmojiSpan extends ImageSpan { - private Paint.FontMetricsInt fontMetrics; - private int size = AndroidUtilities.dp(20); + public Paint.FontMetricsInt fontMetrics; + public int size = AndroidUtilities.dp(20); + public String emoji; public EmojiSpan(Drawable d, int verticalAlignment, int s, Paint.FontMetricsInt original) { super(d, verticalAlignment); @@ -585,8 +596,15 @@ public class Emoji { } } + public boolean drawn; + public float lastDrawX, lastDrawY; + @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { + lastDrawX = x + size / 2f; + lastDrawY = top + (bottom - top) / 2f; + drawn = true; + boolean restoreAlpha = false; if (paint.getAlpha() != 255 && emojiDrawingUseAlpha) { restoreAlpha = true; @@ -610,7 +628,7 @@ public class Emoji { @Override public void updateDrawState(TextPaint ds) { if (getDrawable() instanceof EmojiDrawable) { - ((EmojiDrawable) getDrawable()).placeholderColor = 0x20ffffff & ds.getColor(); + ((EmojiDrawable) getDrawable()).placeholderColor = 0x10ffffff & ds.getColor(); } super.updateDrawState(ds); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/EmojiData.java b/TMessagesProj/src/main/java/org/telegram/messenger/EmojiData.java index f4763190a..4dbff9a53 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,8 @@ public class EmojiData { public static final String[][] dataColored = { new String[]{ - "😀", "😃", "😄", "😁", "😆", "😅", "😂", "🤣", "🥲", "☺", "😊", "😇", "🙂", "🙃", "😉", "😌", "😍", "🥰", "😘", "😗", "😙", "😚", "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🥸", "🤩", "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "☹", "😣", "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😠", "😡", "🤬", "🤯", "😳", "🥵", "🥶", "😶‍🌫", "😱", "😨", "😰", "😥", "😓", "🤗", "🤔", "🤭", "🤫", "🤥", "😶", "😐", "😑", "😬", "🙄", "😯", "😦", "😧", "😮", "😲", "🥱", "😴", "🤤", "😪", "😮‍💨", "😵", "😵‍💫", "🤐", "🥴", "🤢", "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "😈", "👿", "👹", "👺", "🤡", "💩", "👻", "💀", "☠", "👽", "👾", "🤖", "🎃", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", + "😀", "😃", "😄", "😁", "😆", "🥹", "😅", "😂", "🤣", "🥲", "☺", "😊", "😇", "🙂", "🙃", "😉", "😌", "😍", "🥰", "😘", "😗", "😙", "😚", "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🥸", "🤩", "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "☹", "😣", "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😠", "😡", "🤬", "🤯", "😳", "🥵", "🥶", "😶‍🌫", "😱", "😨", "😰", "😥", "😓", "🤗", "🤔", "🫣", "🤭", "🫢", "🫡", "🤫", "🫠", "🤥", "😶", "🫥", "😐", "🫤", "😑", "😬", "🙄", "😯", "😦", "😧", "😮", "😲", "🥱", "😴", "🤤", "😪", "😮‍💨", "😵", "😵‍💫", "🤐", "🥴", "🤢", "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "😈", "👿", "👹", "👺", "🤡", "💩", "👻", "💀", "☠", "👽", "👾", "🤖", "🎃", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", + "🫶", "🤲", "👐", "🙌", @@ -84,11 +85,14 @@ public class EmojiData { "🤜", "🤞", "✌", + "🫰", "🤟", "🤘", "👌", "🤌", "🤏", + "🫳", + "🫴", "👈", "👉", "👆", @@ -100,14 +104,17 @@ public class EmojiData { "🖖", "👋", "🤙", + "🫲", + "🫱", "💪", "🦾", "🖕", "✍", "🙏", + "🫵", "🦶", "🦵", - "🦿", "💄", "💋", "👄", "🦷", "👅", + "🦿", "💄", "💋", "👄", "🫦", "🦷", "👅", "👂", "🦻", "👃", @@ -212,6 +219,7 @@ public class EmojiData { "🤵", "🤵‍♂", "👸", + "🫅", "🤴", "🥷", "🦸‍♀", @@ -229,6 +237,7 @@ public class EmojiData { "🧝‍♀", "🧝", "🧝‍♂", + "🧌", "🧛‍♀", "🧛", "🧛‍♂", @@ -241,6 +250,8 @@ public class EmojiData { "🧚‍♂", "👼", "🤰", + "🫄", + "🫃", "🤱", "👩‍🍼", "🧑‍🍼", @@ -327,7 +338,7 @@ public class EmojiData { null, null, new String[]{ - "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", "🥏", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", "🏏", "🪃", "🥅", "⛳", "🪁", "🏹", "🎣", "🤿", "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸", "🥌", "🎿", "⛷", "🏂", "🪂", + "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", "🥏", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", "🏏", "🪃", "🥅", "⛳", "🪁", "🛝", "🏹", "🎣", "🤿", "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸", "🥌", "🎿", "⛷", "🏂", "🪂", "🏋‍♀", "🏋", "🏋‍♂", @@ -378,9 +389,9 @@ public class EmojiData { }, null, new String[]{ - "⌚", "📱", "📲", "💻", "⌨", "🖥", "🖨", "🖱", "🖲", "🕹", "🗜", "💽", "💾", "💿", "📀", "📼", "📷", "📸", "📹", "🎥", "📽", "🎞", "📞", "☎", "📟", "📠", "📺", "📻", "🎙", "🎚", "🎛", "🧭", "⏱", "⏲", "⏰", "🕰", "⌛", "⏳", "📡", "🔋", "🔌", "💡", "🔦", "🕯", "🪔", "🧯", "🛢", "💸", "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "💎", "⚖", "🪜", "🧰", "🪛", "🔧", "🔨", "⚒", "🛠", "⛏", "🪚", "🔩", "⚙", "🪤", "🧱", "⛓", "🧲", "🔫", "💣", "🧨", "🪓", "🔪", "🗡", "⚔", "🛡", "🚬", "⚰", "🪦", "⚱", "🏺", "🔮", "📿", "🧿", "💈", "⚗", "🔭", "🔬", "🕳", "🩹", "🩺", "💊", "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡", "🧹", "🪠", "🧺", "🧻", "🚽", "🚰", "🚿", "🛁", + "⌚", "📱", "📲", "💻", "⌨", "🖥", "🖨", "🖱", "🖲", "🕹", "🗜", "💽", "💾", "💿", "📀", "📼", "📷", "📸", "📹", "🎥", "📽", "🎞", "📞", "☎", "📟", "📠", "📺", "📻", "🎙", "🎚", "🎛", "🧭", "⏱", "⏲", "⏰", "🕰", "⌛", "⏳", "📡", "🔋", "🪫", "🔌", "💡", "🔦", "🕯", "🪔", "🧯", "🛢", "💸", "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "🪪", "💎", "⚖", "🪜", "🧰", "🪛", "🔧", "🔨", "⚒", "🛠", "⛏", "🪚", "🔩", "⚙", "🪤", "🧱", "⛓", "🧲", "🔫", "💣", "🧨", "🪓", "🔪", "🗡", "⚔", "🛡", "🚬", "⚰", "🪦", "⚱", "🏺", "🔮", "📿", "🧿", "🪬", "💈", "⚗", "🔭", "🔬", "🕳", "🩻", "🩹", "🩺", "💊", "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡", "🧹", "🪠", "🧺", "🧻", "🚽", "🚰", "🚿", "🛁", "🛀", - "🧼", "🪥", "🪒", "🧽", "🪣", "🧴", "🛎", "🔑", "🗝", "🚪", "🪑", "🛋", "🛏", "🛌", "🧸", "🪆", "🖼", "🪞", "🪟", "🛍", "🛒", "🎁", "🎈", "🎏", "🎀", "🪄", "🪅", "🎊", "🎉", "🎎", "🏮", "🎐", "🧧", "✉", "📩", "📨", "📧", "💌", "📥", "📤", "📦", "🏷", "🪧", "📪", "📫", "📬", "📭", "📮", "📯", "📜", "📃", "📄", "📑", "🧾", "📊", "📈", "📉", "🗒", "🗓", "📆", "📅", "🗑", "📇", "🗃", "🗳", "🗄", "📋", "📁", "📂", "🗂", "🗞", "📰", "📓", "📔", "📒", "📕", "📗", "📘", "📙", "📚", "📖", "🔖", "🧷", "🔗", "📎", "🖇", "📐", "📏", "🧮", "📌", "📍", "✂", "🖊", "🖋", "✒", "🖌", "🖍", "📝", "✏", "🔍", "🔎", "🔏", "🔐", "🔒", "🔓" + "🧼", "🪥", "🪒", "🧽", "🪣", "🧴", "🛎", "🔑", "🗝", "🚪", "🪑", "🛋", "🛏", "🛌", "🧸", "🪆", "🖼", "🪞", "🪟", "🛍", "🛒", "🎁", "🎈", "🎏", "🎀", "🪄", "🪅", "🎊", "🎉", "🎎", "🏮", "🎐", "🪩", "🧧", "✉", "📩", "📨", "📧", "💌", "📥", "📤", "📦", "🏷", "🪧", "📪", "📫", "📬", "📭", "📮", "📯", "📜", "📃", "📄", "📑", "🧾", "📊", "📈", "📉", "🗒", "🗓", "📆", "📅", "🗑", "📇", "🗃", "🗳", "🗄", "📋", "📁", "📂", "🗂", "🗞", "📰", "📓", "📔", "📒", "📕", "📗", "📘", "📙", "📚", "📖", "🔖", "🧷", "🔗", "📎", "🖇", "📐", "📏", "🧮", "📌", "📍", "✂", "🖊", "🖋", "✒", "🖌", "🖍", "📝", "✏", "🔍", "🔎", "🔏", "🔐", "🔒", "🔓" }, null, null @@ -433,7 +444,9 @@ public class EmojiData { "🤽", "🤽🏻", "🤽🏼", "🤽🏽", "🤽🏾", "🤽🏿", "🧗", "🧗🏻", "🧗🏼", "🧗🏽", "🧗🏾", "🧗🏿", "🤹", "🤹🏻", "🤹🏼", "🤹🏽", "🤹🏾", "🤹🏿", - "\uD83D\uDC91"}; + "\uD83D\uDC91", + "🕳" + }; public static final String[] aliasNew = new String[]{ "👱‍♂", "👱🏻‍♂", "👱🏼‍♂", "👱🏽‍♂", "👱🏾‍♂", "👱🏿‍♂", @@ -482,29 +495,31 @@ public class EmojiData { "🤽‍♂", "🤽🏻‍♂", "🤽🏼‍♂", "🤽🏽‍♂", "🤽🏾‍♂", "🤽🏿‍♂", "🧗‍♂", "🧗🏻‍♂", "🧗🏼‍♂", "🧗🏽‍♂", "🧗🏾‍♂", "🧗🏿‍♂", "🤹‍♂", "🤹🏻‍♂", "🤹🏼‍♂", "🤹🏽‍♂", "🤹🏾‍♂", "🤹🏿‍♂", - "👩‍❤‍👨"}; + "👩‍❤‍👨", + "🕳️" + }; public static final String[][] data = { new String[]{ - "😀", "😃", "😄", "😁", "😆", "😅", "😂", "🤣", "🥲", "☺", "😊", "😇", "🙂", "🙃", "😉", "😌", "😍", "🥰", "😘", "😗", "😙", "😚", "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🥸", "🤩", "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "☹", "😣", "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😠", "😡", "🤬", "🤯", "😳", "🥵", "🥶", "😶‍🌫", "😱", "😨", "😰", "😥", "😓", "🤗", "🤔", "🤭", "🤫", "🤥", "😶", "😐", "😑", "😬", "🙄", "😯", "😦", "😧", "😮", "😲", "🥱", "😴", "🤤", "😪", "😮‍💨", "😵", "😵‍💫", "🤐", "🥴", "🤢", "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "😈", "👿", "👹", "👺", "🤡", "💩", "👻", "💀", "☠", "👽", "👾", "🤖", "🎃", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", "🤲", "🤲🏻", "🤲🏼", "🤲🏽", "🤲🏾", "🤲🏿", "👐", "👐🏻", "👐🏼", "👐🏽", "👐🏾", "👐🏿", "🙌", "🙌🏻", "🙌🏼", "🙌🏽", "🙌🏾", "🙌🏿", "👏", "👏🏻", "👏🏼", "👏🏽", "👏🏾", "👏🏿", "🤝", "👍", "👍🏻", "👍🏼", "👍🏽", "👍🏾", "👍🏿", "👎", "👎🏻", "👎🏼", "👎🏽", "👎🏾", "👎🏿", "👊", "👊🏻", "👊🏼", "👊🏽", "👊🏾", "👊🏿", "✊", "✊🏻", "✊🏼", "✊🏽", "✊🏾", "✊🏿", "🤛", "🤛🏻", "🤛🏼", "🤛🏽", "🤛🏾", "🤛🏿", "🤜", "🤜🏻", "🤜🏼", "🤜🏽", "🤜🏾", "🤜🏿", "🤞", "🤞🏻", "🤞🏼", "🤞🏽", "🤞🏾", "🤞🏿", "✌", "✌🏻", "✌🏼", "✌🏽", "✌🏾", "✌🏿", "🤟", "🤟🏻", "🤟🏼", "🤟🏽", "🤟🏾", "🤟🏿", "🤘", "🤘🏻", "🤘🏼", "🤘🏽", "🤘🏾", "🤘🏿", "👌", "👌🏻", "👌🏼", "👌🏽", "👌🏾", "👌🏿", "🤌", "🤌🏻", "🤌🏼", "🤌🏽", "🤌🏾", "🤌🏿", "🤏", "🤏🏻", "🤏🏼", "🤏🏽", "🤏🏾", "🤏🏿", "👈", "👈🏻", "👈🏼", "👈🏽", "👈🏾", "👈🏿", "👉", "👉🏻", "👉🏼", "👉🏽", "👉🏾", "👉🏿", "👆", "👆🏻", "👆🏼", "👆🏽", "👆🏾", "👆🏿", "👇", "👇🏻", "👇🏼", "👇🏽", "👇🏾", "👇🏿", "☝", "☝🏻", "☝🏼", "☝🏽", "☝🏾", "☝🏿", "✋", "✋🏻", "✋🏼", "✋🏽", "✋🏾", "✋🏿", "🤚", "🤚🏻", "🤚🏼", "🤚🏽", "🤚🏾", "🤚🏿", "🖐", "🖐🏻", "🖐🏼", "🖐🏽", "🖐🏾", "🖐🏿", "🖖", "🖖🏻", "🖖🏼", "🖖🏽", "🖖🏾", "🖖🏿", "👋", "👋🏻", "👋🏼", "👋🏽", "👋🏾", "👋🏿", "🤙", "🤙🏻", "🤙🏼", "🤙🏽", "🤙🏾", "🤙🏿", "💪", "💪🏻", "💪🏼", "💪🏽", "💪🏾", "💪🏿", "🦾", "🖕", "🖕🏻", "🖕🏼", "🖕🏽", "🖕🏾", "🖕🏿", "✍", "✍🏻", "✍🏼", "✍🏽", "✍🏾", "✍🏿", "🙏", "🙏🏻", "🙏🏼", "🙏🏽", "🙏🏾", "🙏🏿", "🦶", "🦶🏻", "🦶🏼", "🦶🏽", "🦶🏾", "🦶🏿", "🦵", "🦵🏻", "🦵🏼", "🦵🏽", "🦵🏾", "🦵🏿", "🦿", "💄", "💋", "👄", "🦷", "👅", "👂", "👂🏻", "👂🏼", "👂🏽", "👂🏾", "👂🏿", "🦻", "🦻🏻", "🦻🏼", "🦻🏽", "🦻🏾", "🦻🏿", "👃", "👃🏻", "👃🏼", "👃🏽", "👃🏾", "👃🏿", "👣", "👁", "👀", "🫀", "🫁", "🧠", "🗣", "👤", "👥", "🫂", "👶", "👶🏻", "👶🏼", "👶🏽", "👶🏾", "👶🏿", "👧", "👧🏻", "👧🏼", "👧🏽", "👧🏾", "👧🏿", "🧒", "🧒🏻", "🧒🏼", "🧒🏽", "🧒🏾", "🧒🏿", "👦", "👦🏻", "👦🏼", "👦🏽", "👦🏾", "👦🏿", "👩", "👩🏻", "👩🏼", "👩🏽", "👩🏾", "👩🏿", "🧑", "🧑🏻", "🧑🏼", "🧑🏽", "🧑🏾", "🧑🏿", "👨", "👨🏻", "👨🏼", "👨🏽", "👨🏾", "👨🏿", "👩‍🦱", "👩🏻‍🦱", "👩🏼‍🦱", "👩🏽‍🦱", "👩🏾‍🦱", "👩🏿‍🦱", "🧑‍🦱", "🧑🏻‍🦱", "🧑🏼‍🦱", "🧑🏽‍🦱", "🧑🏾‍🦱", "🧑🏿‍🦱", "👨‍🦱", "👨🏻‍🦱", "👨🏼‍🦱", "👨🏽‍🦱", "👨🏾‍🦱", "👨🏿‍🦱", "👩‍🦰", "👩🏻‍🦰", "👩🏼‍🦰", "👩🏽‍🦰", "👩🏾‍🦰", "👩🏿‍🦰", "🧑‍🦰", "🧑🏻‍🦰", "🧑🏼‍🦰", "🧑🏽‍🦰", "🧑🏾‍🦰", "🧑🏿‍🦰", "👨‍🦰", "👨🏻‍🦰", "👨🏼‍🦰", "👨🏽‍🦰", "👨🏾‍🦰", "👨🏿‍🦰", "👱‍♀", "👱🏻‍♀", "👱🏼‍♀", "👱🏽‍♀", "👱🏾‍♀", "👱🏿‍♀", "👱", "👱🏻", "👱🏼", "👱🏽", "👱🏾", "👱🏿", "👱‍♂", "👱🏻‍♂", "👱🏼‍♂", "👱🏽‍♂", "👱🏾‍♂", "👱🏿‍♂", "👩‍🦳", "👩🏻‍🦳", "👩🏼‍🦳", "👩🏽‍🦳", "👩🏾‍🦳", "👩🏿‍🦳", "🧑‍🦳", "🧑🏻‍🦳", "🧑🏼‍🦳", "🧑🏽‍🦳", "🧑🏾‍🦳", "🧑🏿‍🦳", "👨‍🦳", "👨🏻‍🦳", "👨🏼‍🦳", "👨🏽‍🦳", "👨🏾‍🦳", "👨🏿‍🦳", "👩‍🦲", "👩🏻‍🦲", "👩🏼‍🦲", "👩🏽‍🦲", "👩🏾‍🦲", "👩🏿‍🦲", "🧑‍🦲", "🧑🏻‍🦲", "🧑🏼‍🦲", "🧑🏽‍🦲", "🧑🏾‍🦲", "🧑🏿‍🦲", "👨‍🦲", "👨🏻‍🦲", "👨🏼‍🦲", "👨🏽‍🦲", "👨🏾‍🦲", "👨🏿‍🦲", "🧔‍♀", "🧔🏻‍♀", "🧔🏼‍♀", "🧔🏽‍♀", "🧔🏾‍♀", "🧔🏿‍♀", "🧔", "🧔🏻", "🧔🏼", "🧔🏽", "🧔🏾", "🧔🏿", "🧔‍♂", "🧔🏻‍♂", "🧔🏼‍♂", "🧔🏽‍♂", "🧔🏾‍♂", "🧔🏿‍♂", "👵", "👵🏻", "👵🏼", "👵🏽", "👵🏾", "👵🏿", "🧓", "🧓🏻", "🧓🏼", "🧓🏽", "🧓🏾", "🧓🏿", "👴", "👴🏻", "👴🏼", "👴🏽", "👴🏾", "👴🏿", "👲", "👲🏻", "👲🏼", "👲🏽", "👲🏾", "👲🏿", "👳‍♀", "👳🏻‍♀", "👳🏼‍♀", "👳🏽‍♀", "👳🏾‍♀", "👳🏿‍♀", "👳", "👳🏻", "👳🏼", "👳🏽", "👳🏾", "👳🏿", "👳‍♂", "👳🏻‍♂", "👳🏼‍♂", "👳🏽‍♂", "👳🏾‍♂", "👳🏿‍♂", "🧕", "🧕🏻", "🧕🏼", "🧕🏽", "🧕🏾", "🧕🏿", "👮‍♀", "👮🏻‍♀", "👮🏼‍♀", "👮🏽‍♀", "👮🏾‍♀", "👮🏿‍♀", "👮", "👮🏻", "👮🏼", "👮🏽", "👮🏾", "👮🏿", "👮‍♂", "👮🏻‍♂", "👮🏼‍♂", "👮🏽‍♂", "👮🏾‍♂", "👮🏿‍♂", "👷‍♀", "👷🏻‍♀", "👷🏼‍♀", "👷🏽‍♀", "👷🏾‍♀", "👷🏿‍♀", "👷", "👷🏻", "👷🏼", "👷🏽", "👷🏾", "👷🏿", "👷‍♂", "👷🏻‍♂", "👷🏼‍♂", "👷🏽‍♂", "👷🏾‍♂", "👷🏿‍♂", "💂‍♀", "💂🏻‍♀", "💂🏼‍♀", "💂🏽‍♀", "💂🏾‍♀", "💂🏿‍♀", "💂", "💂🏻", "💂🏼", "💂🏽", "💂🏾", "💂🏿", "💂‍♂", "💂🏻‍♂", "💂🏼‍♂", "💂🏽‍♂", "💂🏾‍♂", "💂🏿‍♂", "🕵‍♀", "🕵🏻‍♀", "🕵🏼‍♀", "🕵🏽‍♀", "🕵🏾‍♀", "🕵🏿‍♀", "🕵", "🕵🏻", "🕵🏼", "🕵🏽", "🕵🏾", "🕵🏿", "🕵‍♂", "🕵🏻‍♂", "🕵🏼‍♂", "🕵🏽‍♂", "🕵🏾‍♂", "🕵🏿‍♂", "👩‍⚕", "👩🏻‍⚕", "👩🏼‍⚕", "👩🏽‍⚕", "👩🏾‍⚕", "👩🏿‍⚕", "🧑‍⚕", "🧑🏻‍⚕", "🧑🏼‍⚕", "🧑🏽‍⚕", "🧑🏾‍⚕", "🧑🏿‍⚕", "👨‍⚕", "👨🏻‍⚕", "👨🏼‍⚕", "👨🏽‍⚕", "👨🏾‍⚕", "👨🏿‍⚕", "👩‍🌾", "👩🏻‍🌾", "👩🏼‍🌾", "👩🏽‍🌾", "👩🏾‍🌾", "👩🏿‍🌾", "🧑‍🌾", "🧑🏻‍🌾", "🧑🏼‍🌾", "🧑🏽‍🌾", "🧑🏾‍🌾", "🧑🏿‍🌾", "👨‍🌾", "👨🏻‍🌾", "👨🏼‍🌾", "👨🏽‍🌾", "👨🏾‍🌾", "👨🏿‍🌾", "👩‍🍳", "👩🏻‍🍳", "👩🏼‍🍳", "👩🏽‍🍳", "👩🏾‍🍳", "👩🏿‍🍳", "🧑‍🍳", "🧑🏻‍🍳", "🧑🏼‍🍳", "🧑🏽‍🍳", "🧑🏾‍🍳", "🧑🏿‍🍳", "👨‍🍳", "👨🏻‍🍳", "👨🏼‍🍳", "👨🏽‍🍳", "👨🏾‍🍳", "👨🏿‍🍳", "👩‍🎓", "👩🏻‍🎓", "👩🏼‍🎓", "👩🏽‍🎓", "👩🏾‍🎓", "👩🏿‍🎓", "🧑‍🎓", "🧑🏻‍🎓", "🧑🏼‍🎓", "🧑🏽‍🎓", "🧑🏾‍🎓", "🧑🏿‍🎓", "👨‍🎓", "👨🏻‍🎓", "👨🏼‍🎓", "👨🏽‍🎓", "👨🏾‍🎓", "👨🏿‍🎓", "👩‍🎤", "👩🏻‍🎤", "👩🏼‍🎤", "👩🏽‍🎤", "👩🏾‍🎤", "👩🏿‍🎤", "🧑‍🎤", "🧑🏻‍🎤", "🧑🏼‍🎤", "🧑🏽‍🎤", "🧑🏾‍🎤", "🧑🏿‍🎤", "👨‍🎤", "👨🏻‍🎤", "👨🏼‍🎤", "👨🏽‍🎤", "👨🏾‍🎤", "👨🏿‍🎤", "👩‍🏫", "👩🏻‍🏫", "👩🏼‍🏫", "👩🏽‍🏫", "👩🏾‍🏫", "👩🏿‍🏫", "🧑‍🏫", "🧑🏻‍🏫", "🧑🏼‍🏫", "🧑🏽‍🏫", "🧑🏾‍🏫", "🧑🏿‍🏫", "👨‍🏫", "👨🏻‍🏫", "👨🏼‍🏫", "👨🏽‍🏫", "👨🏾‍🏫", "👨🏿‍🏫", "👩‍🏭", "👩🏻‍🏭", "👩🏼‍🏭", "👩🏽‍🏭", "👩🏾‍🏭", "👩🏿‍🏭", "🧑‍🏭", "🧑🏻‍🏭", "🧑🏼‍🏭", "🧑🏽‍🏭", "🧑🏾‍🏭", "🧑🏿‍🏭", "👨‍🏭", "👨🏻‍🏭", "👨🏼‍🏭", "👨🏽‍🏭", "👨🏾‍🏭", "👨🏿‍🏭", "👩‍💻", "👩🏻‍💻", "👩🏼‍💻", "👩🏽‍💻", "👩🏾‍💻", "👩🏿‍💻", "🧑‍💻", "🧑🏻‍💻", "🧑🏼‍💻", "🧑🏽‍💻", "🧑🏾‍💻", "🧑🏿‍💻", "👨‍💻", "👨🏻‍💻", "👨🏼‍💻", "👨🏽‍💻", "👨🏾‍💻", "👨🏿‍💻", "👩‍💼", "👩🏻‍💼", "👩🏼‍💼", "👩🏽‍💼", "👩🏾‍💼", "👩🏿‍💼", "🧑‍💼", "🧑🏻‍💼", "🧑🏼‍💼", "🧑🏽‍💼", "🧑🏾‍💼", "🧑🏿‍💼", "👨‍💼", "👨🏻‍💼", "👨🏼‍💼", "👨🏽‍💼", "👨🏾‍💼", "👨🏿‍💼", "👩‍🔧", "👩🏻‍🔧", "👩🏼‍🔧", "👩🏽‍🔧", "👩🏾‍🔧", "👩🏿‍🔧", "🧑‍🔧", "🧑🏻‍🔧", "🧑🏼‍🔧", "🧑🏽‍🔧", "🧑🏾‍🔧", "🧑🏿‍🔧", "👨‍🔧", "👨🏻‍🔧", "👨🏼‍🔧", "👨🏽‍🔧", "👨🏾‍🔧", "👨🏿‍🔧", "👩‍🔬", "👩🏻‍🔬", "👩🏼‍🔬", "👩🏽‍🔬", "👩🏾‍🔬", "👩🏿‍🔬", "🧑‍🔬", "🧑🏻‍🔬", "🧑🏼‍🔬", "🧑🏽‍🔬", "🧑🏾‍🔬", "🧑🏿‍🔬", "👨‍🔬", "👨🏻‍🔬", "👨🏼‍🔬", "👨🏽‍🔬", "👨🏾‍🔬", "👨🏿‍🔬", "👩‍🎨", "👩🏻‍🎨", "👩🏼‍🎨", "👩🏽‍🎨", "👩🏾‍🎨", "👩🏿‍🎨", "🧑‍🎨", "🧑🏻‍🎨", "🧑🏼‍🎨", "🧑🏽‍🎨", "🧑🏾‍🎨", "🧑🏿‍🎨", "👨‍🎨", "👨🏻‍🎨", "👨🏼‍🎨", "👨🏽‍🎨", "👨🏾‍🎨", "👨🏿‍🎨", "👩‍🚒", "👩🏻‍🚒", "👩🏼‍🚒", "👩🏽‍🚒", "👩🏾‍🚒", "👩🏿‍🚒", "🧑‍🚒", "🧑🏻‍🚒", "🧑🏼‍🚒", "🧑🏽‍🚒", "🧑🏾‍🚒", "🧑🏿‍🚒", "👨‍🚒", "👨🏻‍🚒", "👨🏼‍🚒", "👨🏽‍🚒", "👨🏾‍🚒", "👨🏿‍🚒", "👩‍✈", "👩🏻‍✈", "👩🏼‍✈", "👩🏽‍✈", "👩🏾‍✈", "👩🏿‍✈", "🧑‍✈", "🧑🏻‍✈", "🧑🏼‍✈", "🧑🏽‍✈", "🧑🏾‍✈", "🧑🏿‍✈", "👨‍✈", "👨🏻‍✈", "👨🏼‍✈", "👨🏽‍✈", "👨🏾‍✈", "👨🏿‍✈", "👩‍🚀", "👩🏻‍🚀", "👩🏼‍🚀", "👩🏽‍🚀", "👩🏾‍🚀", "👩🏿‍🚀", "🧑‍🚀", "🧑🏻‍🚀", "🧑🏼‍🚀", "🧑🏽‍🚀", "🧑🏾‍🚀", "🧑🏿‍🚀", "👨‍🚀", "👨🏻‍🚀", "👨🏼‍🚀", "👨🏽‍🚀", "👨🏾‍🚀", "👨🏿‍🚀", "👩‍⚖", "👩🏻‍⚖", "👩🏼‍⚖", "👩🏽‍⚖", "👩🏾‍⚖", "👩🏿‍⚖", "🧑‍⚖", "🧑🏻‍⚖", "🧑🏼‍⚖", "🧑🏽‍⚖", "🧑🏾‍⚖", "🧑🏿‍⚖", "👨‍⚖", "👨🏻‍⚖", "👨🏼‍⚖", "👨🏽‍⚖", "👨🏾‍⚖", "👨🏿‍⚖", "👰‍♀", "👰🏻‍♀", "👰🏼‍♀", "👰🏽‍♀", "👰🏾‍♀", "👰🏿‍♀", "👰", "👰🏻", "👰🏼", "👰🏽", "👰🏾", "👰🏿", "👰‍♂", "👰🏻‍♂", "👰🏼‍♂", "👰🏽‍♂", "👰🏾‍♂", "👰🏿‍♂", "🤵‍♀", "🤵🏻‍♀", "🤵🏼‍♀", "🤵🏽‍♀", "🤵🏾‍♀", "🤵🏿‍♀", "🤵", "🤵🏻", "🤵🏼", "🤵🏽", "🤵🏾", "🤵🏿", "🤵‍♂", "🤵🏻‍♂", "🤵🏼‍♂", "🤵🏽‍♂", "🤵🏾‍♂", "🤵🏿‍♂", "👸", "👸🏻", "👸🏼", "👸🏽", "👸🏾", "👸🏿", "🤴", "🤴🏻", "🤴🏼", "🤴🏽", "🤴🏾", "🤴🏿", "🥷", "🥷🏻", "🥷🏼", "🥷🏽", "🥷🏾", "🥷🏿", "🦸‍♀", "🦸🏻‍♀", "🦸🏼‍♀", "🦸🏽‍♀", "🦸🏾‍♀", "🦸🏿‍♀", "🦸", "🦸🏻", "🦸🏼", "🦸🏽", "🦸🏾", "🦸🏿", "🦸‍♂", "🦸🏻‍♂", "🦸🏼‍♂", "🦸🏽‍♂", "🦸🏾‍♂", "🦸🏿‍♂", "🦹‍♀", "🦹🏻‍♀", "🦹🏼‍♀", "🦹🏽‍♀", "🦹🏾‍♀", "🦹🏿‍♀", "🦹", "🦹🏻", "🦹🏼", "🦹🏽", "🦹🏾", "🦹🏿", "🦹‍♂", "🦹🏻‍♂", "🦹🏼‍♂", "🦹🏽‍♂", "🦹🏾‍♂", "🦹🏿‍♂", "🤶", "🤶🏻", "🤶🏼", "🤶🏽", "🤶🏾", "🤶🏿", "🧑‍🎄", "🧑🏻‍🎄", "🧑🏼‍🎄", "🧑🏽‍🎄", "🧑🏾‍🎄", "🧑🏿‍🎄", "🎅", "🎅🏻", "🎅🏼", "🎅🏽", "🎅🏾", "🎅🏿", "🧙‍♀", "🧙🏻‍♀", "🧙🏼‍♀", "🧙🏽‍♀", "🧙🏾‍♀", "🧙🏿‍♀", "🧙", "🧙🏻", "🧙🏼", "🧙🏽", "🧙🏾", "🧙🏿", "🧙‍♂", "🧙🏻‍♂", "🧙🏼‍♂", "🧙🏽‍♂", "🧙🏾‍♂", "🧙🏿‍♂", "🧝‍♀", "🧝🏻‍♀", "🧝🏼‍♀", "🧝🏽‍♀", "🧝🏾‍♀", "🧝🏿‍♀", "🧝", "🧝🏻", "🧝🏼", "🧝🏽", "🧝🏾", "🧝🏿", "🧝‍♂", "🧝🏻‍♂", "🧝🏼‍♂", "🧝🏽‍♂", "🧝🏾‍♂", "🧝🏿‍♂", "🧛‍♀", "🧛🏻‍♀", "🧛🏼‍♀", "🧛🏽‍♀", "🧛🏾‍♀", "🧛🏿‍♀", "🧛", "🧛🏻", "🧛🏼", "🧛🏽", "🧛🏾", "🧛🏿", "🧛‍♂", "🧛🏻‍♂", "🧛🏼‍♂", "🧛🏽‍♂", "🧛🏾‍♂", "🧛🏿‍♂", "🧟‍♀", "🧟", "🧟‍♂", "🧞‍♀", "🧞", "🧞‍♂", "🧜‍♀", "🧜🏻‍♀", "🧜🏼‍♀", "🧜🏽‍♀", "🧜🏾‍♀", "🧜🏿‍♀", "🧜", "🧜🏻", "🧜🏼", "🧜🏽", "🧜🏾", "🧜🏿", "🧜‍♂", "🧜🏻‍♂", "🧜🏼‍♂", "🧜🏽‍♂", "🧜🏾‍♂", "🧜🏿‍♂", "🧚‍♀", "🧚🏻‍♀", "🧚🏼‍♀", "🧚🏽‍♀", "🧚🏾‍♀", "🧚🏿‍♀", "🧚", "🧚🏻", "🧚🏼", "🧚🏽", "🧚🏾", "🧚🏿", "🧚‍♂", "🧚🏻‍♂", "🧚🏼‍♂", "🧚🏽‍♂", "🧚🏾‍♂", "🧚🏿‍♂", "👼", "👼🏻", "👼🏼", "👼🏽", "👼🏾", "👼🏿", "🤰", "🤰🏻", "🤰🏼", "🤰🏽", "🤰🏾", "🤰🏿", "🤱", "🤱🏻", "🤱🏼", "🤱🏽", "🤱🏾", "🤱🏿", "👩‍🍼", "👩🏻‍🍼", "👩🏼‍🍼", "👩🏽‍🍼", "👩🏾‍🍼", "👩🏿‍🍼", "🧑‍🍼", "🧑🏻‍🍼", "🧑🏼‍🍼", "🧑🏽‍🍼", "🧑🏾‍🍼", "🧑🏿‍🍼", "👨‍🍼", "👨🏻‍🍼", "👨🏼‍🍼", "👨🏽‍🍼", "👨🏾‍🍼", "👨🏿‍🍼", "🙇‍♀", "🙇🏻‍♀", "🙇🏼‍♀", "🙇🏽‍♀", "🙇🏾‍♀", "🙇🏿‍♀", "🙇", "🙇🏻", "🙇🏼", "🙇🏽", "🙇🏾", "🙇🏿", "🙇‍♂", "🙇🏻‍♂", "🙇🏼‍♂", "🙇🏽‍♂", "🙇🏾‍♂", "🙇🏿‍♂", "💁‍♀", "💁🏻‍♀", "💁🏼‍♀", "💁🏽‍♀", "💁🏾‍♀", "💁🏿‍♀", "💁", "💁🏻", "💁🏼", "💁🏽", "💁🏾", "💁🏿", "💁‍♂", "💁🏻‍♂", "💁🏼‍♂", "💁🏽‍♂", "💁🏾‍♂", "💁🏿‍♂", "🙅‍♀", "🙅🏻‍♀", "🙅🏼‍♀", "🙅🏽‍♀", "🙅🏾‍♀", "🙅🏿‍♀", "🙅", "🙅🏻", "🙅🏼", "🙅🏽", "🙅🏾", "🙅🏿", "🙅‍♂", "🙅🏻‍♂", "🙅🏼‍♂", "🙅🏽‍♂", "🙅🏾‍♂", "🙅🏿‍♂", "🙆‍♀", "🙆🏻‍♀", "🙆🏼‍♀", "🙆🏽‍♀", "🙆🏾‍♀", "🙆🏿‍♀", "🙆", "🙆🏻", "🙆🏼", "🙆🏽", "🙆🏾", "🙆🏿", "🙆‍♂", "🙆🏻‍♂", "🙆🏼‍♂", "🙆🏽‍♂", "🙆🏾‍♂", "🙆🏿‍♂", "🙋‍♀", "🙋🏻‍♀", "🙋🏼‍♀", "🙋🏽‍♀", "🙋🏾‍♀", "🙋🏿‍♀", "🙋", "🙋🏻", "🙋🏼", "🙋🏽", "🙋🏾", "🙋🏿", "🙋‍♂", "🙋🏻‍♂", "🙋🏼‍♂", "🙋🏽‍♂", "🙋🏾‍♂", "🙋🏿‍♂", "🧏‍♀", "🧏🏻‍♀", "🧏🏼‍♀", "🧏🏽‍♀", "🧏🏾‍♀", "🧏🏿‍♀", "🧏", "🧏🏻", "🧏🏼", "🧏🏽", "🧏🏾", "🧏🏿", "🧏‍♂", "🧏🏻‍♂", "🧏🏼‍♂", "🧏🏽‍♂", "🧏🏾‍♂", "🧏🏿‍♂", "🤦‍♀", "🤦🏻‍♀", "🤦🏼‍♀", "🤦🏽‍♀", "🤦🏾‍♀", "🤦🏿‍♀", "🤦", "🤦🏻", "🤦🏼", "🤦🏽", "🤦🏾", "🤦🏿", "🤦‍♂", "🤦🏻‍♂", "🤦🏼‍♂", "🤦🏽‍♂", "🤦🏾‍♂", "🤦🏿‍♂", "🤷‍♀", "🤷🏻‍♀", "🤷🏼‍♀", "🤷🏽‍♀", "🤷🏾‍♀", "🤷🏿‍♀", "🤷", "🤷🏻", "🤷🏼", "🤷🏽", "🤷🏾", "🤷🏿", "🤷‍♂", "🤷🏻‍♂", "🤷🏼‍♂", "🤷🏽‍♂", "🤷🏾‍♂", "🤷🏿‍♂", "🙎‍♀", "🙎🏻‍♀", "🙎🏼‍♀", "🙎🏽‍♀", "🙎🏾‍♀", "🙎🏿‍♀", "🙎", "🙎🏻", "🙎🏼", "🙎🏽", "🙎🏾", "🙎🏿", "🙎‍♂", "🙎🏻‍♂", "🙎🏼‍♂", "🙎🏽‍♂", "🙎🏾‍♂", "🙎🏿‍♂", "🙍‍♀", "🙍🏻‍♀", "🙍🏼‍♀", "🙍🏽‍♀", "🙍🏾‍♀", "🙍🏿‍♀", "🙍", "🙍🏻", "🙍🏼", "🙍🏽", "🙍🏾", "🙍🏿", "🙍‍♂", "🙍🏻‍♂", "🙍🏼‍♂", "🙍🏽‍♂", "🙍🏾‍♂", "🙍🏿‍♂", "💇‍♀", "💇🏻‍♀", "💇🏼‍♀", "💇🏽‍♀", "💇🏾‍♀", "💇🏿‍♀", "💇", "💇🏻", "💇🏼", "💇🏽", "💇🏾", "💇🏿", "💇‍♂", "💇🏻‍♂", "💇🏼‍♂", "💇🏽‍♂", "💇🏾‍♂", "💇🏿‍♂", "💆‍♀", "💆🏻‍♀", "💆🏼‍♀", "💆🏽‍♀", "💆🏾‍♀", "💆🏿‍♀", "💆", "💆🏻", "💆🏼", "💆🏽", "💆🏾", "💆🏿", "💆‍♂", "💆🏻‍♂", "💆🏼‍♂", "💆🏽‍♂", "💆🏾‍♂", "💆🏿‍♂", "🧖‍♀", "🧖🏻‍♀", "🧖🏼‍♀", "🧖🏽‍♀", "🧖🏾‍♀", "🧖🏿‍♀", "🧖", "🧖🏻", "🧖🏼", "🧖🏽", "🧖🏾", "🧖🏿", "🧖‍♂", "🧖🏻‍♂", "🧖🏼‍♂", "🧖🏽‍♂", "🧖🏾‍♂", "🧖🏿‍♂", "💅", "💅🏻", "💅🏼", "💅🏽", "💅🏾", "💅🏿", "🤳", "🤳🏻", "🤳🏼", "🤳🏽", "🤳🏾", "🤳🏿", "💃", "💃🏻", "💃🏼", "💃🏽", "💃🏾", "💃🏿", "🕺", "🕺🏻", "🕺🏼", "🕺🏽", "🕺🏾", "🕺🏿", "👯‍♀", "👯", "👯‍♂", "🕴", "🕴🏻", "🕴🏼", "🕴🏽", "🕴🏾", "🕴🏿", "👩‍🦽", "👩🏻‍🦽", "👩🏼‍🦽", "👩🏽‍🦽", "👩🏾‍🦽", "👩🏿‍🦽", "🧑‍🦽", "🧑🏻‍🦽", "🧑🏼‍🦽", "🧑🏽‍🦽", "🧑🏾‍🦽", "🧑🏿‍🦽", "👨‍🦽", "👨🏻‍🦽", "👨🏼‍🦽", "👨🏽‍🦽", "👨🏾‍🦽", "👨🏿‍🦽", "👩‍🦼", "👩🏻‍🦼", "👩🏼‍🦼", "👩🏽‍🦼", "👩🏾‍🦼", "👩🏿‍🦼", "🧑‍🦼", "🧑🏻‍🦼", "🧑🏼‍🦼", "🧑🏽‍🦼", "🧑🏾‍🦼", "🧑🏿‍🦼", "👨‍🦼", "👨🏻‍🦼", "👨🏼‍🦼", "👨🏽‍🦼", "👨🏾‍🦼", "👨🏿‍🦼", "🚶‍♀", "🚶🏻‍♀", "🚶🏼‍♀", "🚶🏽‍♀", "🚶🏾‍♀", "🚶🏿‍♀", "🚶", "🚶🏻", "🚶🏼", "🚶🏽", "🚶🏾", "🚶🏿", "🚶‍♂", "🚶🏻‍♂", "🚶🏼‍♂", "🚶🏽‍♂", "🚶🏾‍♂", "🚶🏿‍♂", "👩‍🦯", "👩🏻‍🦯", "👩🏼‍🦯", "👩🏽‍🦯", "👩🏾‍🦯", "👩🏿‍🦯", "🧑‍🦯", "🧑🏻‍🦯", "🧑🏼‍🦯", "🧑🏽‍🦯", "🧑🏾‍🦯", "🧑🏿‍🦯", "👨‍🦯", "👨🏻‍🦯", "👨🏼‍🦯", "👨🏽‍🦯", "👨🏾‍🦯", "👨🏿‍🦯", "🧎‍♀", "🧎🏻‍♀", "🧎🏼‍♀", "🧎🏽‍♀", "🧎🏾‍♀", "🧎🏿‍♀", "🧎", "🧎🏻", "🧎🏼", "🧎🏽", "🧎🏾", "🧎🏿", "🧎‍♂", "🧎🏻‍♂", "🧎🏼‍♂", "🧎🏽‍♂", "🧎🏾‍♂", "🧎🏿‍♂", "🏃‍♀", "🏃🏻‍♀", "🏃🏼‍♀", "🏃🏽‍♀", "🏃🏾‍♀", "🏃🏿‍♀", "🏃", "🏃🏻", "🏃🏼", "🏃🏽", "🏃🏾", "🏃🏿", "🏃‍♂", "🏃🏻‍♂", "🏃🏼‍♂", "🏃🏽‍♂", "🏃🏾‍♂", "🏃🏿‍♂", "🧍‍♀", "🧍🏻‍♀", "🧍🏼‍♀", "🧍🏽‍♀", "🧍🏾‍♀", "🧍🏿‍♀", "🧍", "🧍🏻", "🧍🏼", "🧍🏽", "🧍🏾", "🧍🏿", "🧍‍♂", "🧍🏻‍♂", "🧍🏼‍♂", "🧍🏽‍♂", "🧍🏾‍♂", "🧍🏿‍♂", "👫", "👫🏻", "👩🏻‍🤝‍👨🏼", "👩🏻‍🤝‍👨🏽", "👩🏻‍🤝‍👨🏾", "👩🏻‍🤝‍👨🏿", "👩🏼‍🤝‍👨🏻", "👫🏼", "👩🏼‍🤝‍👨🏽", "👩🏼‍🤝‍👨🏾", "👩🏼‍🤝‍👨🏿", "👩🏽‍🤝‍👨🏻", "👩🏽‍🤝‍👨🏼", "👫🏽", "👩🏽‍🤝‍👨🏾", "👩🏽‍🤝‍👨🏿", "👩🏾‍🤝‍👨🏻", "👩🏾‍🤝‍👨🏼", "👩🏾‍🤝‍👨🏽", "👫🏾", "👩🏾‍🤝‍👨🏿", "👩🏿‍🤝‍👨🏻", "👩🏿‍🤝‍👨🏼", "👩🏿‍🤝‍👨🏽", "👩🏿‍🤝‍👨🏾", "👫🏿", "👭", "👭🏻", "👩🏻‍🤝‍👩🏼", "👩🏻‍🤝‍👩🏽", "👩🏻‍🤝‍👩🏾", "👩🏻‍🤝‍👩🏿", "👩🏼‍🤝‍👩🏻", "👭🏼", "👩🏼‍🤝‍👩🏽", "👩🏼‍🤝‍👩🏾", "👩🏼‍🤝‍👩🏿", "👩🏽‍🤝‍👩🏻", "👩🏽‍🤝‍👩🏼", "👭🏽", "👩🏽‍🤝‍👩🏾", "👩🏽‍🤝‍👩🏿", "👩🏾‍🤝‍👩🏻", "👩🏾‍🤝‍👩🏼", "👩🏾‍🤝‍👩🏽", "👭🏾", "👩🏾‍🤝‍👩🏿", "👩🏿‍🤝‍👩🏻", "👩🏿‍🤝‍👩🏼", "👩🏿‍🤝‍👩🏽", "👩🏿‍🤝‍👩🏾", "👭🏿", "👬", "👬🏻", "👨🏻‍🤝‍👨🏼", "👨🏻‍🤝‍👨🏽", "👨🏻‍🤝‍👨🏾", "👨🏻‍🤝‍👨🏿", "👨🏼‍🤝‍👨🏻", "👬🏼", "👨🏼‍🤝‍👨🏽", "👨🏼‍🤝‍👨🏾", "👨🏼‍🤝‍👨🏿", "👨🏽‍🤝‍👨🏻", "👨🏽‍🤝‍👨🏼", "👬🏽", "👨🏽‍🤝‍👨🏾", "👨🏽‍🤝‍👨🏿", "👨🏾‍🤝‍👨🏻", "👨🏾‍🤝‍👨🏼", "👨🏾‍🤝‍👨🏽", "👬🏾", "👨🏾‍🤝‍👨🏿", "👨🏿‍🤝‍👨🏻", "👨🏿‍🤝‍👨🏼", "👨🏿‍🤝‍👨🏽", "👨🏿‍🤝‍👨🏾", "👬🏿", "👩‍❤‍👨", "👩🏻‍❤‍👨🏻", "👩🏻‍❤‍👨🏼", "👩🏻‍❤‍👨🏽", "👩🏻‍❤‍👨🏾", "👩🏻‍❤‍👨🏿", "👩🏼‍❤‍👨🏻", "👩🏼‍❤‍👨🏼", "👩🏼‍❤‍👨🏽", "👩🏼‍❤‍👨🏾", "👩🏼‍❤‍👨🏿", "👩🏽‍❤‍👨🏻", "👩🏽‍❤‍👨🏼", "👩🏽‍❤‍👨🏽", "👩🏽‍❤‍👨🏾", "👩🏽‍❤‍👨🏿", "👩🏾‍❤‍👨🏻", "👩🏾‍❤‍👨🏼", "👩🏾‍❤‍👨🏽", "👩🏾‍❤‍👨🏾", "👩🏾‍❤‍👨🏿", "👩🏿‍❤‍👨🏻", "👩🏿‍❤‍👨🏼", "👩🏿‍❤‍👨🏽", "👩🏿‍❤‍👨🏾", "👩🏿‍❤‍👨🏿", "👩‍❤‍👩", "👩🏻‍❤‍👩🏻", "👩🏻‍❤‍👩🏼", "👩🏻‍❤‍👩🏽", "👩🏻‍❤‍👩🏾", "👩🏻‍❤‍👩🏿", "👩🏼‍❤‍👩🏻", "👩🏼‍❤‍👩🏼", "👩🏼‍❤‍👩🏽", "👩🏼‍❤‍👩🏾", "👩🏼‍❤‍👩🏿", "👩🏽‍❤‍👩🏻", "👩🏽‍❤‍👩🏼", "👩🏽‍❤‍👩🏽", "👩🏽‍❤‍👩🏾", "👩🏽‍❤‍👩🏿", "👩🏾‍❤‍👩🏻", "👩🏾‍❤‍👩🏼", "👩🏾‍❤‍👩🏽", "👩🏾‍❤‍👩🏾", "👩🏾‍❤‍👩🏿", "👩🏿‍❤‍👩🏻", "👩🏿‍❤‍👩🏼", "👩🏿‍❤‍👩🏽", "👩🏿‍❤‍👩🏾", "👩🏿‍❤‍👩🏿", "💑", "🧑🏻‍❤‍🧑🏻", "🧑🏻‍❤‍🧑🏼", "🧑🏻‍❤‍🧑🏽", "🧑🏻‍❤‍🧑🏾", "🧑🏻‍❤‍🧑🏿", "🧑🏼‍❤‍🧑🏻", "🧑🏼‍❤‍🧑🏼", "🧑🏼‍❤‍🧑🏽", "🧑🏼‍❤‍🧑🏾", "🧑🏼‍❤‍🧑🏿", "🧑🏽‍❤‍🧑🏻", "🧑🏽‍❤‍🧑🏼", "🧑🏽‍❤‍🧑🏽", "🧑🏽‍❤‍🧑🏾", "🧑🏽‍❤‍🧑🏿", "🧑🏾‍❤‍🧑🏻", "🧑🏾‍❤‍🧑🏼", "🧑🏾‍❤‍🧑🏽", "🧑🏾‍❤‍🧑🏾", "🧑🏾‍❤‍🧑🏿", "🧑🏿‍❤‍🧑🏻", "🧑🏿‍❤‍🧑🏼", "🧑🏿‍❤‍🧑🏽", "🧑🏿‍❤‍🧑🏾", "🧑🏿‍❤‍🧑🏿", "👨‍❤‍👨", "👨🏻‍❤‍👨🏻", "👨🏻‍❤‍👨🏼", "👨🏻‍❤‍👨🏽", "👨🏻‍❤‍👨🏾", "👨🏻‍❤‍👨🏿", "👨🏼‍❤‍👨🏻", "👨🏼‍❤‍👨🏼", "👨🏼‍❤‍👨🏽", "👨🏼‍❤‍👨🏾", "👨🏼‍❤‍👨🏿", "👨🏽‍❤‍👨🏻", "👨🏽‍❤‍👨🏼", "👨🏽‍❤‍👨🏽", "👨🏽‍❤‍👨🏾", "👨🏽‍❤‍👨🏿", "👨🏾‍❤‍👨🏻", "👨🏾‍❤‍👨🏼", "👨🏾‍❤‍👨🏽", "👨🏾‍❤‍👨🏾", "👨🏾‍❤‍👨🏿", "👨🏿‍❤‍👨🏻", "👨🏿‍❤‍👨🏼", "👨🏿‍❤‍👨🏽", "👨🏿‍❤‍👨🏾", "👨🏿‍❤‍👨🏿", "👩‍❤‍💋‍👨", "👩🏻‍❤‍💋‍👨🏻", "👩🏻‍❤‍💋‍👨🏼", "👩🏻‍❤‍💋‍👨🏽", "👩🏻‍❤‍💋‍👨🏾", "👩🏻‍❤‍💋‍👨🏿", "👩🏼‍❤‍💋‍👨🏻", "👩🏼‍❤‍💋‍👨🏼", "👩🏼‍❤‍💋‍👨🏽", "👩🏼‍❤‍💋‍👨🏾", "👩🏼‍❤‍💋‍👨🏿", "👩🏽‍❤‍💋‍👨🏻", "👩🏽‍❤‍💋‍👨🏼", "👩🏽‍❤‍💋‍👨🏽", "👩🏽‍❤‍💋‍👨🏾", "👩🏽‍❤‍💋‍👨🏿", "👩🏾‍❤‍💋‍👨🏻", "👩🏾‍❤‍💋‍👨🏼", "👩🏾‍❤‍💋‍👨🏽", "👩🏾‍❤‍💋‍👨🏾", "👩🏾‍❤‍💋‍👨🏿", "👩🏿‍❤‍💋‍👨🏻", "👩🏿‍❤‍💋‍👨🏼", "👩🏿‍❤‍💋‍👨🏽", "👩🏿‍❤‍💋‍👨🏾", "👩🏿‍❤‍💋‍👨🏿", "👩‍❤‍💋‍👩", "👩🏻‍❤‍💋‍👩🏻", "👩🏻‍❤‍💋‍👩🏼", "👩🏻‍❤‍💋‍👩🏽", "👩🏻‍❤‍💋‍👩🏾", "👩🏻‍❤‍💋‍👩🏿", "👩🏼‍❤‍💋‍👩🏻", "👩🏼‍❤‍💋‍👩🏼", "👩🏼‍❤‍💋‍👩🏽", "👩🏼‍❤‍💋‍👩🏾", "👩🏼‍❤‍💋‍👩🏿", "👩🏽‍❤‍💋‍👩🏻", "👩🏽‍❤‍💋‍👩🏼", "👩🏽‍❤‍💋‍👩🏽", "👩🏽‍❤‍💋‍👩🏾", "👩🏽‍❤‍💋‍👩🏿", "👩🏾‍❤‍💋‍👩🏻", "👩🏾‍❤‍💋‍👩🏼", "👩🏾‍❤‍💋‍👩🏽", "👩🏾‍❤‍💋‍👩🏾", "👩🏾‍❤‍💋‍👩🏿", "👩🏿‍❤‍💋‍👩🏻", "👩🏿‍❤‍💋‍👩🏼", "👩🏿‍❤‍💋‍👩🏽", "👩🏿‍❤‍💋‍👩🏾", "👩🏿‍❤‍💋‍👩🏿", "💏", "🧑🏻‍❤‍💋‍🧑🏻", "🧑🏻‍❤‍💋‍🧑🏼", "🧑🏻‍❤‍💋‍🧑🏽", "🧑🏻‍❤‍💋‍🧑🏾", "🧑🏻‍❤‍💋‍🧑🏿", "🧑🏼‍❤‍💋‍🧑🏻", "🧑🏼‍❤‍💋‍🧑🏼", "🧑🏼‍❤‍💋‍🧑🏽", "🧑🏼‍❤‍💋‍🧑🏾", "🧑🏼‍❤‍💋‍🧑🏿", "🧑🏽‍❤‍💋‍🧑🏻", "🧑🏽‍❤‍💋‍🧑🏼", "🧑🏽‍❤‍💋‍🧑🏽", "🧑🏽‍❤‍💋‍🧑🏾", "🧑🏽‍❤‍💋‍🧑🏿", "🧑🏾‍❤‍💋‍🧑🏻", "🧑🏾‍❤‍💋‍🧑🏼", "🧑🏾‍❤‍💋‍🧑🏽", "🧑🏾‍❤‍💋‍🧑🏾", "🧑🏾‍❤‍💋‍🧑🏿", "🧑🏿‍❤‍💋‍🧑🏻", "🧑🏿‍❤‍💋‍🧑🏼", "🧑🏿‍❤‍💋‍🧑🏽", "🧑🏿‍❤‍💋‍🧑🏾", "🧑🏿‍❤‍💋‍🧑🏿", "👨‍❤‍💋‍👨", "👨🏻‍❤‍💋‍👨🏻", "👨🏻‍❤‍💋‍👨🏼", "👨🏻‍❤‍💋‍👨🏽", "👨🏻‍❤‍💋‍👨🏾", "👨🏻‍❤‍💋‍👨🏿", "👨🏼‍❤‍💋‍👨🏻", "👨🏼‍❤‍💋‍👨🏼", "👨🏼‍❤‍💋‍👨🏽", "👨🏼‍❤‍💋‍👨🏾", "👨🏼‍❤‍💋‍👨🏿", "👨🏽‍❤‍💋‍👨🏻", "👨🏽‍❤‍💋‍👨🏼", "👨🏽‍❤‍💋‍👨🏽", "👨🏽‍❤‍💋‍👨🏾", "👨🏽‍❤‍💋‍👨🏿", "👨🏾‍❤‍💋‍👨🏻", "👨🏾‍❤‍💋‍👨🏼", "👨🏾‍❤‍💋‍👨🏽", "👨🏾‍❤‍💋‍👨🏾", "👨🏾‍❤‍💋‍👨🏿", "👨🏿‍❤‍💋‍👨🏻", "👨🏿‍❤‍💋‍👨🏼", "👨🏿‍❤‍💋‍👨🏽", "👨🏿‍❤‍💋‍👨🏾", "👨🏿‍❤‍💋‍👨🏿", "👨‍👩‍👦", "👨‍👩‍👧", "👨‍👩‍👧‍👦", "👨‍👩‍👦‍👦", "👨‍👩‍👧‍👧", "👩‍👩‍👦", "👩‍👩‍👧", "👩‍👩‍👧‍👦", "👩‍👩‍👦‍👦", "👩‍👩‍👧‍👧", "👨‍👨‍👦", "👨‍👨‍👧", "👨‍👨‍👧‍👦", "👨‍👨‍👦‍👦", "👨‍👨‍👧‍👧", "👩‍👦", "👩‍👧", "👩‍👧‍👦", "👩‍👦‍👦", "👩‍👧‍👧", "👨‍👦", "👨‍👧", "👨‍👧‍👦", "👨‍👦‍👦", "👨‍👧‍👧", "🪢", "🧶", "🧵", "🪡", "🧥", "🥼", "🦺", "👚", "👕", "👖", "🩲", "🩳", "👔", "👗", "👙", "🩱", "👘", "🥻", "🩴", "🥿", "👠", "👡", "👢", "👞", "👟", "🥾", "🧦", "🧤", "🧣", "🎩", "🧢", "👒", "🎓", "⛑", "🪖", "👑", "💍", "👝", "👛", "👜", "💼", "🎒", "🧳", "👓", "🕶", "🥽", "🌂" + "😀", "😃", "😄", "😁", "😆", "🥹", "😅", "😂", "🤣", "🥲", "☺", "😊", "😇", "🙂", "🙃", "😉", "😌", "😍", "🥰", "😘", "😗", "😙", "😚", "😋", "😛", "😝", "😜", "🤪", "🤨", "🧐", "🤓", "😎", "🥸", "🤩", "🥳", "😏", "😒", "😞", "😔", "😟", "😕", "🙁", "☹", "😣", "😖", "😫", "😩", "🥺", "😢", "😭", "😤", "😠", "😡", "🤬", "🤯", "😳", "🥵", "🥶", "😶‍🌫", "😱", "😨", "😰", "😥", "😓", "🤗", "🤔", "🫣", "🤭", "🫢", "🫡", "🤫", "🫠", "🤥", "😶", "🫥", "😐", "🫤", "😑", "😬", "🙄", "😯", "😦", "😧", "😮", "😲", "🥱", "😴", "🤤", "😪", "😮‍💨", "😵", "😵‍💫", "🤐", "🥴", "🤢", "🤮", "🤧", "😷", "🤒", "🤕", "🤑", "🤠", "😈", "👿", "👹", "👺", "🤡", "💩", "👻", "💀", "☠", "👽", "👾", "🤖", "🎃", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", "🫶", "🫶🏻", "🫶🏼", "🫶🏽", "🫶🏾", "🫶🏿", "🤲", "🤲🏻", "🤲🏼", "🤲🏽", "🤲🏾", "🤲🏿", "👐", "👐🏻", "👐🏼", "👐🏽", "👐🏾", "👐🏿", "🙌", "🙌🏻", "🙌🏼", "🙌🏽", "🙌🏾", "🙌🏿", "👏", "👏🏻", "👏🏼", "👏🏽", "👏🏾", "👏🏿", "🤝", "👍", "👍🏻", "👍🏼", "👍🏽", "👍🏾", "👍🏿", "👎", "👎🏻", "👎🏼", "👎🏽", "👎🏾", "👎🏿", "👊", "👊🏻", "👊🏼", "👊🏽", "👊🏾", "👊🏿", "✊", "✊🏻", "✊🏼", "✊🏽", "✊🏾", "✊🏿", "🤛", "🤛🏻", "🤛🏼", "🤛🏽", "🤛🏾", "🤛🏿", "🤜", "🤜🏻", "🤜🏼", "🤜🏽", "🤜🏾", "🤜🏿", "🤞", "🤞🏻", "🤞🏼", "🤞🏽", "🤞🏾", "🤞🏿", "✌", "✌🏻", "✌🏼", "✌🏽", "✌🏾", "✌🏿", "🫰", "🫰🏻", "🫰🏼", "🫰🏽", "🫰🏾", "🫰🏿", "🤟", "🤟🏻", "🤟🏼", "🤟🏽", "🤟🏾", "🤟🏿", "🤘", "🤘🏻", "🤘🏼", "🤘🏽", "🤘🏾", "🤘🏿", "👌", "👌🏻", "👌🏼", "👌🏽", "👌🏾", "👌🏿", "🤌", "🤌🏻", "🤌🏼", "🤌🏽", "🤌🏾", "🤌🏿", "🤏", "🤏🏻", "🤏🏼", "🤏🏽", "🤏🏾", "🤏🏿", "🫳", "🫳🏻", "🫳🏼", "🫳🏽", "🫳🏾", "🫳🏿", "🫴", "🫴🏻", "🫴🏼", "🫴🏽", "🫴🏾", "🫴🏿", "👈", "👈🏻", "👈🏼", "👈🏽", "👈🏾", "👈🏿", "👉", "👉🏻", "👉🏼", "👉🏽", "👉🏾", "👉🏿", "👆", "👆🏻", "👆🏼", "👆🏽", "👆🏾", "👆🏿", "👇", "👇🏻", "👇🏼", "👇🏽", "👇🏾", "👇🏿", "☝", "☝🏻", "☝🏼", "☝🏽", "☝🏾", "☝🏿", "✋", "✋🏻", "✋🏼", "✋🏽", "✋🏾", "✋🏿", "🤚", "🤚🏻", "🤚🏼", "🤚🏽", "🤚🏾", "🤚🏿", "🖐", "🖐🏻", "🖐🏼", "🖐🏽", "🖐🏾", "🖐🏿", "🖖", "🖖🏻", "🖖🏼", "🖖🏽", "🖖🏾", "🖖🏿", "👋", "👋🏻", "👋🏼", "👋🏽", "👋🏾", "👋🏿", "🤙", "🤙🏻", "🤙🏼", "🤙🏽", "🤙🏾", "🤙🏿", "🫲", "🫲🏻", "🫲🏼", "🫲🏽", "🫲🏾", "🫲🏿", "🫱", "🫱🏻", "🫱🏼", "🫱🏽", "🫱🏾", "🫱🏿", "💪", "💪🏻", "💪🏼", "💪🏽", "💪🏾", "💪🏿", "🦾", "🖕", "🖕🏻", "🖕🏼", "🖕🏽", "🖕🏾", "🖕🏿", "✍", "✍🏻", "✍🏼", "✍🏽", "✍🏾", "✍🏿", "🙏", "🙏🏻", "🙏🏼", "🙏🏽", "🙏🏾", "🙏🏿", "🫵", "🫵🏻", "🫵🏼", "🫵🏽", "🫵🏾", "🫵🏿", "🦶", "🦶🏻", "🦶🏼", "🦶🏽", "🦶🏾", "🦶🏿", "🦵", "🦵🏻", "🦵🏼", "🦵🏽", "🦵🏾", "🦵🏿", "🦿", "💄", "💋", "👄", "🫦", "🦷", "👅", "👂", "👂🏻", "👂🏼", "👂🏽", "👂🏾", "👂🏿", "🦻", "🦻🏻", "🦻🏼", "🦻🏽", "🦻🏾", "🦻🏿", "👃", "👃🏻", "👃🏼", "👃🏽", "👃🏾", "👃🏿", "👣", "👁", "👀", "🫀", "🫁", "🧠", "🗣", "👤", "👥", "🫂", "👶", "👶🏻", "👶🏼", "👶🏽", "👶🏾", "👶🏿", "👧", "👧🏻", "👧🏼", "👧🏽", "👧🏾", "👧🏿", "🧒", "🧒🏻", "🧒🏼", "🧒🏽", "🧒🏾", "🧒🏿", "👦", "👦🏻", "👦🏼", "👦🏽", "👦🏾", "👦🏿", "👩", "👩🏻", "👩🏼", "👩🏽", "👩🏾", "👩🏿", "🧑", "🧑🏻", "🧑🏼", "🧑🏽", "🧑🏾", "🧑🏿", "👨", "👨🏻", "👨🏼", "👨🏽", "👨🏾", "👨🏿", "👩‍🦱", "👩🏻‍🦱", "👩🏼‍🦱", "👩🏽‍🦱", "👩🏾‍🦱", "👩🏿‍🦱", "🧑‍🦱", "🧑🏻‍🦱", "🧑🏼‍🦱", "🧑🏽‍🦱", "🧑🏾‍🦱", "🧑🏿‍🦱", "👨‍🦱", "👨🏻‍🦱", "👨🏼‍🦱", "👨🏽‍🦱", "👨🏾‍🦱", "👨🏿‍🦱", "👩‍🦰", "👩🏻‍🦰", "👩🏼‍🦰", "👩🏽‍🦰", "👩🏾‍🦰", "👩🏿‍🦰", "🧑‍🦰", "🧑🏻‍🦰", "🧑🏼‍🦰", "🧑🏽‍🦰", "🧑🏾‍🦰", "🧑🏿‍🦰", "👨‍🦰", "👨🏻‍🦰", "👨🏼‍🦰", "👨🏽‍🦰", "👨🏾‍🦰", "👨🏿‍🦰", "👱‍♀", "👱🏻‍♀", "👱🏼‍♀", "👱🏽‍♀", "👱🏾‍♀", "👱🏿‍♀", "👱", "👱🏻", "👱🏼", "👱🏽", "👱🏾", "👱🏿", "👱‍♂", "👱🏻‍♂", "👱🏼‍♂", "👱🏽‍♂", "👱🏾‍♂", "👱🏿‍♂", "👩‍🦳", "👩🏻‍🦳", "👩🏼‍🦳", "👩🏽‍🦳", "👩🏾‍🦳", "👩🏿‍🦳", "🧑‍🦳", "🧑🏻‍🦳", "🧑🏼‍🦳", "🧑🏽‍🦳", "🧑🏾‍🦳", "🧑🏿‍🦳", "👨‍🦳", "👨🏻‍🦳", "👨🏼‍🦳", "👨🏽‍🦳", "👨🏾‍🦳", "👨🏿‍🦳", "👩‍🦲", "👩🏻‍🦲", "👩🏼‍🦲", "👩🏽‍🦲", "👩🏾‍🦲", "👩🏿‍🦲", "🧑‍🦲", "🧑🏻‍🦲", "🧑🏼‍🦲", "🧑🏽‍🦲", "🧑🏾‍🦲", "🧑🏿‍🦲", "👨‍🦲", "👨🏻‍🦲", "👨🏼‍🦲", "👨🏽‍🦲", "👨🏾‍🦲", "👨🏿‍🦲", "🧔‍♀", "🧔🏻‍♀", "🧔🏼‍♀", "🧔🏽‍♀", "🧔🏾‍♀", "🧔🏿‍♀", "🧔", "🧔🏻", "🧔🏼", "🧔🏽", "🧔🏾", "🧔🏿", "🧔‍♂", "🧔🏻‍♂", "🧔🏼‍♂", "🧔🏽‍♂", "🧔🏾‍♂", "🧔🏿‍♂", "👵", "👵🏻", "👵🏼", "👵🏽", "👵🏾", "👵🏿", "🧓", "🧓🏻", "🧓🏼", "🧓🏽", "🧓🏾", "🧓🏿", "👴", "👴🏻", "👴🏼", "👴🏽", "👴🏾", "👴🏿", "👲", "👲🏻", "👲🏼", "👲🏽", "👲🏾", "👲🏿", "👳‍♀", "👳🏻‍♀", "👳🏼‍♀", "👳🏽‍♀", "👳🏾‍♀", "👳🏿‍♀", "👳", "👳🏻", "👳🏼", "👳🏽", "👳🏾", "👳🏿", "👳‍♂", "👳🏻‍♂", "👳🏼‍♂", "👳🏽‍♂", "👳🏾‍♂", "👳🏿‍♂", "🧕", "🧕🏻", "🧕🏼", "🧕🏽", "🧕🏾", "🧕🏿", "👮‍♀", "👮🏻‍♀", "👮🏼‍♀", "👮🏽‍♀", "👮🏾‍♀", "👮🏿‍♀", "👮", "👮🏻", "👮🏼", "👮🏽", "👮🏾", "👮🏿", "👮‍♂", "👮🏻‍♂", "👮🏼‍♂", "👮🏽‍♂", "👮🏾‍♂", "👮🏿‍♂", "👷‍♀", "👷🏻‍♀", "👷🏼‍♀", "👷🏽‍♀", "👷🏾‍♀", "👷🏿‍♀", "👷", "👷🏻", "👷🏼", "👷🏽", "👷🏾", "👷🏿", "👷‍♂", "👷🏻‍♂", "👷🏼‍♂", "👷🏽‍♂", "👷🏾‍♂", "👷🏿‍♂", "💂‍♀", "💂🏻‍♀", "💂🏼‍♀", "💂🏽‍♀", "💂🏾‍♀", "💂🏿‍♀", "💂", "💂🏻", "💂🏼", "💂🏽", "💂🏾", "💂🏿", "💂‍♂", "💂🏻‍♂", "💂🏼‍♂", "💂🏽‍♂", "💂🏾‍♂", "💂🏿‍♂", "🕵‍♀", "🕵🏻‍♀", "🕵🏼‍♀", "🕵🏽‍♀", "🕵🏾‍♀", "🕵🏿‍♀", "🕵", "🕵🏻", "🕵🏼", "🕵🏽", "🕵🏾", "🕵🏿", "🕵‍♂", "🕵🏻‍♂", "🕵🏼‍♂", "🕵🏽‍♂", "🕵🏾‍♂", "🕵🏿‍♂", "👩‍⚕", "👩🏻‍⚕", "👩🏼‍⚕", "👩🏽‍⚕", "👩🏾‍⚕", "👩🏿‍⚕", "🧑‍⚕", "🧑🏻‍⚕", "🧑🏼‍⚕", "🧑🏽‍⚕", "🧑🏾‍⚕", "🧑🏿‍⚕", "👨‍⚕", "👨🏻‍⚕", "👨🏼‍⚕", "👨🏽‍⚕", "👨🏾‍⚕", "👨🏿‍⚕", "👩‍🌾", "👩🏻‍🌾", "👩🏼‍🌾", "👩🏽‍🌾", "👩🏾‍🌾", "👩🏿‍🌾", "🧑‍🌾", "🧑🏻‍🌾", "🧑🏼‍🌾", "🧑🏽‍🌾", "🧑🏾‍🌾", "🧑🏿‍🌾", "👨‍🌾", "👨🏻‍🌾", "👨🏼‍🌾", "👨🏽‍🌾", "👨🏾‍🌾", "👨🏿‍🌾", "👩‍🍳", "👩🏻‍🍳", "👩🏼‍🍳", "👩🏽‍🍳", "👩🏾‍🍳", "👩🏿‍🍳", "🧑‍🍳", "🧑🏻‍🍳", "🧑🏼‍🍳", "🧑🏽‍🍳", "🧑🏾‍🍳", "🧑🏿‍🍳", "👨‍🍳", "👨🏻‍🍳", "👨🏼‍🍳", "👨🏽‍🍳", "👨🏾‍🍳", "👨🏿‍🍳", "👩‍🎓", "👩🏻‍🎓", "👩🏼‍🎓", "👩🏽‍🎓", "👩🏾‍🎓", "👩🏿‍🎓", "🧑‍🎓", "🧑🏻‍🎓", "🧑🏼‍🎓", "🧑🏽‍🎓", "🧑🏾‍🎓", "🧑🏿‍🎓", "👨‍🎓", "👨🏻‍🎓", "👨🏼‍🎓", "👨🏽‍🎓", "👨🏾‍🎓", "👨🏿‍🎓", "👩‍🎤", "👩🏻‍🎤", "👩🏼‍🎤", "👩🏽‍🎤", "👩🏾‍🎤", "👩🏿‍🎤", "🧑‍🎤", "🧑🏻‍🎤", "🧑🏼‍🎤", "🧑🏽‍🎤", "🧑🏾‍🎤", "🧑🏿‍🎤", "👨‍🎤", "👨🏻‍🎤", "👨🏼‍🎤", "👨🏽‍🎤", "👨🏾‍🎤", "👨🏿‍🎤", "👩‍🏫", "👩🏻‍🏫", "👩🏼‍🏫", "👩🏽‍🏫", "👩🏾‍🏫", "👩🏿‍🏫", "🧑‍🏫", "🧑🏻‍🏫", "🧑🏼‍🏫", "🧑🏽‍🏫", "🧑🏾‍🏫", "🧑🏿‍🏫", "👨‍🏫", "👨🏻‍🏫", "👨🏼‍🏫", "👨🏽‍🏫", "👨🏾‍🏫", "👨🏿‍🏫", "👩‍🏭", "👩🏻‍🏭", "👩🏼‍🏭", "👩🏽‍🏭", "👩🏾‍🏭", "👩🏿‍🏭", "🧑‍🏭", "🧑🏻‍🏭", "🧑🏼‍🏭", "🧑🏽‍🏭", "🧑🏾‍🏭", "🧑🏿‍🏭", "👨‍🏭", "👨🏻‍🏭", "👨🏼‍🏭", "👨🏽‍🏭", "👨🏾‍🏭", "👨🏿‍🏭", "👩‍💻", "👩🏻‍💻", "👩🏼‍💻", "👩🏽‍💻", "👩🏾‍💻", "👩🏿‍💻", "🧑‍💻", "🧑🏻‍💻", "🧑🏼‍💻", "🧑🏽‍💻", "🧑🏾‍💻", "🧑🏿‍💻", "👨‍💻", "👨🏻‍💻", "👨🏼‍💻", "👨🏽‍💻", "👨🏾‍💻", "👨🏿‍💻", "👩‍💼", "👩🏻‍💼", "👩🏼‍💼", "👩🏽‍💼", "👩🏾‍💼", "👩🏿‍💼", "🧑‍💼", "🧑🏻‍💼", "🧑🏼‍💼", "🧑🏽‍💼", "🧑🏾‍💼", "🧑🏿‍💼", "👨‍💼", "👨🏻‍💼", "👨🏼‍💼", "👨🏽‍💼", "👨🏾‍💼", "👨🏿‍💼", "👩‍🔧", "👩🏻‍🔧", "👩🏼‍🔧", "👩🏽‍🔧", "👩🏾‍🔧", "👩🏿‍🔧", "🧑‍🔧", "🧑🏻‍🔧", "🧑🏼‍🔧", "🧑🏽‍🔧", "🧑🏾‍🔧", "🧑🏿‍🔧", "👨‍🔧", "👨🏻‍🔧", "👨🏼‍🔧", "👨🏽‍🔧", "👨🏾‍🔧", "👨🏿‍🔧", "👩‍🔬", "👩🏻‍🔬", "👩🏼‍🔬", "👩🏽‍🔬", "👩🏾‍🔬", "👩🏿‍🔬", "🧑‍🔬", "🧑🏻‍🔬", "🧑🏼‍🔬", "🧑🏽‍🔬", "🧑🏾‍🔬", "🧑🏿‍🔬", "👨‍🔬", "👨🏻‍🔬", "👨🏼‍🔬", "👨🏽‍🔬", "👨🏾‍🔬", "👨🏿‍🔬", "👩‍🎨", "👩🏻‍🎨", "👩🏼‍🎨", "👩🏽‍🎨", "👩🏾‍🎨", "👩🏿‍🎨", "🧑‍🎨", "🧑🏻‍🎨", "🧑🏼‍🎨", "🧑🏽‍🎨", "🧑🏾‍🎨", "🧑🏿‍🎨", "👨‍🎨", "👨🏻‍🎨", "👨🏼‍🎨", "👨🏽‍🎨", "👨🏾‍🎨", "👨🏿‍🎨", "👩‍🚒", "👩🏻‍🚒", "👩🏼‍🚒", "👩🏽‍🚒", "👩🏾‍🚒", "👩🏿‍🚒", "🧑‍🚒", "🧑🏻‍🚒", "🧑🏼‍🚒", "🧑🏽‍🚒", "🧑🏾‍🚒", "🧑🏿‍🚒", "👨‍🚒", "👨🏻‍🚒", "👨🏼‍🚒", "👨🏽‍🚒", "👨🏾‍🚒", "👨🏿‍🚒", "👩‍✈", "👩🏻‍✈", "👩🏼‍✈", "👩🏽‍✈", "👩🏾‍✈", "👩🏿‍✈", "🧑‍✈", "🧑🏻‍✈", "🧑🏼‍✈", "🧑🏽‍✈", "🧑🏾‍✈", "🧑🏿‍✈", "👨‍✈", "👨🏻‍✈", "👨🏼‍✈", "👨🏽‍✈", "👨🏾‍✈", "👨🏿‍✈", "👩‍🚀", "👩🏻‍🚀", "👩🏼‍🚀", "👩🏽‍🚀", "👩🏾‍🚀", "👩🏿‍🚀", "🧑‍🚀", "🧑🏻‍🚀", "🧑🏼‍🚀", "🧑🏽‍🚀", "🧑🏾‍🚀", "🧑🏿‍🚀", "👨‍🚀", "👨🏻‍🚀", "👨🏼‍🚀", "👨🏽‍🚀", "👨🏾‍🚀", "👨🏿‍🚀", "👩‍⚖", "👩🏻‍⚖", "👩🏼‍⚖", "👩🏽‍⚖", "👩🏾‍⚖", "👩🏿‍⚖", "🧑‍⚖", "🧑🏻‍⚖", "🧑🏼‍⚖", "🧑🏽‍⚖", "🧑🏾‍⚖", "🧑🏿‍⚖", "👨‍⚖", "👨🏻‍⚖", "👨🏼‍⚖", "👨🏽‍⚖", "👨🏾‍⚖", "👨🏿‍⚖", "👰‍♀", "👰🏻‍♀", "👰🏼‍♀", "👰🏽‍♀", "👰🏾‍♀", "👰🏿‍♀", "👰", "👰🏻", "👰🏼", "👰🏽", "👰🏾", "👰🏿", "👰‍♂", "👰🏻‍♂", "👰🏼‍♂", "👰🏽‍♂", "👰🏾‍♂", "👰🏿‍♂", "🤵‍♀", "🤵🏻‍♀", "🤵🏼‍♀", "🤵🏽‍♀", "🤵🏾‍♀", "🤵🏿‍♀", "🤵", "🤵🏻", "🤵🏼", "🤵🏽", "🤵🏾", "🤵🏿", "🤵‍♂", "🤵🏻‍♂", "🤵🏼‍♂", "🤵🏽‍♂", "🤵🏾‍♂", "🤵🏿‍♂", "👸", "👸🏻", "👸🏼", "👸🏽", "👸🏾", "👸🏿", "🫅", "🫅🏻", "🫅🏼", "🫅🏽", "🫅🏾", "🫅🏿", "🤴", "🤴🏻", "🤴🏼", "🤴🏽", "🤴🏾", "🤴🏿", "🥷", "🥷🏻", "🥷🏼", "🥷🏽", "🥷🏾", "🥷🏿", "🦸‍♀", "🦸🏻‍♀", "🦸🏼‍♀", "🦸🏽‍♀", "🦸🏾‍♀", "🦸🏿‍♀", "🦸", "🦸🏻", "🦸🏼", "🦸🏽", "🦸🏾", "🦸🏿", "🦸‍♂", "🦸🏻‍♂", "🦸🏼‍♂", "🦸🏽‍♂", "🦸🏾‍♂", "🦸🏿‍♂", "🦹‍♀", "🦹🏻‍♀", "🦹🏼‍♀", "🦹🏽‍♀", "🦹🏾‍♀", "🦹🏿‍♀", "🦹", "🦹🏻", "🦹🏼", "🦹🏽", "🦹🏾", "🦹🏿", "🦹‍♂", "🦹🏻‍♂", "🦹🏼‍♂", "🦹🏽‍♂", "🦹🏾‍♂", "🦹🏿‍♂", "🤶", "🤶🏻", "🤶🏼", "🤶🏽", "🤶🏾", "🤶🏿", "🧑‍🎄", "🧑🏻‍🎄", "🧑🏼‍🎄", "🧑🏽‍🎄", "🧑🏾‍🎄", "🧑🏿‍🎄", "🎅", "🎅🏻", "🎅🏼", "🎅🏽", "🎅🏾", "🎅🏿", "🧙‍♀", "🧙🏻‍♀", "🧙🏼‍♀", "🧙🏽‍♀", "🧙🏾‍♀", "🧙🏿‍♀", "🧙", "🧙🏻", "🧙🏼", "🧙🏽", "🧙🏾", "🧙🏿", "🧙‍♂", "🧙🏻‍♂", "🧙🏼‍♂", "🧙🏽‍♂", "🧙🏾‍♂", "🧙🏿‍♂", "🧝‍♀", "🧝🏻‍♀", "🧝🏼‍♀", "🧝🏽‍♀", "🧝🏾‍♀", "🧝🏿‍♀", "🧝", "🧝🏻", "🧝🏼", "🧝🏽", "🧝🏾", "🧝🏿", "🧝‍♂", "🧝🏻‍♂", "🧝🏼‍♂", "🧝🏽‍♂", "🧝🏾‍♂", "🧝🏿‍♂", "🧌", "🧛‍♀", "🧛🏻‍♀", "🧛🏼‍♀", "🧛🏽‍♀", "🧛🏾‍♀", "🧛🏿‍♀", "🧛", "🧛🏻", "🧛🏼", "🧛🏽", "🧛🏾", "🧛🏿", "🧛‍♂", "🧛🏻‍♂", "🧛🏼‍♂", "🧛🏽‍♂", "🧛🏾‍♂", "🧛🏿‍♂", "🧟‍♀", "🧟", "🧟‍♂", "🧞‍♀", "🧞", "🧞‍♂", "🧜‍♀", "🧜🏻‍♀", "🧜🏼‍♀", "🧜🏽‍♀", "🧜🏾‍♀", "🧜🏿‍♀", "🧜", "🧜🏻", "🧜🏼", "🧜🏽", "🧜🏾", "🧜🏿", "🧜‍♂", "🧜🏻‍♂", "🧜🏼‍♂", "🧜🏽‍♂", "🧜🏾‍♂", "🧜🏿‍♂", "🧚‍♀", "🧚🏻‍♀", "🧚🏼‍♀", "🧚🏽‍♀", "🧚🏾‍♀", "🧚🏿‍♀", "🧚", "🧚🏻", "🧚🏼", "🧚🏽", "🧚🏾", "🧚🏿", "🧚‍♂", "🧚🏻‍♂", "🧚🏼‍♂", "🧚🏽‍♂", "🧚🏾‍♂", "🧚🏿‍♂", "👼", "👼🏻", "👼🏼", "👼🏽", "👼🏾", "👼🏿", "🤰", "🤰🏻", "🤰🏼", "🤰🏽", "🤰🏾", "🤰🏿", "🫄", "🫄🏻", "🫄🏼", "🫄🏽", "🫄🏾", "🫄🏿", "🫃", "🫃🏻", "🫃🏼", "🫃🏽", "🫃🏾", "🫃🏿", "🤱", "🤱🏻", "🤱🏼", "🤱🏽", "🤱🏾", "🤱🏿", "👩‍🍼", "👩🏻‍🍼", "👩🏼‍🍼", "👩🏽‍🍼", "👩🏾‍🍼", "👩🏿‍🍼", "🧑‍🍼", "🧑🏻‍🍼", "🧑🏼‍🍼", "🧑🏽‍🍼", "🧑🏾‍🍼", "🧑🏿‍🍼", "👨‍🍼", "👨🏻‍🍼", "👨🏼‍🍼", "👨🏽‍🍼", "👨🏾‍🍼", "👨🏿‍🍼", "🙇‍♀", "🙇🏻‍♀", "🙇🏼‍♀", "🙇🏽‍♀", "🙇🏾‍♀", "🙇🏿‍♀", "🙇", "🙇🏻", "🙇🏼", "🙇🏽", "🙇🏾", "🙇🏿", "🙇‍♂", "🙇🏻‍♂", "🙇🏼‍♂", "🙇🏽‍♂", "🙇🏾‍♂", "🙇🏿‍♂", "💁‍♀", "💁🏻‍♀", "💁🏼‍♀", "💁🏽‍♀", "💁🏾‍♀", "💁🏿‍♀", "💁", "💁🏻", "💁🏼", "💁🏽", "💁🏾", "💁🏿", "💁‍♂", "💁🏻‍♂", "💁🏼‍♂", "💁🏽‍♂", "💁🏾‍♂", "💁🏿‍♂", "🙅‍♀", "🙅🏻‍♀", "🙅🏼‍♀", "🙅🏽‍♀", "🙅🏾‍♀", "🙅🏿‍♀", "🙅", "🙅🏻", "🙅🏼", "🙅🏽", "🙅🏾", "🙅🏿", "🙅‍♂", "🙅🏻‍♂", "🙅🏼‍♂", "🙅🏽‍♂", "🙅🏾‍♂", "🙅🏿‍♂", "🙆‍♀", "🙆🏻‍♀", "🙆🏼‍♀", "🙆🏽‍♀", "🙆🏾‍♀", "🙆🏿‍♀", "🙆", "🙆🏻", "🙆🏼", "🙆🏽", "🙆🏾", "🙆🏿", "🙆‍♂", "🙆🏻‍♂", "🙆🏼‍♂", "🙆🏽‍♂", "🙆🏾‍♂", "🙆🏿‍♂", "🙋‍♀", "🙋🏻‍♀", "🙋🏼‍♀", "🙋🏽‍♀", "🙋🏾‍♀", "🙋🏿‍♀", "🙋", "🙋🏻", "🙋🏼", "🙋🏽", "🙋🏾", "🙋🏿", "🙋‍♂", "🙋🏻‍♂", "🙋🏼‍♂", "🙋🏽‍♂", "🙋🏾‍♂", "🙋🏿‍♂", "🧏‍♀", "🧏🏻‍♀", "🧏🏼‍♀", "🧏🏽‍♀", "🧏🏾‍♀", "🧏🏿‍♀", "🧏", "🧏🏻", "🧏🏼", "🧏🏽", "🧏🏾", "🧏🏿", "🧏‍♂", "🧏🏻‍♂", "🧏🏼‍♂", "🧏🏽‍♂", "🧏🏾‍♂", "🧏🏿‍♂", "🤦‍♀", "🤦🏻‍♀", "🤦🏼‍♀", "🤦🏽‍♀", "🤦🏾‍♀", "🤦🏿‍♀", "🤦", "🤦🏻", "🤦🏼", "🤦🏽", "🤦🏾", "🤦🏿", "🤦‍♂", "🤦🏻‍♂", "🤦🏼‍♂", "🤦🏽‍♂", "🤦🏾‍♂", "🤦🏿‍♂", "🤷‍♀", "🤷🏻‍♀", "🤷🏼‍♀", "🤷🏽‍♀", "🤷🏾‍♀", "🤷🏿‍♀", "🤷", "🤷🏻", "🤷🏼", "🤷🏽", "🤷🏾", "🤷🏿", "🤷‍♂", "🤷🏻‍♂", "🤷🏼‍♂", "🤷🏽‍♂", "🤷🏾‍♂", "🤷🏿‍♂", "🙎‍♀", "🙎🏻‍♀", "🙎🏼‍♀", "🙎🏽‍♀", "🙎🏾‍♀", "🙎🏿‍♀", "🙎", "🙎🏻", "🙎🏼", "🙎🏽", "🙎🏾", "🙎🏿", "🙎‍♂", "🙎🏻‍♂", "🙎🏼‍♂", "🙎🏽‍♂", "🙎🏾‍♂", "🙎🏿‍♂", "🙍‍♀", "🙍🏻‍♀", "🙍🏼‍♀", "🙍🏽‍♀", "🙍🏾‍♀", "🙍🏿‍♀", "🙍", "🙍🏻", "🙍🏼", "🙍🏽", "🙍🏾", "🙍🏿", "🙍‍♂", "🙍🏻‍♂", "🙍🏼‍♂", "🙍🏽‍♂", "🙍🏾‍♂", "🙍🏿‍♂", "💇‍♀", "💇🏻‍♀", "💇🏼‍♀", "💇🏽‍♀", "💇🏾‍♀", "💇🏿‍♀", "💇", "💇🏻", "💇🏼", "💇🏽", "💇🏾", "💇🏿", "💇‍♂", "💇🏻‍♂", "💇🏼‍♂", "💇🏽‍♂", "💇🏾‍♂", "💇🏿‍♂", "💆‍♀", "💆🏻‍♀", "💆🏼‍♀", "💆🏽‍♀", "💆🏾‍♀", "💆🏿‍♀", "💆", "💆🏻", "💆🏼", "💆🏽", "💆🏾", "💆🏿", "💆‍♂", "💆🏻‍♂", "💆🏼‍♂", "💆🏽‍♂", "💆🏾‍♂", "💆🏿‍♂", "🧖‍♀", "🧖🏻‍♀", "🧖🏼‍♀", "🧖🏽‍♀", "🧖🏾‍♀", "🧖🏿‍♀", "🧖", "🧖🏻", "🧖🏼", "🧖🏽", "🧖🏾", "🧖🏿", "🧖‍♂", "🧖🏻‍♂", "🧖🏼‍♂", "🧖🏽‍♂", "🧖🏾‍♂", "🧖🏿‍♂", "💅", "💅🏻", "💅🏼", "💅🏽", "💅🏾", "💅🏿", "🤳", "🤳🏻", "🤳🏼", "🤳🏽", "🤳🏾", "🤳🏿", "💃", "💃🏻", "💃🏼", "💃🏽", "💃🏾", "💃🏿", "🕺", "🕺🏻", "🕺🏼", "🕺🏽", "🕺🏾", "🕺🏿", "👯‍♀", "👯", "👯‍♂", "🕴", "🕴🏻", "🕴🏼", "🕴🏽", "🕴🏾", "🕴🏿", "👩‍🦽", "👩🏻‍🦽", "👩🏼‍🦽", "👩🏽‍🦽", "👩🏾‍🦽", "👩🏿‍🦽", "🧑‍🦽", "🧑🏻‍🦽", "🧑🏼‍🦽", "🧑🏽‍🦽", "🧑🏾‍🦽", "🧑🏿‍🦽", "👨‍🦽", "👨🏻‍🦽", "👨🏼‍🦽", "👨🏽‍🦽", "👨🏾‍🦽", "👨🏿‍🦽", "👩‍🦼", "👩🏻‍🦼", "👩🏼‍🦼", "👩🏽‍🦼", "👩🏾‍🦼", "👩🏿‍🦼", "🧑‍🦼", "🧑🏻‍🦼", "🧑🏼‍🦼", "🧑🏽‍🦼", "🧑🏾‍🦼", "🧑🏿‍🦼", "👨‍🦼", "👨🏻‍🦼", "👨🏼‍🦼", "👨🏽‍🦼", "👨🏾‍🦼", "👨🏿‍🦼", "🚶‍♀", "🚶🏻‍♀", "🚶🏼‍♀", "🚶🏽‍♀", "🚶🏾‍♀", "🚶🏿‍♀", "🚶", "🚶🏻", "🚶🏼", "🚶🏽", "🚶🏾", "🚶🏿", "🚶‍♂", "🚶🏻‍♂", "🚶🏼‍♂", "🚶🏽‍♂", "🚶🏾‍♂", "🚶🏿‍♂", "👩‍🦯", "👩🏻‍🦯", "👩🏼‍🦯", "👩🏽‍🦯", "👩🏾‍🦯", "👩🏿‍🦯", "🧑‍🦯", "🧑🏻‍🦯", "🧑🏼‍🦯", "🧑🏽‍🦯", "🧑🏾‍🦯", "🧑🏿‍🦯", "👨‍🦯", "👨🏻‍🦯", "👨🏼‍🦯", "👨🏽‍🦯", "👨🏾‍🦯", "👨🏿‍🦯", "🧎‍♀", "🧎🏻‍♀", "🧎🏼‍♀", "🧎🏽‍♀", "🧎🏾‍♀", "🧎🏿‍♀", "🧎", "🧎🏻", "🧎🏼", "🧎🏽", "🧎🏾", "🧎🏿", "🧎‍♂", "🧎🏻‍♂", "🧎🏼‍♂", "🧎🏽‍♂", "🧎🏾‍♂", "🧎🏿‍♂", "🏃‍♀", "🏃🏻‍♀", "🏃🏼‍♀", "🏃🏽‍♀", "🏃🏾‍♀", "🏃🏿‍♀", "🏃", "🏃🏻", "🏃🏼", "🏃🏽", "🏃🏾", "🏃🏿", "🏃‍♂", "🏃🏻‍♂", "🏃🏼‍♂", "🏃🏽‍♂", "🏃🏾‍♂", "🏃🏿‍♂", "🧍‍♀", "🧍🏻‍♀", "🧍🏼‍♀", "🧍🏽‍♀", "🧍🏾‍♀", "🧍🏿‍♀", "🧍", "🧍🏻", "🧍🏼", "🧍🏽", "🧍🏾", "🧍🏿", "🧍‍♂", "🧍🏻‍♂", "🧍🏼‍♂", "🧍🏽‍♂", "🧍🏾‍♂", "🧍🏿‍♂", "👫", "👫🏻", "👩🏻‍🤝‍👨🏼", "👩🏻‍🤝‍👨🏽", "👩🏻‍🤝‍👨🏾", "👩🏻‍🤝‍👨🏿", "👩🏼‍🤝‍👨🏻", "👫🏼", "👩🏼‍🤝‍👨🏽", "👩🏼‍🤝‍👨🏾", "👩🏼‍🤝‍👨🏿", "👩🏽‍🤝‍👨🏻", "👩🏽‍🤝‍👨🏼", "👫🏽", "👩🏽‍🤝‍👨🏾", "👩🏽‍🤝‍👨🏿", "👩🏾‍🤝‍👨🏻", "👩🏾‍🤝‍👨🏼", "👩🏾‍🤝‍👨🏽", "👫🏾", "👩🏾‍🤝‍👨🏿", "👩🏿‍🤝‍👨🏻", "👩🏿‍🤝‍👨🏼", "👩🏿‍🤝‍👨🏽", "👩🏿‍🤝‍👨🏾", "👫🏿", "👭", "👭🏻", "👩🏻‍🤝‍👩🏼", "👩🏻‍🤝‍👩🏽", "👩🏻‍🤝‍👩🏾", "👩🏻‍🤝‍👩🏿", "👩🏼‍🤝‍👩🏻", "👭🏼", "👩🏼‍🤝‍👩🏽", "👩🏼‍🤝‍👩🏾", "👩🏼‍🤝‍👩🏿", "👩🏽‍🤝‍👩🏻", "👩🏽‍🤝‍👩🏼", "👭🏽", "👩🏽‍🤝‍👩🏾", "👩🏽‍🤝‍👩🏿", "👩🏾‍🤝‍👩🏻", "👩🏾‍🤝‍👩🏼", "👩🏾‍🤝‍👩🏽", "👭🏾", "👩🏾‍🤝‍👩🏿", "👩🏿‍🤝‍👩🏻", "👩🏿‍🤝‍👩🏼", "👩🏿‍🤝‍👩🏽", "👩🏿‍🤝‍👩🏾", "👭🏿", "👬", "👬🏻", "👨🏻‍🤝‍👨🏼", "👨🏻‍🤝‍👨🏽", "👨🏻‍🤝‍👨🏾", "👨🏻‍🤝‍👨🏿", "👨🏼‍🤝‍👨🏻", "👬🏼", "👨🏼‍🤝‍👨🏽", "👨🏼‍🤝‍👨🏾", "👨🏼‍🤝‍👨🏿", "👨🏽‍🤝‍👨🏻", "👨🏽‍🤝‍👨🏼", "👬🏽", "👨🏽‍🤝‍👨🏾", "👨🏽‍🤝‍👨🏿", "👨🏾‍🤝‍👨🏻", "👨🏾‍🤝‍👨🏼", "👨🏾‍🤝‍👨🏽", "👬🏾", "👨🏾‍🤝‍👨🏿", "👨🏿‍🤝‍👨🏻", "👨🏿‍🤝‍👨🏼", "👨🏿‍🤝‍👨🏽", "👨🏿‍🤝‍👨🏾", "👬🏿", "👩‍❤‍👨", "👩🏻‍❤‍👨🏻", "👩🏻‍❤‍👨🏼", "👩🏻‍❤‍👨🏽", "👩🏻‍❤‍👨🏾", "👩🏻‍❤‍👨🏿", "👩🏼‍❤‍👨🏻", "👩🏼‍❤‍👨🏼", "👩🏼‍❤‍👨🏽", "👩🏼‍❤‍👨🏾", "👩🏼‍❤‍👨🏿", "👩🏽‍❤‍👨🏻", "👩🏽‍❤‍👨🏼", "👩🏽‍❤‍👨🏽", "👩🏽‍❤‍👨🏾", "👩🏽‍❤‍👨🏿", "👩🏾‍❤‍👨🏻", "👩🏾‍❤‍👨🏼", "👩🏾‍❤‍👨🏽", "👩🏾‍❤‍👨🏾", "👩🏾‍❤‍👨🏿", "👩🏿‍❤‍👨🏻", "👩🏿‍❤‍👨🏼", "👩🏿‍❤‍👨🏽", "👩🏿‍❤‍👨🏾", "👩🏿‍❤‍👨🏿", "👩‍❤‍👩", "👩🏻‍❤‍👩🏻", "👩🏻‍❤‍👩🏼", "👩🏻‍❤‍👩🏽", "👩🏻‍❤‍👩🏾", "👩🏻‍❤‍👩🏿", "👩🏼‍❤‍👩🏻", "👩🏼‍❤‍👩🏼", "👩🏼‍❤‍👩🏽", "👩🏼‍❤‍👩🏾", "👩🏼‍❤‍👩🏿", "👩🏽‍❤‍👩🏻", "👩🏽‍❤‍👩🏼", "👩🏽‍❤‍👩🏽", "👩🏽‍❤‍👩🏾", "👩🏽‍❤‍👩🏿", "👩🏾‍❤‍👩🏻", "👩🏾‍❤‍👩🏼", "👩🏾‍❤‍👩🏽", "👩🏾‍❤‍👩🏾", "👩🏾‍❤‍👩🏿", "👩🏿‍❤‍👩🏻", "👩🏿‍❤‍👩🏼", "👩🏿‍❤‍👩🏽", "👩🏿‍❤‍👩🏾", "👩🏿‍❤‍👩🏿", "💑", "🧑🏻‍❤‍🧑🏻", "🧑🏻‍❤‍🧑🏼", "🧑🏻‍❤‍🧑🏽", "🧑🏻‍❤‍🧑🏾", "🧑🏻‍❤‍🧑🏿", "🧑🏼‍❤‍🧑🏻", "🧑🏼‍❤‍🧑🏼", "🧑🏼‍❤‍🧑🏽", "🧑🏼‍❤‍🧑🏾", "🧑🏼‍❤‍🧑🏿", "🧑🏽‍❤‍🧑🏻", "🧑🏽‍❤‍🧑🏼", "🧑🏽‍❤‍🧑🏽", "🧑🏽‍❤‍🧑🏾", "🧑🏽‍❤‍🧑🏿", "🧑🏾‍❤‍🧑🏻", "🧑🏾‍❤‍🧑🏼", "🧑🏾‍❤‍🧑🏽", "🧑🏾‍❤‍🧑🏾", "🧑🏾‍❤‍🧑🏿", "🧑🏿‍❤‍🧑🏻", "🧑🏿‍❤‍🧑🏼", "🧑🏿‍❤‍🧑🏽", "🧑🏿‍❤‍🧑🏾", "🧑🏿‍❤‍🧑🏿", "👨‍❤‍👨", "👨🏻‍❤‍👨🏻", "👨🏻‍❤‍👨🏼", "👨🏻‍❤‍👨🏽", "👨🏻‍❤‍👨🏾", "👨🏻‍❤‍👨🏿", "👨🏼‍❤‍👨🏻", "👨🏼‍❤‍👨🏼", "👨🏼‍❤‍👨🏽", "👨🏼‍❤‍👨🏾", "👨🏼‍❤‍👨🏿", "👨🏽‍❤‍👨🏻", "👨🏽‍❤‍👨🏼", "👨🏽‍❤‍👨🏽", "👨🏽‍❤‍👨🏾", "👨🏽‍❤‍👨🏿", "👨🏾‍❤‍👨🏻", "👨🏾‍❤‍👨🏼", "👨🏾‍❤‍👨🏽", "👨🏾‍❤‍👨🏾", "👨🏾‍❤‍👨🏿", "👨🏿‍❤‍👨🏻", "👨🏿‍❤‍👨🏼", "👨🏿‍❤‍👨🏽", "👨🏿‍❤‍👨🏾", "👨🏿‍❤‍👨🏿", "👩‍❤‍💋‍👨", "👩🏻‍❤‍💋‍👨🏻", "👩🏻‍❤‍💋‍👨🏼", "👩🏻‍❤‍💋‍👨🏽", "👩🏻‍❤‍💋‍👨🏾", "👩🏻‍❤‍💋‍👨🏿", "👩🏼‍❤‍💋‍👨🏻", "👩🏼‍❤‍💋‍👨🏼", "👩🏼‍❤‍💋‍👨🏽", "👩🏼‍❤‍💋‍👨🏾", "👩🏼‍❤‍💋‍👨🏿", "👩🏽‍❤‍💋‍👨🏻", "👩🏽‍❤‍💋‍👨🏼", "👩🏽‍❤‍💋‍👨🏽", "👩🏽‍❤‍💋‍👨🏾", "👩🏽‍❤‍💋‍👨🏿", "👩🏾‍❤‍💋‍👨🏻", "👩🏾‍❤‍💋‍👨🏼", "👩🏾‍❤‍💋‍👨🏽", "👩🏾‍❤‍💋‍👨🏾", "👩🏾‍❤‍💋‍👨🏿", "👩🏿‍❤‍💋‍👨🏻", "👩🏿‍❤‍💋‍👨🏼", "👩🏿‍❤‍💋‍👨🏽", "👩🏿‍❤‍💋‍👨🏾", "👩🏿‍❤‍💋‍👨🏿", "👩‍❤‍💋‍👩", "👩🏻‍❤‍💋‍👩🏻", "👩🏻‍❤‍💋‍👩🏼", "👩🏻‍❤‍💋‍👩🏽", "👩🏻‍❤‍💋‍👩🏾", "👩🏻‍❤‍💋‍👩🏿", "👩🏼‍❤‍💋‍👩🏻", "👩🏼‍❤‍💋‍👩🏼", "👩🏼‍❤‍💋‍👩🏽", "👩🏼‍❤‍💋‍👩🏾", "👩🏼‍❤‍💋‍👩🏿", "👩🏽‍❤‍💋‍👩🏻", "👩🏽‍❤‍💋‍👩🏼", "👩🏽‍❤‍💋‍👩🏽", "👩🏽‍❤‍💋‍👩🏾", "👩🏽‍❤‍💋‍👩🏿", "👩🏾‍❤‍💋‍👩🏻", "👩🏾‍❤‍💋‍👩🏼", "👩🏾‍❤‍💋‍👩🏽", "👩🏾‍❤‍💋‍👩🏾", "👩🏾‍❤‍💋‍👩🏿", "👩🏿‍❤‍💋‍👩🏻", "👩🏿‍❤‍💋‍👩🏼", "👩🏿‍❤‍💋‍👩🏽", "👩🏿‍❤‍💋‍👩🏾", "👩🏿‍❤‍💋‍👩🏿", "💏", "🧑🏻‍❤‍💋‍🧑🏻", "🧑🏻‍❤‍💋‍🧑🏼", "🧑🏻‍❤‍💋‍🧑🏽", "🧑🏻‍❤‍💋‍🧑🏾", "🧑🏻‍❤‍💋‍🧑🏿", "🧑🏼‍❤‍💋‍🧑🏻", "🧑🏼‍❤‍💋‍🧑🏼", "🧑🏼‍❤‍💋‍🧑🏽", "🧑🏼‍❤‍💋‍🧑🏾", "🧑🏼‍❤‍💋‍🧑🏿", "🧑🏽‍❤‍💋‍🧑🏻", "🧑🏽‍❤‍💋‍🧑🏼", "🧑🏽‍❤‍💋‍🧑🏽", "🧑🏽‍❤‍💋‍🧑🏾", "🧑🏽‍❤‍💋‍🧑🏿", "🧑🏾‍❤‍💋‍🧑🏻", "🧑🏾‍❤‍💋‍🧑🏼", "🧑🏾‍❤‍💋‍🧑🏽", "🧑🏾‍❤‍💋‍🧑🏾", "🧑🏾‍❤‍💋‍🧑🏿", "🧑🏿‍❤‍💋‍🧑🏻", "🧑🏿‍❤‍💋‍🧑🏼", "🧑🏿‍❤‍💋‍🧑🏽", "🧑🏿‍❤‍💋‍🧑🏾", "🧑🏿‍❤‍💋‍🧑🏿", "👨‍❤‍💋‍👨", "👨🏻‍❤‍💋‍👨🏻", "👨🏻‍❤‍💋‍👨🏼", "👨🏻‍❤‍💋‍👨🏽", "👨🏻‍❤‍💋‍👨🏾", "👨🏻‍❤‍💋‍👨🏿", "👨🏼‍❤‍💋‍👨🏻", "👨🏼‍❤‍💋‍👨🏼", "👨🏼‍❤‍💋‍👨🏽", "👨🏼‍❤‍💋‍👨🏾", "👨🏼‍❤‍💋‍👨🏿", "👨🏽‍❤‍💋‍👨🏻", "👨🏽‍❤‍💋‍👨🏼", "👨🏽‍❤‍💋‍👨🏽", "👨🏽‍❤‍💋‍👨🏾", "👨🏽‍❤‍💋‍👨🏿", "👨🏾‍❤‍💋‍👨🏻", "👨🏾‍❤‍💋‍👨🏼", "👨🏾‍❤‍💋‍👨🏽", "👨🏾‍❤‍💋‍👨🏾", "👨🏾‍❤‍💋‍👨🏿", "👨🏿‍❤‍💋‍👨🏻", "👨🏿‍❤‍💋‍👨🏼", "👨🏿‍❤‍💋‍👨🏽", "👨🏿‍❤‍💋‍👨🏾", "👨🏿‍❤‍💋‍👨🏿", "👨‍👩‍👦", "👨‍👩‍👧", "👨‍👩‍👧‍👦", "👨‍👩‍👦‍👦", "👨‍👩‍👧‍👧", "👩‍👩‍👦", "👩‍👩‍👧", "👩‍👩‍👧‍👦", "👩‍👩‍👦‍👦", "👩‍👩‍👧‍👧", "👨‍👨‍👦", "👨‍👨‍👧", "👨‍👨‍👧‍👦", "👨‍👨‍👦‍👦", "👨‍👨‍👧‍👧", "👩‍👦", "👩‍👧", "👩‍👧‍👦", "👩‍👦‍👦", "👩‍👧‍👧", "👨‍👦", "👨‍👧", "👨‍👧‍👦", "👨‍👦‍👦", "👨‍👧‍👧", "🪢", "🧶", "🧵", "🪡", "🧥", "🥼", "🦺", "👚", "👕", "👖", "🩲", "🩳", "👔", "👗", "👙", "🩱", "👘", "🥻", "🩴", "🥿", "👠", "👡", "👢", "👞", "👟", "🥾", "🧦", "🧤", "🧣", "🎩", "🧢", "👒", "🎓", "⛑", "🪖", "👑", "💍", "👝", "👛", "👜", "💼", "🎒", "🧳", "👓", "🕶", "🥽", "🌂" }, new String[]{ - "🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼", "🐻‍❄", "🐨", "🐯", "🦁", "🐮", "🐷", "🐽", "🐸", "🐵", "🙈", "🙉", "🙊", "🐒", "🐔", "🐧", "🐦", "🐤", "🐣", "🐥", "🦆", "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", "🪱", "🐛", "🦋", "🐌", "🐞", "🐜", "🪰", "🪲", "🪳", "🦟", "🦗", "🕷", "🕸", "🦂", "🐢", "🐍", "🦎", "🦖", "🦕", "🐙", "🦑", "🦐", "🦞", "🦀", "🐡", "🐠", "🐟", "🐬", "🐳", "🐋", "🦈", "🦭", "🐊", "🐅", "🐆", "🦓", "🦍", "🦧", "🦣", "🐘", "🦛", "🦏", "🐪", "🐫", "🦒", "🦘", "🦬", "🐃", "🐂", "🐄", "🐎", "🐖", "🐏", "🐑", "🦙", "🐐", "🦌", "🐕", "🐩", "🦮", "🐕‍🦺", "🐈", "🐈‍⬛", "🪶", "🐓", "🦃", "🦤", "🦚", "🦜", "🦢", "🦩", "🕊", "🐇", "🦝", "🦨", "🦡", "🦫", "🦦", "🦥", "🐁", "🐀", "🐿", "🦔", "🐾", "🐉", "🐲", "🌵", "🎄", "🌲", "🌳", "🌴", "🪵", "🌱", "🌿", "☘", "🍀", "🎍", "🪴", "🎋", "🍃", "🍂", "🍁", "🍄", "🐚", "🪨", "🌾", "💐", "🌷", "🌹", "🥀", "🌺", "🌸", "🌼", "🌻", "🌞", "🌝", "🌛", "🌜", "🌚", "🌕", "🌖", "🌗", "🌘", "🌑", "🌒", "🌓", "🌔", "🌙", "🌎", "🌍", "🌏", "🪐", "💫", "⭐", "🌟", "✨", "⚡", "☄", "💥", "🔥", "🌪", "🌈", "☀", "🌤", "⛅", "🌥", "☁", "🌦", "🌧", "⛈", "🌩", "🌨", "❄", "☃", "⛄", "🌬", "💨", "💧", "💦", "☔", "☂", "🌊", "🌫" + "🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼", "🐻‍❄", "🐨", "🐯", "🦁", "🐮", "🐷", "🐽", "🐸", "🐵", "🙈", "🙉", "🙊", "🐒", "🐔", "🐧", "🐦", "🐤", "🐣", "🐥", "🦆", "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", "🪱", "🐛", "🦋", "🐌", "🐞", "🐜", "🪰", "🪲", "🪳", "🦟", "🦗", "🕷", "🕸", "🦂", "🐢", "🐍", "🦎", "🦖", "🦕", "🐙", "🦑", "🦐", "🦞", "🦀", "🐡", "🐠", "🐟", "🐬", "🐳", "🐋", "🦈", "🦭", "🐊", "🐅", "🐆", "🦓", "🦍", "🦧", "🦣", "🐘", "🦛", "🦏", "🐪", "🐫", "🦒", "🦘", "🦬", "🐃", "🐂", "🐄", "🐎", "🐖", "🐏", "🐑", "🦙", "🐐", "🦌", "🐕", "🐩", "🦮", "🐕‍🦺", "🐈", "🐈‍⬛", "🪶", "🐓", "🦃", "🦤", "🦚", "🦜", "🦢", "🦩", "🕊", "🐇", "🦝", "🦨", "🦡", "🦫", "🦦", "🦥", "🐁", "🐀", "🐿", "🦔", "🐾", "🐉", "🐲", "🌵", "🎄", "🌲", "🌳", "🌴", "🪵", "🌱", "🌿", "☘", "🍀", "🎍", "🪴", "🎋", "🍃", "🍂", "🍁", "🪺", "🪹", "🍄", "🐚", "🪸", "🪨", "🌾", "💐", "🌷", "🌹", "🥀", "🪷", "🌺", "🌸", "🌼", "🌻", "🌞", "🌝", "🌛", "🌜", "🌚", "🌕", "🌖", "🌗", "🌘", "🌑", "🌒", "🌓", "🌔", "🌙", "🌎", "🌍", "🌏", "🪐", "💫", "⭐", "🌟", "✨", "⚡", "☄", "💥", "🔥", "🌪", "🌈", "☀", "🌤", "⛅", "🌥", "☁", "🌦", "🌧", "⛈", "🌩", "🌨", "❄", "☃", "⛄", "🌬", "💨", "💧", "💦", "🫧", "☔", "☂", "🌊", "🌫" }, new String[]{ - "🍏", "🍎", "🍐", "🍊", "🍋", "🍌", "🍉", "🍇", "🍓", "🫐", "🍈", "🍒", "🍑", "🥭", "🍍", "🥥", "🥝", "🍅", "🍆", "🥑", "🥦", "🥬", "🥒", "🌶", "🫑", "🌽", "🥕", "🫒", "🧄", "🧅", "🥔", "🍠", "🥐", "🥯", "🍞", "🥖", "🥨", "🧀", "🥚", "🍳", "🧈", "🥞", "🧇", "🥓", "🥩", "🍗", "🍖", "🦴", "🌭", "🍔", "🍟", "🍕", "🫓", "🥪", "🥙", "🧆", "🌮", "🌯", "🫔", "🥗", "🥘", "🫕", "🥫", "🍝", "🍜", "🍲", "🍛", "🍣", "🍱", "🥟", "🦪", "🍤", "🍙", "🍚", "🍘", "🍥", "🥠", "🥮", "🍢", "🍡", "🍧", "🍨", "🍦", "🥧", "🧁", "🍰", "🎂", "🍮", "🍭", "🍬", "🍫", "🍿", "🍩", "🍪", "🌰", "🥜", "🍯", "🥛", "🍼", "🫖", "☕", "🍵", "🧃", "🥤", "🧋", "🍶", "🍺", "🍻", "🥂", "🍷", "🥃", "🍸", "🍹", "🧉", "🍾", "🧊", "🥄", "🍴", "🍽", "🥣", "🥡", "🥢", "🧂" + "🍏", "🍎", "🍐", "🍊", "🍋", "🍌", "🍉", "🍇", "🍓", "🫐", "🍈", "🍒", "🍑", "🥭", "🍍", "🥥", "🥝", "🍅", "🍆", "🥑", "🥦", "🥬", "🥒", "🌶", "🫑", "🌽", "🥕", "🫒", "🧄", "🧅", "🥔", "🍠", "🥐", "🥯", "🍞", "🥖", "🥨", "🧀", "🥚", "🍳", "🧈", "🥞", "🧇", "🥓", "🥩", "🍗", "🍖", "🦴", "🌭", "🍔", "🍟", "🍕", "🫓", "🥪", "🥙", "🧆", "🌮", "🌯", "🫔", "🥗", "🥘", "🫕", "🥫", "🫙", "🍝", "🍜", "🍲", "🍛", "🍣", "🍱", "🥟", "🦪", "🍤", "🍙", "🍚", "🍘", "🍥", "🥠", "🥮", "🍢", "🍡", "🍧", "🍨", "🍦", "🥧", "🧁", "🍰", "🎂", "🍮", "🍭", "🍬", "🍫", "🍿", "🍩", "🍪", "🌰", "🥜", "🫘", "🍯", "🥛", "🫗", "🍼", "🫖", "☕", "🍵", "🧃", "🥤", "🧋", "🍶", "🍺", "🍻", "🥂", "🍷", "🥃", "🍸", "🍹", "🧉", "🍾", "🧊", "🥄", "🍴", "🍽", "🥣", "🥡", "🥢", "🧂" }, new String[]{ - "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", "🥏", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", "🏏", "🪃", "🥅", "⛳", "🪁", "🏹", "🎣", "🤿", "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸", "🥌", "🎿", "⛷", "🏂", "🪂", "🏋‍♀", "🏋🏻‍♀", "🏋🏼‍♀", "🏋🏽‍♀", "🏋🏾‍♀", "🏋🏿‍♀", "🏋", "🏋🏻", "🏋🏼", "🏋🏽", "🏋🏾", "🏋🏿", "🏋‍♂", "🏋🏻‍♂", "🏋🏼‍♂", "🏋🏽‍♂", "🏋🏾‍♂", "🏋🏿‍♂", "🤼‍♀", "🤼", "🤼‍♂", "🤸‍♀", "🤸🏻‍♀", "🤸🏼‍♀", "🤸🏽‍♀", "🤸🏾‍♀", "🤸🏿‍♀", "🤸", "🤸🏻", "🤸🏼", "🤸🏽", "🤸🏾", "🤸🏿", "🤸‍♂", "🤸🏻‍♂", "🤸🏼‍♂", "🤸🏽‍♂", "🤸🏾‍♂", "🤸🏿‍♂", "⛹‍♀", "⛹🏻‍♀", "⛹🏼‍♀", "⛹🏽‍♀", "⛹🏾‍♀", "⛹🏿‍♀", "⛹", "⛹🏻", "⛹🏼", "⛹🏽", "⛹🏾", "⛹🏿", "⛹‍♂", "⛹🏻‍♂", "⛹🏼‍♂", "⛹🏽‍♂", "⛹🏾‍♂", "⛹🏿‍♂", "🤺", "🤾‍♀", "🤾🏻‍♀", "🤾🏼‍♀", "🤾🏽‍♀", "🤾🏾‍♀", "🤾🏿‍♀", "🤾", "🤾🏻", "🤾🏼", "🤾🏽", "🤾🏾", "🤾🏿", "🤾‍♂", "🤾🏻‍♂", "🤾🏼‍♂", "🤾🏽‍♂", "🤾🏾‍♂", "🤾🏿‍♂", "🏌‍♀", "🏌🏻‍♀", "🏌🏼‍♀", "🏌🏽‍♀", "🏌🏾‍♀", "🏌🏿‍♀", "🏌", "🏌🏻", "🏌🏼", "🏌🏽", "🏌🏾", "🏌🏿", "🏌‍♂", "🏌🏻‍♂", "🏌🏼‍♂", "🏌🏽‍♂", "🏌🏾‍♂", "🏌🏿‍♂", "🏇", "🏇🏻", "🏇🏼", "🏇🏽", "🏇🏾", "🏇🏿", "🧘‍♀", "🧘🏻‍♀", "🧘🏼‍♀", "🧘🏽‍♀", "🧘🏾‍♀", "🧘🏿‍♀", "🧘", "🧘🏻", "🧘🏼", "🧘🏽", "🧘🏾", "🧘🏿", "🧘‍♂", "🧘🏻‍♂", "🧘🏼‍♂", "🧘🏽‍♂", "🧘🏾‍♂", "🧘🏿‍♂", "🏄‍♀", "🏄🏻‍♀", "🏄🏼‍♀", "🏄🏽‍♀", "🏄🏾‍♀", "🏄🏿‍♀", "🏄", "🏄🏻", "🏄🏼", "🏄🏽", "🏄🏾", "🏄🏿", "🏄‍♂", "🏄🏻‍♂", "🏄🏼‍♂", "🏄🏽‍♂", "🏄🏾‍♂", "🏄🏿‍♂", "🏊‍♀", "🏊🏻‍♀", "🏊🏼‍♀", "🏊🏽‍♀", "🏊🏾‍♀", "🏊🏿‍♀", "🏊", "🏊🏻", "🏊🏼", "🏊🏽", "🏊🏾", "🏊🏿", "🏊‍♂", "🏊🏻‍♂", "🏊🏼‍♂", "🏊🏽‍♂", "🏊🏾‍♂", "🏊🏿‍♂", "🤽‍♀", "🤽🏻‍♀", "🤽🏼‍♀", "🤽🏽‍♀", "🤽🏾‍♀", "🤽🏿‍♀", "🤽", "🤽🏻", "🤽🏼", "🤽🏽", "🤽🏾", "🤽🏿", "🤽‍♂", "🤽🏻‍♂", "🤽🏼‍♂", "🤽🏽‍♂", "🤽🏾‍♂", "🤽🏿‍♂", "🚣‍♀", "🚣🏻‍♀", "🚣🏼‍♀", "🚣🏽‍♀", "🚣🏾‍♀", "🚣🏿‍♀", "🚣", "🚣🏻", "🚣🏼", "🚣🏽", "🚣🏾", "🚣🏿", "🚣‍♂", "🚣🏻‍♂", "🚣🏼‍♂", "🚣🏽‍♂", "🚣🏾‍♂", "🚣🏿‍♂", "🧗‍♀", "🧗🏻‍♀", "🧗🏼‍♀", "🧗🏽‍♀", "🧗🏾‍♀", "🧗🏿‍♀", "🧗", "🧗🏻", "🧗🏼", "🧗🏽", "🧗🏾", "🧗🏿", "🧗‍♂", "🧗🏻‍♂", "🧗🏼‍♂", "🧗🏽‍♂", "🧗🏾‍♂", "🧗🏿‍♂", "🚵‍♀", "🚵🏻‍♀", "🚵🏼‍♀", "🚵🏽‍♀", "🚵🏾‍♀", "🚵🏿‍♀", "🚵", "🚵🏻", "🚵🏼", "🚵🏽", "🚵🏾", "🚵🏿", "🚵‍♂", "🚵🏻‍♂", "🚵🏼‍♂", "🚵🏽‍♂", "🚵🏾‍♂", "🚵🏿‍♂", "🚴‍♀", "🚴🏻‍♀", "🚴🏼‍♀", "🚴🏽‍♀", "🚴🏾‍♀", "🚴🏿‍♀", "🚴", "🚴🏻", "🚴🏼", "🚴🏽", "🚴🏾", "🚴🏿", "🚴‍♂", "🚴🏻‍♂", "🚴🏼‍♂", "🚴🏽‍♂", "🚴🏾‍♂", "🚴🏿‍♂", "🏆", "🥇", "🥈", "🥉", "🏅", "🎖", "🏵", "🎗", "🎫", "🎟", "🎪", "🤹‍♀", "🤹🏻‍♀", "🤹🏼‍♀", "🤹🏽‍♀", "🤹🏾‍♀", "🤹🏿‍♀", "🤹", "🤹🏻", "🤹🏼", "🤹🏽", "🤹🏾", "🤹🏿", "🤹‍♂", "🤹🏻‍♂", "🤹🏼‍♂", "🤹🏽‍♂", "🤹🏾‍♂", "🤹🏿‍♂", "🎭", "🩰", "🎨", "🎬", "🎤", "🎧", "🎼", "🎹", "🥁", "🪘", "🎷", "🎺", "🪗", "🎸", "🪕", "🎻", "🎲", "♟", "🎯", "🎳", "🎮", "🎰", "🧩" + "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", "🥏", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", "🏏", "🪃", "🥅", "⛳", "🪁", "🛝", "🏹", "🎣", "🤿", "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸", "🥌", "🎿", "⛷", "🏂", "🪂", "🏋‍♀", "🏋🏻‍♀", "🏋🏼‍♀", "🏋🏽‍♀", "🏋🏾‍♀", "🏋🏿‍♀", "🏋", "🏋🏻", "🏋🏼", "🏋🏽", "🏋🏾", "🏋🏿", "🏋‍♂", "🏋🏻‍♂", "🏋🏼‍♂", "🏋🏽‍♂", "🏋🏾‍♂", "🏋🏿‍♂", "🤼‍♀", "🤼", "🤼‍♂", "🤸‍♀", "🤸🏻‍♀", "🤸🏼‍♀", "🤸🏽‍♀", "🤸🏾‍♀", "🤸🏿‍♀", "🤸", "🤸🏻", "🤸🏼", "🤸🏽", "🤸🏾", "🤸🏿", "🤸‍♂", "🤸🏻‍♂", "🤸🏼‍♂", "🤸🏽‍♂", "🤸🏾‍♂", "🤸🏿‍♂", "⛹‍♀", "⛹🏻‍♀", "⛹🏼‍♀", "⛹🏽‍♀", "⛹🏾‍♀", "⛹🏿‍♀", "⛹", "⛹🏻", "⛹🏼", "⛹🏽", "⛹🏾", "⛹🏿", "⛹‍♂", "⛹🏻‍♂", "⛹🏼‍♂", "⛹🏽‍♂", "⛹🏾‍♂", "⛹🏿‍♂", "🤺", "🤾‍♀", "🤾🏻‍♀", "🤾🏼‍♀", "🤾🏽‍♀", "🤾🏾‍♀", "🤾🏿‍♀", "🤾", "🤾🏻", "🤾🏼", "🤾🏽", "🤾🏾", "🤾🏿", "🤾‍♂", "🤾🏻‍♂", "🤾🏼‍♂", "🤾🏽‍♂", "🤾🏾‍♂", "🤾🏿‍♂", "🏌‍♀", "🏌🏻‍♀", "🏌🏼‍♀", "🏌🏽‍♀", "🏌🏾‍♀", "🏌🏿‍♀", "🏌", "🏌🏻", "🏌🏼", "🏌🏽", "🏌🏾", "🏌🏿", "🏌‍♂", "🏌🏻‍♂", "🏌🏼‍♂", "🏌🏽‍♂", "🏌🏾‍♂", "🏌🏿‍♂", "🏇", "🏇🏻", "🏇🏼", "🏇🏽", "🏇🏾", "🏇🏿", "🧘‍♀", "🧘🏻‍♀", "🧘🏼‍♀", "🧘🏽‍♀", "🧘🏾‍♀", "🧘🏿‍♀", "🧘", "🧘🏻", "🧘🏼", "🧘🏽", "🧘🏾", "🧘🏿", "🧘‍♂", "🧘🏻‍♂", "🧘🏼‍♂", "🧘🏽‍♂", "🧘🏾‍♂", "🧘🏿‍♂", "🏄‍♀", "🏄🏻‍♀", "🏄🏼‍♀", "🏄🏽‍♀", "🏄🏾‍♀", "🏄🏿‍♀", "🏄", "🏄🏻", "🏄🏼", "🏄🏽", "🏄🏾", "🏄🏿", "🏄‍♂", "🏄🏻‍♂", "🏄🏼‍♂", "🏄🏽‍♂", "🏄🏾‍♂", "🏄🏿‍♂", "🏊‍♀", "🏊🏻‍♀", "🏊🏼‍♀", "🏊🏽‍♀", "🏊🏾‍♀", "🏊🏿‍♀", "🏊", "🏊🏻", "🏊🏼", "🏊🏽", "🏊🏾", "🏊🏿", "🏊‍♂", "🏊🏻‍♂", "🏊🏼‍♂", "🏊🏽‍♂", "🏊🏾‍♂", "🏊🏿‍♂", "🤽‍♀", "🤽🏻‍♀", "🤽🏼‍♀", "🤽🏽‍♀", "🤽🏾‍♀", "🤽🏿‍♀", "🤽", "🤽🏻", "🤽🏼", "🤽🏽", "🤽🏾", "🤽🏿", "🤽‍♂", "🤽🏻‍♂", "🤽🏼‍♂", "🤽🏽‍♂", "🤽🏾‍♂", "🤽🏿‍♂", "🚣‍♀", "🚣🏻‍♀", "🚣🏼‍♀", "🚣🏽‍♀", "🚣🏾‍♀", "🚣🏿‍♀", "🚣", "🚣🏻", "🚣🏼", "🚣🏽", "🚣🏾", "🚣🏿", "🚣‍♂", "🚣🏻‍♂", "🚣🏼‍♂", "🚣🏽‍♂", "🚣🏾‍♂", "🚣🏿‍♂", "🧗‍♀", "🧗🏻‍♀", "🧗🏼‍♀", "🧗🏽‍♀", "🧗🏾‍♀", "🧗🏿‍♀", "🧗", "🧗🏻", "🧗🏼", "🧗🏽", "🧗🏾", "🧗🏿", "🧗‍♂", "🧗🏻‍♂", "🧗🏼‍♂", "🧗🏽‍♂", "🧗🏾‍♂", "🧗🏿‍♂", "🚵‍♀", "🚵🏻‍♀", "🚵🏼‍♀", "🚵🏽‍♀", "🚵🏾‍♀", "🚵🏿‍♀", "🚵", "🚵🏻", "🚵🏼", "🚵🏽", "🚵🏾", "🚵🏿", "🚵‍♂", "🚵🏻‍♂", "🚵🏼‍♂", "🚵🏽‍♂", "🚵🏾‍♂", "🚵🏿‍♂", "🚴‍♀", "🚴🏻‍♀", "🚴🏼‍♀", "🚴🏽‍♀", "🚴🏾‍♀", "🚴🏿‍♀", "🚴", "🚴🏻", "🚴🏼", "🚴🏽", "🚴🏾", "🚴🏿", "🚴‍♂", "🚴🏻‍♂", "🚴🏼‍♂", "🚴🏽‍♂", "🚴🏾‍♂", "🚴🏿‍♂", "🏆", "🥇", "🥈", "🥉", "🏅", "🎖", "🏵", "🎗", "🎫", "🎟", "🎪", "🤹‍♀", "🤹🏻‍♀", "🤹🏼‍♀", "🤹🏽‍♀", "🤹🏾‍♀", "🤹🏿‍♀", "🤹", "🤹🏻", "🤹🏼", "🤹🏽", "🤹🏾", "🤹🏿", "🤹‍♂", "🤹🏻‍♂", "🤹🏼‍♂", "🤹🏽‍♂", "🤹🏾‍♂", "🤹🏿‍♂", "🎭", "🩰", "🎨", "🎬", "🎤", "🎧", "🎼", "🎹", "🥁", "🪘", "🎷", "🎺", "🪗", "🎸", "🪕", "🎻", "🎲", "♟", "🎯", "🎳", "🎮", "🎰", "🧩" }, new String[]{ - "🚗", "🚕", "🚙", "🚌", "🚎", "🏎", "🚓", "🚑", "🚒", "🚐", "🛻", "🚚", "🚛", "🚜", "🦯", "🦽", "🦼", "🛴", "🚲", "🛵", "🏍", "🛺", "🚨", "🚔", "🚍", "🚘", "🚖", "🚡", "🚠", "🚟", "🚃", "🚋", "🚞", "🚝", "🚄", "🚅", "🚈", "🚂", "🚆", "🚇", "🚊", "🚉", "✈", "🛫", "🛬", "🛩", "💺", "🛰", "🚀", "🛸", "🚁", "🛶", "⛵", "🚤", "🛥", "🛳", "⛴", "🚢", "⚓", "🪝", "⛽", "🚧", "🚦", "🚥", "🚏", "🗺", "🗿", "🗽", "🗼", "🏰", "🏯", "🏟", "🎡", "🎢", "🎠", "⛲", "⛱", "🏖", "🏝", "🏜", "🌋", "⛰", "🏔", "🗻", "🏕", "⛺", "🛖", "🏠", "🏡", "🏘", "🏚", "🏗", "🏭", "🏢", "🏬", "🏣", "🏤", "🏥", "🏦", "🏨", "🏪", "🏫", "🏩", "💒", "🏛", "⛪", "🕌", "🕍", "🛕", "🕋", "⛩", "🛤", "🛣", "🗾", "🎑", "🏞", "🌅", "🌄", "🌠", "🎇", "🎆", "🌇", "🌆", "🏙", "🌃", "🌌", "🌉", "🌁" + "🚗", "🚕", "🚙", "🚌", "🚎", "🏎", "🚓", "🚑", "🚒", "🚐", "🛻", "🚚", "🚛", "🚜", "🦯", "🦽", "🦼", "🩼", "🛴", "🚲", "🛵", "🏍", "🛺", "🛞", "🚨", "🚔", "🚍", "🚘", "🚖", "🚡", "🚠", "🚟", "🚃", "🚋", "🚞", "🚝", "🚄", "🚅", "🚈", "🚂", "🚆", "🚇", "🚊", "🚉", "✈", "🛫", "🛬", "🛩", "💺", "🛰", "🚀", "🛸", "🚁", "🛶", "⛵", "🚤", "🛥", "🛳", "⛴", "🚢", "🛟", "⚓", "🪝", "⛽", "🚧", "🚦", "🚥", "🚏", "🗺", "🗿", "🗽", "🗼", "🏰", "🏯", "🏟", "🎡", "🎢", "🎠", "⛲", "⛱", "🏖", "🏝", "🏜", "🌋", "⛰", "🏔", "🗻", "🏕", "⛺", "🛖", "🏠", "🏡", "🏘", "🏚", "🏗", "🏭", "🏢", "🏬", "🏣", "🏤", "🏥", "🏦", "🏨", "🏪", "🏫", "🏩", "💒", "🏛", "⛪", "🕌", "🕍", "🛕", "🕋", "⛩", "🛤", "🛣", "🗾", "🎑", "🏞", "🌅", "🌄", "🌠", "🎇", "🎆", "🌇", "🌆", "🏙", "🌃", "🌌", "🌉", "🌁" }, new String[]{ - "⌚", "📱", "📲", "💻", "⌨", "🖥", "🖨", "🖱", "🖲", "🕹", "🗜", "💽", "💾", "💿", "📀", "📼", "📷", "📸", "📹", "🎥", "📽", "🎞", "📞", "☎", "📟", "📠", "📺", "📻", "🎙", "🎚", "🎛", "🧭", "⏱", "⏲", "⏰", "🕰", "⌛", "⏳", "📡", "🔋", "🔌", "💡", "🔦", "🕯", "🪔", "🧯", "🛢", "💸", "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "💎", "⚖", "🪜", "🧰", "🪛", "🔧", "🔨", "⚒", "🛠", "⛏", "🪚", "🔩", "⚙", "🪤", "🧱", "⛓", "🧲", "🔫", "💣", "🧨", "🪓", "🔪", "🗡", "⚔", "🛡", "🚬", "⚰", "🪦", "⚱", "🏺", "🔮", "📿", "🧿", "💈", "⚗", "🔭", "🔬", "🕳", "🩹", "🩺", "💊", "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡", "🧹", "🪠", "🧺", "🧻", "🚽", "🚰", "🚿", "🛁", "🛀", "🛀🏻", "🛀🏼", "🛀🏽", "🛀🏾", "🛀🏿", "🧼", "🪥", "🪒", "🧽", "🪣", "🧴", "🛎", "🔑", "🗝", "🚪", "🪑", "🛋", "🛏", "🛌", "🧸", "🪆", "🖼", "🪞", "🪟", "🛍", "🛒", "🎁", "🎈", "🎏", "🎀", "🪄", "🪅", "🎊", "🎉", "🎎", "🏮", "🎐", "🧧", "✉", "📩", "📨", "📧", "💌", "📥", "📤", "📦", "🏷", "🪧", "📪", "📫", "📬", "📭", "📮", "📯", "📜", "📃", "📄", "📑", "🧾", "📊", "📈", "📉", "🗒", "🗓", "📆", "📅", "🗑", "📇", "🗃", "🗳", "🗄", "📋", "📁", "📂", "🗂", "🗞", "📰", "📓", "📔", "📒", "📕", "📗", "📘", "📙", "📚", "📖", "🔖", "🧷", "🔗", "📎", "🖇", "📐", "📏", "🧮", "📌", "📍", "✂", "🖊", "🖋", "✒", "🖌", "🖍", "📝", "✏", "🔍", "🔎", "🔏", "🔐", "🔒", "🔓" + "⌚", "📱", "📲", "💻", "⌨", "🖥", "🖨", "🖱", "🖲", "🕹", "🗜", "💽", "💾", "💿", "📀", "📼", "📷", "📸", "📹", "🎥", "📽", "🎞", "📞", "☎", "📟", "📠", "📺", "📻", "🎙", "🎚", "🎛", "🧭", "⏱", "⏲", "⏰", "🕰", "⌛", "⏳", "📡", "🔋", "🪫", "🔌", "💡", "🔦", "🕯", "🪔", "🧯", "🛢", "💸", "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "🪪", "💎", "⚖", "🪜", "🧰", "🪛", "🔧", "🔨", "⚒", "🛠", "⛏", "🪚", "🔩", "⚙", "🪤", "🧱", "⛓", "🧲", "🔫", "💣", "🧨", "🪓", "🔪", "🗡", "⚔", "🛡", "🚬", "⚰", "🪦", "⚱", "🏺", "🔮", "📿", "🧿", "🪬", "💈", "⚗", "🔭", "🔬", "🕳️", "🩻", "🩹", "🩺", "💊", "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡", "🧹", "🪠", "🧺", "🧻", "🚽", "🚰", "🚿", "🛁", "🛀", "🛀🏻", "🛀🏼", "🛀🏽", "🛀🏾", "🛀🏿", "🧼", "🪥", "🪒", "🧽", "🪣", "🧴", "🛎", "🔑", "🗝", "🚪", "🪑", "🛋", "🛏", "🛌", "🧸", "🪆", "🖼", "🪞", "🪟", "🛍", "🛒", "🎁", "🎈", "🎏", "🎀", "🪄", "🪅", "🎊", "🎉", "🎎", "🏮", "🎐", "🪩", "🧧", "✉", "📩", "📨", "📧", "💌", "📥", "📤", "📦", "🏷", "🪧", "📪", "📫", "📬", "📭", "📮", "📯", "📜", "📃", "📄", "📑", "🧾", "📊", "📈", "📉", "🗒", "🗓", "📆", "📅", "🗑", "📇", "🗃", "🗳", "🗄", "📋", "📁", "📂", "🗂", "🗞", "📰", "📓", "📔", "📒", "📕", "📗", "📘", "📙", "📚", "📖", "🔖", "🧷", "🔗", "📎", "🖇", "📐", "📏", "🧮", "📌", "📍", "✂", "🖊", "🖋", "✒", "🖌", "🖍", "📝", "✏", "🔍", "🔎", "🔏", "🔐", "🔒", "🔓" }, new String[]{ - "❤", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤍", "🤎", "💔", "❤‍🔥", "❤‍🩹", "❣", "💕", "💞", "💓", "💗", "💖", "💘", "💝", "💟", "☮", "✝", "☪", "🕉", "☸", "✡", "🔯", "🕎", "☯", "☦", "🛐", "⛎", "♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", "♑", "♒", "♓", "🆔", "⚛", "🉑", "☢", "☣", "📴", "📳", "🈶", "🈚", "🈸", "🈺", "🈷", "✴", "🆚", "💮", "🉐", "㊙", "㊗", "🈴", "🈵", "🈹", "🈲", "🅰", "🅱", "🆎", "🆑", "🅾", "🆘", "❌", "⭕", "🛑", "⛔", "📛", "🚫", "💯", "💢", "♨", "🚷", "🚯", "🚳", "🚱", "🔞", "📵", "🚭", "❗", "❕", "❓", "❔", "‼", "⁉", "🔅", "🔆", "〽", "⚠", "🚸", "🔱", "⚜", "🔰", "♻", "✅", "🈯", "💹", "❇", "✳", "❎", "🌐", "💠", "Ⓜ", "🌀", "💤", "🏧", "🚾", "♿", "🅿", "🛗", "🈳", "🈂", "🛂", "🛃", "🛄", "🛅", "🚹", "🚺", "🚼", "⚧", "🚻", "🚮", "🎦", "📶", "🈁", "🔣", "ℹ", "🔤", "🔡", "🔠", "🆖", "🆗", "🆙", "🆒", "🆕", "🆓", "0⃣", "1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟", "🔢", "#⃣", "*⃣", "⏏", "▶", "⏸", "⏯", "⏹", "⏺", "⏭", "⏮", "⏩", "⏪", "⏫", "⏬", "◀", "🔼", "🔽", "➡", "⬅", "⬆", "⬇", "↗", "↘", "↙", "↖", "↕", "↔", "↪", "↩", "⤴", "⤵", "🔀", "🔁", "🔂", "🔄", "🔃", "🎵", "🎶", "➕", "➖", "➗", "✖", "♾", "💲", "💱", "™", "©", "®", "👁‍🗨", "🔚", "🔙", "🔛", "🔝", "🔜", "〰", "➰", "➿", "✔", "☑", "🔘", "🔴", "🟠", "🟡", "🟢", "🔵", "🟣", "⚫", "⚪", "🟤", "🔺", "🔻", "🔸", "🔹", "🔶", "🔷", "🔳", "🔲", "▪", "▫", "◾", "◽", "◼", "◻", "🟥", "🟧", "🟨", "🟩", "🟦", "🟪", "⬛", "⬜", "🟫", "🔈", "🔇", "🔉", "🔊", "🔔", "🔕", "📣", "📢", "💬", "💭", "🗯", "♠", "♣", "♥", "♦", "🃏", "🎴", "🀄", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖", "🕗", "🕘", "🕙", "🕚", "🕛", "🕜", "🕝", "🕞", "🕟", "🕠", "🕡", "🕢", "🕣", "🕤", "🕥", "🕦", "🕧" + "❤", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤍", "🤎", "💔", "❤‍🔥", "❤‍🩹", "❣", "💕", "💞", "💓", "💗", "💖", "💘", "💝", "💟", "☮", "✝", "☪", "🕉", "☸", "✡", "🔯", "🕎", "☯", "☦", "🛐", "⛎", "♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", "♑", "♒", "♓", "🆔", "⚛", "🉑", "☢", "☣", "📴", "📳", "🈶", "🈚", "🈸", "🈺", "🈷", "✴", "🆚", "💮", "🉐", "㊙", "㊗", "🈴", "🈵", "🈹", "🈲", "🅰", "🅱", "🆎", "🆑", "🅾", "🆘", "❌", "⭕", "🛑", "⛔", "📛", "🚫", "💯", "💢", "♨", "🚷", "🚯", "🚳", "🚱", "🔞", "📵", "🚭", "❗", "❕", "❓", "❔", "‼", "⁉", "🔅", "🔆", "〽", "⚠", "🚸", "🔱", "⚜", "🔰", "♻", "✅", "🈯", "💹", "❇", "✳", "❎", "🌐", "💠", "Ⓜ", "🌀", "💤", "🏧", "🚾", "♿", "🅿", "🛗", "🈳", "🈂", "🛂", "🛃", "🛄", "🛅", "🚹", "🚺", "🚼", "⚧", "🚻", "🚮", "🎦", "📶", "🈁", "🔣", "ℹ", "🔤", "🔡", "🔠", "🆖", "🆗", "🆙", "🆒", "🆕", "🆓", "0⃣", "1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟", "🔢", "#⃣", "*⃣", "⏏", "▶", "⏸", "⏯", "⏹", "⏺", "⏭", "⏮", "⏩", "⏪", "⏫", "⏬", "◀", "🔼", "🔽", "➡", "⬅", "⬆", "⬇", "↗", "↘", "↙", "↖", "↕", "↔", "↪", "↩", "⤴", "⤵", "🔀", "🔁", "🔂", "🔄", "🔃", "🎵", "🎶", "➕", "➖", "➗", "✖", "🟰", "♾", "💲", "💱", "™", "©", "®", "👁‍🗨", "🔚", "🔙", "🔛", "🔝", "🔜", "〰", "➰", "➿", "✔", "☑", "🔘", "🔴", "🟠", "🟡", "🟢", "🔵", "🟣", "⚫", "⚪", "🟤", "🔺", "🔻", "🔸", "🔹", "🔶", "🔷", "🔳", "🔲", "▪", "▫", "◾", "◽", "◼", "◻", "🟥", "🟧", "🟨", "🟩", "🟦", "🟪", "⬛", "⬜", "🟫", "🔈", "🔇", "🔉", "🔊", "🔔", "🔕", "📣", "📢", "💬", "💭", "🗯", "♠", "♣", "♥", "♦", "🃏", "🎴", "🀄", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖", "🕗", "🕘", "🕙", "🕚", "🕛", "🕜", "🕝", "🕞", "🕟", "🕠", "🕡", "🕢", "🕣", "🕤", "🕥", "🕦", "🕧" }, new String[]{ "🏳", "🏴", "🏴‍☠", "🏁", "🚩", "🏳‍🌈", "🏳‍⚧", "🇺🇳", "🇦🇫", "🇦🇽", "🇦🇱", "🇩🇿", "🇦🇸", "🇦🇩", "🇦🇴", "🇦🇮", "🇦🇶", "🇦🇬", "🇦🇷", "🇦🇲", "🇦🇼", "🇦🇺", "🇦🇹", "🇦🇿", "🇧🇸", "🇧🇭", "🇧🇩", "🇧🇧", "🇧🇾", "🇧🇪", "🇧🇿", "🇧🇯", "🇧🇲", "🇧🇹", "🇧🇴", "🇧🇦", "🇧🇼", "🇧🇷", "🇻🇬", "🇧🇳", "🇧🇬", "🇧🇫", "🇧🇮", "🇰🇭", "🇨🇲", "🇨🇦", "🇮🇨", "🇨🇻", "🇧🇶", "🇰🇾", "🇨🇫", "🇹🇩", "🇮🇴", "🇨🇱", "🇨🇳", "🇨🇽", "🇨🇨", "🇨🇴", "🇰🇲", "🇨🇬", "🇨🇩", "🇨🇰", "🇨🇷", "🇨🇮", "🇭🇷", "🇨🇺", "🇨🇼", "🇨🇾", "🇨🇿", "🇩🇰", "🇩🇯", "🇩🇲", "🇩🇴", "🇪🇨", "🇪🇬", "🇸🇻", "🇬🇶", "🇪🇷", "🇪🇪", "🇸🇿", "🇪🇹", "🇪🇺", "🇫🇰", "🇫🇴", "🇫🇯", "🇫🇮", "🇫🇷", "🇬🇫", "🇵🇫", "🇹🇫", "🇬🇦", "🇬🇲", "🇬🇪", "🇩🇪", "🇬🇭", "🇬🇮", "🇬🇷", "🇬🇱", "🇬🇩", "🇬🇵", "🇬🇺", "🇬🇹", "🇬🇬", "🇬🇳", "🇬🇼", "🇬🇾", "🇭🇹", "🇭🇳", "🇭🇰", "🇭🇺", "🇮🇸", "🇮🇳", "🇮🇩", "🇮🇷", "🇮🇶", "🇮🇪", "🇮🇲", "🇮🇱", "🇮🇹", "🇯🇲", "🇯🇵", "🎌", "🇯🇪", "🇯🇴", "🇰🇿", "🇰🇪", "🇰🇮", "🇽🇰", "🇰🇼", "🇰🇬", "🇱🇦", "🇱🇻", "🇱🇧", "🇱🇸", "🇱🇷", "🇱🇾", "🇱🇮", "🇱🇹", "🇱🇺", "🇲🇴", "🇲🇬", "🇲🇼", "🇲🇾", "🇲🇻", "🇲🇱", "🇲🇹", "🇲🇭", "🇲🇶", "🇲🇷", "🇲🇺", "🇾🇹", "🇲🇽", "🇫🇲", "🇲🇩", "🇲🇨", "🇲🇳", "🇲🇪", "🇲🇸", "🇲🇦", "🇲🇿", "🇲🇲", "🇳🇦", "🇳🇷", "🇳🇵", "🇳🇱", "🇳🇨", "🇳🇿", "🇳🇮", "🇳🇪", "🇳🇬", "🇳🇺", "🇳🇫", "🇰🇵", "🇲🇰", "🇲🇵", "🇳🇴", "🇴🇲", "🇵🇰", "🇵🇼", "🇵🇸", "🇵🇦", "🇵🇬", "🇵🇾", "🇵🇪", "🇵🇭", "🇵🇳", "🇵🇱", "🇵🇹", "🇵🇷", "🇶🇦", "🇷🇪", "🇷🇴", "🇷🇺", "🇷🇼", "🇼🇸", "🇸🇲", "🇸🇹", "🇸🇦", "🇸🇳", "🇷🇸", "🇸🇨", "🇸🇱", "🇸🇬", "🇸🇽", "🇸🇰", "🇸🇮", "🇬🇸", "🇸🇧", "🇸🇴", "🇿🇦", "🇰🇷", "🇸🇸", "🇪🇸", "🇱🇰", "🇧🇱", "🇸🇭", "🇰🇳", "🇱🇨", "🇵🇲", "🇻🇨", "🇸🇩", "🇸🇷", "🇸🇪", "🇨🇭", "🇸🇾", "🇹🇼", "🇹🇯", "🇹🇿", "🇹🇭", "🇹🇱", "🇹🇬", "🇹🇰", "🇹🇴", "🇹🇹", "🇹🇳", "🇹🇷", "🇹🇲", "🇹🇨", "🇹🇻", "🇺🇬", "🇺🇦", "🇦🇪", "🇬🇧", "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "🏴󠁧󠁢󠁷󠁬󠁳󠁿", "🇺🇸", "🇺🇾", "🇻🇮", "🇺🇿", "🇻🇺", "🇻🇦", "🇻🇪", "🇻🇳", "🇼🇫", "🇪🇭", "🇾🇪", "🇿🇲", "🇿🇼" diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java b/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java index f64f41f9f..3e2c8bf88 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java @@ -97,7 +97,7 @@ class FeedRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory, N File f = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(size); if (f.exists()) { rv.setViewVisibility(R.id.feed_widget_item_image, View.VISIBLE); - Uri uri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", f); + Uri uri = FileProvider.getUriForFile(mContext, ApplicationLoader.getApplicationId() + ".provider", f); grantUriAccessToWidget(mContext, uri); rv.setImageViewUri(R.id.feed_widget_item_image, uri); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index 0bd10de29..2ee90b534 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -64,6 +64,7 @@ public class FileLoadOperation { private final static int stateDownloading = 1; private final static int stateFailed = 2; private final static int stateFinished = 3; + private final static int stateCanceled = 4; private int downloadChunkSize = 1024 * 32; private int downloadChunkSizeBig = 1024 * 128; @@ -588,7 +589,7 @@ public class FileLoadOperation { return progress + getDownloadedLengthFromOffsetInternal(ranges, (int) (totalBytesCount * progress), totalBytesCount) / (float) totalBytesCount; } - protected long[] getDownloadedLengthFromOffset(final int offset, final long length) { + protected long[] getDownloadedLengthFromOffset(final long offset, final long length) { final CountDownLatch countDownLatch = new CountDownLatch(1); final long[] result = new long[2]; Utilities.stageQueue.postRunnable(() -> { @@ -1445,8 +1446,8 @@ public class FileLoadOperation { protected boolean processRequestResult(RequestInfo requestInfo, TLRPC.TL_error error) { if (state != stateDownloading) { - if (BuildVars.DEBUG_VERSION) { - FileLog.e(new Exception("trying to write to finished file " + cacheFileFinal + " offset " + requestInfo.offset)); + if (BuildVars.DEBUG_VERSION && state == stateFinished) { + FileLog.e(new Exception("trying to write to finished file " + fileName + " offset " + requestInfo.offset + " " + totalBytesCount)); } return false; } @@ -1568,7 +1569,7 @@ public class FileLoadOperation { if (notLoadedBytesRanges != null) { fileOutputStream.seek(requestInfo.offset); if (BuildVars.DEBUG_VERSION) { - FileLog.d("save file part " + cacheFileFinal + " offset " + requestInfo.offset); + FileLog.d("save file part " + fileName + " offset=" + requestInfo.offset + " chunk_size=" + currentDownloadChunkSize + " isCdn=" + isCdn); } } FileChannel channel = fileOutputStream.getChannel(); @@ -1661,7 +1662,7 @@ public class FileLoadOperation { if (finishedDownloading) { onFinishLoadingFile(true); - } else { + } else if (state != stateCanceled){ startDownloadRequest(); } } catch (Exception e) { @@ -1715,7 +1716,7 @@ public class FileLoadOperation { protected void onFail(boolean thread, final int reason) { cleanup(); - state = stateFailed; + state = reason == 1 ? stateCanceled : stateFailed; if (delegate != null) { if (thread) { Utilities.stageQueue.postRunnable(() -> delegate.didFailedLoadingFile(FileLoadOperation.this, reason)); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index c6b3036a0..c5c99004e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -609,7 +609,7 @@ public class FileLoader extends BaseController { } } - private FileLoadOperation loadFileInternal(final TLRPC.Document document, final SecureDocument secureDocument, final WebFile webDocument, TLRPC.TL_fileLocationToBeDeprecated location, final ImageLocation imageLocation, Object parentObject, final String locationExt, final long locationSize, final int priority, final FileLoadOperationStream stream, final int streamOffset, boolean streamPriority, final int cacheType) { + private FileLoadOperation loadFileInternal(final TLRPC.Document document, final SecureDocument secureDocument, final WebFile webDocument, TLRPC.TL_fileLocationToBeDeprecated location, final ImageLocation imageLocation, Object parentObject, final String locationExt, final long locationSize, final int priority, final FileLoadOperationStream stream, final long streamOffset, boolean streamPriority, final int cacheType) { String fileName; if (location != null) { fileName = getAttachFileName(location, locationExt); @@ -728,7 +728,7 @@ public class FileLoader extends BaseController { queueType = QUEUE_TYPE_PRELOAD; } else if (type == MEDIA_DIR_AUDIO) { queueType = QUEUE_TYPE_AUDIO; - } else if (secureDocument != null || location != null && (imageLocation == null || imageLocation.imageType != IMAGE_TYPE_ANIMATION) || MessageObject.isImageWebDocument(webDocument) || MessageObject.isStickerDocument(document)) { + } else if (secureDocument != null || location != null && (imageLocation == null || imageLocation.imageType != IMAGE_TYPE_ANIMATION) || MessageObject.isImageWebDocument(webDocument) || MessageObject.isStickerDocument(document) || MessageObject.isAnimatedStickerDocument(document) || MessageObject.isVideoStickerDocument(document)) { queueType = QUEUE_TYPE_IMAGE; } else { queueType = QUEUE_TYPE_FILE; @@ -917,7 +917,7 @@ public class FileLoader extends BaseController { MessageObject messageObject = (MessageObject) parentObject; int flag; long dialogId = messageObject.getDialogId(); - if (messageObject.isRoundVideo() || messageObject.isVoice() || messageObject.isAnyKindOfSticker() || getMessagesController().isChatNoForwards(getMessagesController().getChat(-dialogId)) || messageObject.messageOwner.noforwards) { + if (messageObject.isRoundVideo() || messageObject.isVoice() || messageObject.isAnyKindOfSticker() || getMessagesController().isChatNoForwards(getMessagesController().getChat(-dialogId)) || messageObject.messageOwner.noforwards || DialogObject.isEncryptedDialog(dialogId)) { return false; } if (dialogId >= 0) { @@ -974,7 +974,7 @@ public class FileLoader extends BaseController { fileLoaderQueue.postRunnable(runnable); } - protected FileLoadOperation loadStreamFile(final FileLoadOperationStream stream, final TLRPC.Document document, final ImageLocation location, final Object parentObject, final int offset, final boolean priority) { + protected FileLoadOperation loadStreamFile(final FileLoadOperationStream stream, final TLRPC.Document document, final ImageLocation location, final Object parentObject, final long offset, final boolean priority) { final CountDownLatch semaphore = new CountDownLatch(1); final FileLoadOperation[] result = new FileLoadOperation[1]; fileLoaderQueue.postRunnable(() -> { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java b/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java index 96fa112c9..51b0bd306 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java @@ -154,9 +154,12 @@ public class FilePathDatabase { FileLog.d("get file path id=" + documentId + " dc=" + dc + " type=" + type + " path=" + res[0]); } } - cursor.dispose(); } catch (SQLiteException e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } syncLatch.countDown(); }); @@ -176,9 +179,12 @@ public class FilePathDatabase { FileLog.d("get file path id=" + documentId + " dc=" + dc + " type=" + type + " path=" + res); } } - cursor.dispose(); } catch (SQLiteException e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } return res; } @@ -190,9 +196,13 @@ public class FilePathDatabase { FileLog.d("put file path id=" + id + " dc=" + dc + " type=" + type + " path=" + path); } SQLitePreparedStatement state = null; + SQLitePreparedStatement deleteState = null; try { if (path != null) { - database.executeFast("DELETE FROM paths WHERE path = '" + path + "'"); + deleteState = database.executeFast("DELETE FROM paths WHERE path = ?"); + deleteState.bindString(1, path); + deleteState.step(); + state = database.executeFast("REPLACE INTO paths VALUES(?, ?, ?, ?)"); state.requery(); state.bindLong(1, id); @@ -200,11 +210,19 @@ public class FilePathDatabase { state.bindInteger(3, type); state.bindString(4, path); state.step(); + state.dispose(); } else { database.executeFast("DELETE FROM paths WHERE document_id = " + id + " AND dc_id = " + dc + " AND type = " + type).stepThis().dispose(); } } catch (SQLiteException e) { FileLog.e(e); + } finally { + if (deleteState != null) { + deleteState.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileStreamLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileStreamLoadOperation.java index 864a83383..cfb26754b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileStreamLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileStreamLoadOperation.java @@ -30,7 +30,7 @@ public class FileStreamLoadOperation extends BaseDataSource implements FileLoadO private Uri uri; private long bytesRemaining; private boolean opened; - private int currentOffset; + private long currentOffset; private CountDownLatch countDownLatch; private RandomAccessFile file; private TLRPC.Document document; @@ -69,7 +69,7 @@ public class FileStreamLoadOperation extends BaseDataSource implements FileLoadO } else if (document.mime_type.startsWith("audio")) { document.attributes.add(new TLRPC.TL_documentAttributeAudio()); } - loadOperation = FileLoader.getInstance(currentAccount).loadStreamFile(this, document, null, parentObject, currentOffset = (int) dataSpec.position, false); + loadOperation = FileLoader.getInstance(currentAccount).loadStreamFile(this, document, null, parentObject, currentOffset = dataSpec.position, false); bytesRemaining = dataSpec.length == C.LENGTH_UNSET ? document.size - dataSpec.position : dataSpec.length; if (bytesRemaining < 0) { throw new EOFException(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GcmPushListenerService.java b/TMessagesProj/src/main/java/org/telegram/messenger/GcmPushListenerService.java index 42de99110..be8bc529b 100755 --- a/TMessagesProj/src/main/java/org/telegram/messenger/GcmPushListenerService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/GcmPushListenerService.java @@ -8,1285 +8,36 @@ package org.telegram.messenger; -import android.os.SystemClock; -import android.text.TextUtils; -import android.util.Base64; - -import androidx.collection.LongSparseArray; +import androidx.annotation.NonNull; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; -import org.json.JSONArray; -import org.json.JSONObject; -import org.telegram.tgnet.ConnectionsManager; -import org.telegram.tgnet.NativeByteBuffer; -import org.telegram.tgnet.TLRPC; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; import java.util.Map; -import java.util.concurrent.CountDownLatch; public class GcmPushListenerService extends FirebaseMessagingService { - public static final int NOTIFICATION_ID = 1; - private CountDownLatch countDownLatch = new CountDownLatch(1); - @Override public void onMessageReceived(RemoteMessage message) { String from = message.getFrom(); - final Map data = message.getData(); - final long time = message.getSentTime(); - final long receiveTime = SystemClock.elapsedRealtime(); + Map data = message.getData(); + long time = message.getSentTime(); + if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM received data: " + data + " from: " + from); + FileLog.d("FCM received data: " + data + " from: " + from); } - AndroidUtilities.runOnUIThread(() -> { - ApplicationLoader.postInitApplication(); - Utilities.stageQueue.postRunnable(() -> { - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM START PROCESSING"); - } - int currentAccount = -1; - String loc_key = null; - String jsonString = null; - try { - Object value = data.get("p"); - if (!(value instanceof String)) { - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM DECRYPT ERROR 1"); - } - onDecryptError(); - return; - } - byte[] bytes = Base64.decode((String) value, Base64.URL_SAFE); - NativeByteBuffer buffer = new NativeByteBuffer(bytes.length); - buffer.writeBytes(bytes); - buffer.position(0); - if (SharedConfig.pushAuthKeyId == null) { - SharedConfig.pushAuthKeyId = new byte[8]; - byte[] authKeyHash = Utilities.computeSHA1(SharedConfig.pushAuthKey); - System.arraycopy(authKeyHash, authKeyHash.length - 8, SharedConfig.pushAuthKeyId, 0, 8); - } - byte[] inAuthKeyId = new byte[8]; - buffer.readBytes(inAuthKeyId, true); - if (!Arrays.equals(SharedConfig.pushAuthKeyId, inAuthKeyId)) { - onDecryptError(); - if (BuildVars.LOGS_ENABLED) { - FileLog.d(String.format(Locale.US, "GCM DECRYPT ERROR 2 k1=%s k2=%s, key=%s", Utilities.bytesToHex(SharedConfig.pushAuthKeyId), Utilities.bytesToHex(inAuthKeyId), Utilities.bytesToHex(SharedConfig.pushAuthKey))); - } - return; - } - - byte[] messageKey = new byte[16]; - buffer.readBytes(messageKey, true); - - MessageKeyData messageKeyData = MessageKeyData.generateMessageKeyData(SharedConfig.pushAuthKey, messageKey, true, 2); - Utilities.aesIgeEncryption(buffer.buffer, messageKeyData.aesKey, messageKeyData.aesIv, false, false, 24, bytes.length - 24); - - byte[] messageKeyFull = Utilities.computeSHA256(SharedConfig.pushAuthKey, 88 + 8, 32, buffer.buffer, 24, buffer.buffer.limit()); - if (!Utilities.arraysEquals(messageKey, 0, messageKeyFull, 8)) { - onDecryptError(); - if (BuildVars.LOGS_ENABLED) { - FileLog.d(String.format("GCM DECRYPT ERROR 3, key = %s", Utilities.bytesToHex(SharedConfig.pushAuthKey))); - } - return; - } - - int len = buffer.readInt32(true); - byte[] strBytes = new byte[len]; - buffer.readBytes(strBytes, true); - jsonString = new String(strBytes); - JSONObject json = new JSONObject(jsonString); - - if (json.has("loc_key")) { - loc_key = json.getString("loc_key"); - } else { - loc_key = ""; - } - - - - JSONObject custom; - Object object = json.get("custom"); - if (object instanceof JSONObject) { - custom = json.getJSONObject("custom"); - } else { - custom = new JSONObject(); - } - - Object userIdObject; - if (json.has("user_id")) { - userIdObject = json.get("user_id"); - } else { - userIdObject = null; - } - long accountUserId; - if (userIdObject == null) { - accountUserId = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId(); - } else { - if (userIdObject instanceof Long) { - accountUserId = (Long) userIdObject; - } else if (userIdObject instanceof Integer) { - accountUserId = (Integer) userIdObject; - } else if (userIdObject instanceof String) { - accountUserId = Utilities.parseInt((String) userIdObject); - } else { - accountUserId = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId(); - } - } - int account = UserConfig.selectedAccount; - boolean foundAccount = false; - for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { - if (UserConfig.getInstance(a).getClientUserId() == accountUserId) { - account = a; - foundAccount = true; - break; - } - } - if (!foundAccount) { - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM ACCOUNT NOT FOUND"); - } - countDownLatch.countDown(); - return; - } - final int accountFinal = currentAccount = account; - if (!UserConfig.getInstance(currentAccount).isClientActivated()) { - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM ACCOUNT NOT ACTIVATED"); - } - countDownLatch.countDown(); - return; - } - Object obj = data.get("google.sent_time"); - switch (loc_key) { - case "DC_UPDATE": { - int dc = custom.getInt("dc"); - String addr = custom.getString("addr"); - String[] parts = addr.split(":"); - if (parts.length != 2) { - countDownLatch.countDown(); - return; - } - String ip = parts[0]; - int port = Integer.parseInt(parts[1]); - ConnectionsManager.getInstance(currentAccount).applyDatacenterAddress(dc, ip, port); - ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); - countDownLatch.countDown(); - return; - } - case "MESSAGE_ANNOUNCEMENT": { - TLRPC.TL_updateServiceNotification update = new TLRPC.TL_updateServiceNotification(); - update.popup = false; - update.flags = 2; - update.inbox_date = (int) (time / 1000); - update.message = json.getString("message"); - update.type = "announcement"; - update.media = new TLRPC.TL_messageMediaEmpty(); - final TLRPC.TL_updates updates = new TLRPC.TL_updates(); - updates.updates.add(update); - Utilities.stageQueue.postRunnable(() -> MessagesController.getInstance(accountFinal).processUpdates(updates, false)); - ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); - countDownLatch.countDown(); - return; - } - case "SESSION_REVOKE": { - AndroidUtilities.runOnUIThread(() -> { - if (UserConfig.getInstance(accountFinal).getClientUserId() != 0) { - UserConfig.getInstance(accountFinal).clearConfig(); - MessagesController.getInstance(accountFinal).performLogout(0); - } - }); - countDownLatch.countDown(); - return; - } - case "GEO_LIVE_PENDING": { - Utilities.stageQueue.postRunnable(() -> LocationController.getInstance(accountFinal).setNewLocationEndWatchTime()); - countDownLatch.countDown(); - return; - } - } - - long channel_id; - long chat_id; - long user_id; - long dialogId = 0; - boolean scheduled; - if (custom.has("channel_id")) { - channel_id = custom.getLong("channel_id"); - dialogId = -channel_id; - } else { - channel_id = 0; - } - if (custom.has("from_id")) { - user_id = custom.getLong("from_id"); - dialogId = user_id; - } else { - user_id = 0; - } - if (custom.has("chat_id")) { - chat_id = custom.getLong("chat_id"); - dialogId = -chat_id; - } else { - chat_id = 0; - } - if (custom.has("encryption_id")) { - dialogId = DialogObject.makeEncryptedDialogId(custom.getInt("encryption_id")); - } - if (custom.has("schedule")) { - scheduled = custom.getInt("schedule") == 1; - } else { - scheduled = false; - } - if (dialogId == 0 && "ENCRYPTED_MESSAGE".equals(loc_key)) { - dialogId = NotificationsController.globalSecretChatId; - } - boolean canRelease = true; - if (dialogId != 0) { - if ("READ_HISTORY".equals(loc_key)) { - int max_id = custom.getInt("max_id"); - final ArrayList updates = new ArrayList<>(); - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM received read notification max_id = " + max_id + " for dialogId = " + dialogId); - } - if (channel_id != 0) { - TLRPC.TL_updateReadChannelInbox update = new TLRPC.TL_updateReadChannelInbox(); - update.channel_id = channel_id; - update.max_id = max_id; - updates.add(update); - } else { - TLRPC.TL_updateReadHistoryInbox update = new TLRPC.TL_updateReadHistoryInbox(); - if (user_id != 0) { - update.peer = new TLRPC.TL_peerUser(); - update.peer.user_id = user_id; - } else { - update.peer = new TLRPC.TL_peerChat(); - update.peer.chat_id = chat_id; - } - update.max_id = max_id; - updates.add(update); - } - MessagesController.getInstance(accountFinal).processUpdateArray(updates, null, null, false, 0); - } else if ("MESSAGE_DELETED".equals(loc_key)) { - String messages = custom.getString("messages"); - String[] messagesArgs = messages.split(","); - LongSparseArray> deletedMessages = new LongSparseArray<>(); - ArrayList ids = new ArrayList<>(); - for (int a = 0; a < messagesArgs.length; a++) { - ids.add(Utilities.parseInt(messagesArgs[a])); - } - deletedMessages.put(-channel_id, ids); - NotificationsController.getInstance(currentAccount).removeDeletedMessagesFromNotifications(deletedMessages); - - MessagesController.getInstance(currentAccount).deleteMessagesByPush(dialogId, ids, channel_id); - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM received " + loc_key + " for dialogId = " + dialogId + " mids = " + TextUtils.join(",", ids)); - } - } else if (!TextUtils.isEmpty(loc_key)) { - int msg_id; - if (custom.has("msg_id")) { - msg_id = custom.getInt("msg_id"); - } else { - msg_id = 0; - } - - long random_id; - if (custom.has("random_id")) { - random_id = Utilities.parseLong(custom.getString("random_id")); - } else { - random_id = 0; - } - - boolean processNotification = false; - if (msg_id != 0) { - Integer currentReadValue = MessagesController.getInstance(currentAccount).dialogs_read_inbox_max.get(dialogId); - if (currentReadValue == null) { - currentReadValue = MessagesStorage.getInstance(currentAccount).getDialogReadMax(false, dialogId); - MessagesController.getInstance(accountFinal).dialogs_read_inbox_max.put(dialogId, currentReadValue); - } - if (msg_id > currentReadValue) { - processNotification = true; - } - } else if (random_id != 0) { - if (!MessagesStorage.getInstance(account).checkMessageByRandomId(random_id)) { - processNotification = true; - } - } - - if (loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_")) { - processNotification = true; - } - - if (processNotification) { - long chat_from_id = custom.optLong("chat_from_id", 0); - long chat_from_broadcast_id = custom.optLong("chat_from_broadcast_id", 0); - long chat_from_group_id = custom.optLong("chat_from_group_id", 0); - boolean isGroup = chat_from_id != 0 || chat_from_group_id != 0; - - boolean mention = custom.has("mention") && custom.getInt("mention") != 0; - boolean silent = custom.has("silent") && custom.getInt("silent") != 0; - - String[] args; - if (json.has("loc_args")) { - JSONArray loc_args = json.getJSONArray("loc_args"); - args = new String[loc_args.length()]; - for (int a = 0; a < args.length; a++) { - args[a] = loc_args.getString(a); - } - } else { - args = null; - } - String messageText = null; - String message1 = null; - String name = args[0]; - String userName = null; - boolean localMessage = false; - boolean supergroup = false; - boolean pinned = false; - boolean channel = false; - boolean edited = custom.has("edit_date"); - if (loc_key.startsWith("CHAT_")) { - if (UserObject.isReplyUser(dialogId)) { - name += " @ " + args[1]; - } else { - supergroup = channel_id != 0; - userName = name; - name = args[1]; - } - } else if (loc_key.startsWith("PINNED_")) { - supergroup = channel_id != 0; - pinned = true; - } else if (loc_key.startsWith("CHANNEL_")) { - channel = true; - } - - if (BuildVars.LOGS_ENABLED) { - FileLog.d("GCM received message notification " + loc_key + " for dialogId = " + dialogId + " mid = " + msg_id); - } - if (loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_")) { - messageText = getReactedText(loc_key, args); - } else { - switch (loc_key) { - case "MESSAGE_RECURRING_PAY": { - messageText = LocaleController.formatString("NotificationMessageRecurringPay", R.string.NotificationMessageRecurringPay, args[0], args[1]); - message1 = LocaleController.getString("PaymentInvoice", R.string.PaymentInvoice); - break; - } - case "MESSAGE_TEXT": - case "CHANNEL_MESSAGE_TEXT": { - messageText = LocaleController.formatString("NotificationMessageText", R.string.NotificationMessageText, args[0], args[1]); - message1 = args[1]; - break; - } - case "MESSAGE_NOTEXT": { - messageText = LocaleController.formatString("NotificationMessageNoText", R.string.NotificationMessageNoText, args[0]); - message1 = LocaleController.getString("Message", R.string.Message); - break; - } - case "MESSAGE_PHOTO": { - messageText = LocaleController.formatString("NotificationMessagePhoto", R.string.NotificationMessagePhoto, args[0]); - message1 = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); - break; - } - case "MESSAGE_PHOTO_SECRET": { - messageText = LocaleController.formatString("NotificationMessageSDPhoto", R.string.NotificationMessageSDPhoto, args[0]); - message1 = LocaleController.getString("AttachDestructingPhoto", R.string.AttachDestructingPhoto); - break; - } - case "MESSAGE_VIDEO": { - messageText = LocaleController.formatString("NotificationMessageVideo", R.string.NotificationMessageVideo, args[0]); - message1 = LocaleController.getString("AttachVideo", R.string.AttachVideo); - break; - } - case "MESSAGE_VIDEO_SECRET": { - messageText = LocaleController.formatString("NotificationMessageSDVideo", R.string.NotificationMessageSDVideo, args[0]); - message1 = LocaleController.getString("AttachDestructingVideo", R.string.AttachDestructingVideo); - break; - } - case "MESSAGE_SCREENSHOT": { - messageText = LocaleController.getString("ActionTakeScreenshoot", R.string.ActionTakeScreenshoot).replace("un1", args[0]); - break; - } - case "MESSAGE_ROUND": { - messageText = LocaleController.formatString("NotificationMessageRound", R.string.NotificationMessageRound, args[0]); - message1 = LocaleController.getString("AttachRound", R.string.AttachRound); - break; - } - case "MESSAGE_DOC": { - messageText = LocaleController.formatString("NotificationMessageDocument", R.string.NotificationMessageDocument, args[0]); - message1 = LocaleController.getString("AttachDocument", R.string.AttachDocument); - break; - } - case "MESSAGE_STICKER": { - if (args.length > 1 && !TextUtils.isEmpty(args[1])) { - messageText = LocaleController.formatString("NotificationMessageStickerEmoji", R.string.NotificationMessageStickerEmoji, args[0], args[1]); - message1 = args[1] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); - } else { - messageText = LocaleController.formatString("NotificationMessageSticker", R.string.NotificationMessageSticker, args[0]); - message1 = LocaleController.getString("AttachSticker", R.string.AttachSticker); - } - break; - } - case "MESSAGE_AUDIO": { - messageText = LocaleController.formatString("NotificationMessageAudio", R.string.NotificationMessageAudio, args[0]); - message1 = LocaleController.getString("AttachAudio", R.string.AttachAudio); - break; - } - case "MESSAGE_CONTACT": { - messageText = LocaleController.formatString("NotificationMessageContact2", R.string.NotificationMessageContact2, args[0], args[1]); - message1 = LocaleController.getString("AttachContact", R.string.AttachContact); - break; - } - case "MESSAGE_QUIZ": { - messageText = LocaleController.formatString("NotificationMessageQuiz2", R.string.NotificationMessageQuiz2, args[0], args[1]); - message1 = LocaleController.getString("QuizPoll", R.string.QuizPoll); - break; - } - case "MESSAGE_POLL": { - messageText = LocaleController.formatString("NotificationMessagePoll2", R.string.NotificationMessagePoll2, args[0], args[1]); - message1 = LocaleController.getString("Poll", R.string.Poll); - break; - } - case "MESSAGE_GEO": { - messageText = LocaleController.formatString("NotificationMessageMap", R.string.NotificationMessageMap, args[0]); - message1 = LocaleController.getString("AttachLocation", R.string.AttachLocation); - break; - } - case "MESSAGE_GEOLIVE": { - messageText = LocaleController.formatString("NotificationMessageLiveLocation", R.string.NotificationMessageLiveLocation, args[0]); - message1 = LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation); - break; - } - case "MESSAGE_GIF": { - messageText = LocaleController.formatString("NotificationMessageGif", R.string.NotificationMessageGif, args[0]); - message1 = LocaleController.getString("AttachGif", R.string.AttachGif); - break; - } - case "MESSAGE_GAME": { - messageText = LocaleController.formatString("NotificationMessageGame", R.string.NotificationMessageGame, args[0], args[1]); - message1 = LocaleController.getString("AttachGame", R.string.AttachGame); - break; - } - case "MESSAGE_GAME_SCORE": - case "CHANNEL_MESSAGE_GAME_SCORE": { - messageText = LocaleController.formatString("NotificationMessageGameScored", R.string.NotificationMessageGameScored, args[0], args[1], args[2]); - break; - } - case "MESSAGE_INVOICE": { - messageText = LocaleController.formatString("NotificationMessageInvoice", R.string.NotificationMessageInvoice, args[0], args[1]); - message1 = LocaleController.getString("PaymentInvoice", R.string.PaymentInvoice); - break; - } - case "MESSAGE_FWDS": { - messageText = LocaleController.formatString("NotificationMessageForwardFew", R.string.NotificationMessageForwardFew, args[0], LocaleController.formatPluralString("messages", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "MESSAGE_PHOTOS": { - messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("Photos", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "MESSAGE_VIDEOS": { - messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("Videos", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "MESSAGE_PLAYLIST": { - messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("MusicFiles", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "MESSAGE_DOCS": { - messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("Files", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "MESSAGES": { - messageText = LocaleController.formatString("NotificationMessageAlbum", R.string.NotificationMessageAlbum, args[0]); - localMessage = true; - break; - } - case "CHANNEL_MESSAGE_NOTEXT": { - messageText = LocaleController.formatString("ChannelMessageNoText", R.string.ChannelMessageNoText, args[0]); - message1 = LocaleController.getString("Message", R.string.Message); - break; - } - case "CHANNEL_MESSAGE_PHOTO": { - messageText = LocaleController.formatString("ChannelMessagePhoto", R.string.ChannelMessagePhoto, args[0]); - message1 = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); - break; - } - case "CHANNEL_MESSAGE_VIDEO": { - messageText = LocaleController.formatString("ChannelMessageVideo", R.string.ChannelMessageVideo, args[0]); - message1 = LocaleController.getString("AttachVideo", R.string.AttachVideo); - break; - } - case "CHANNEL_MESSAGE_ROUND": { - messageText = LocaleController.formatString("ChannelMessageRound", R.string.ChannelMessageRound, args[0]); - message1 = LocaleController.getString("AttachRound", R.string.AttachRound); - break; - } - case "CHANNEL_MESSAGE_DOC": { - messageText = LocaleController.formatString("ChannelMessageDocument", R.string.ChannelMessageDocument, args[0]); - message1 = LocaleController.getString("AttachDocument", R.string.AttachDocument); - break; - } - case "CHANNEL_MESSAGE_STICKER": { - if (args.length > 1 && !TextUtils.isEmpty(args[1])) { - messageText = LocaleController.formatString("ChannelMessageStickerEmoji", R.string.ChannelMessageStickerEmoji, args[0], args[1]); - message1 = args[1] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); - } else { - messageText = LocaleController.formatString("ChannelMessageSticker", R.string.ChannelMessageSticker, args[0]); - message1 = LocaleController.getString("AttachSticker", R.string.AttachSticker); - } - break; - } - case "CHANNEL_MESSAGE_AUDIO": { - messageText = LocaleController.formatString("ChannelMessageAudio", R.string.ChannelMessageAudio, args[0]); - message1 = LocaleController.getString("AttachAudio", R.string.AttachAudio); - break; - } - case "CHANNEL_MESSAGE_CONTACT": { - messageText = LocaleController.formatString("ChannelMessageContact2", R.string.ChannelMessageContact2, args[0], args[1]); - message1 = LocaleController.getString("AttachContact", R.string.AttachContact); - break; - } - case "CHANNEL_MESSAGE_QUIZ": { - messageText = LocaleController.formatString("ChannelMessageQuiz2", R.string.ChannelMessageQuiz2, args[0], args[1]); - message1 = LocaleController.getString("QuizPoll", R.string.QuizPoll); - break; - } - case "CHANNEL_MESSAGE_POLL": { - messageText = LocaleController.formatString("ChannelMessagePoll2", R.string.ChannelMessagePoll2, args[0], args[1]); - message1 = LocaleController.getString("Poll", R.string.Poll); - break; - } - case "CHANNEL_MESSAGE_GEO": { - messageText = LocaleController.formatString("ChannelMessageMap", R.string.ChannelMessageMap, args[0]); - message1 = LocaleController.getString("AttachLocation", R.string.AttachLocation); - break; - } - case "CHANNEL_MESSAGE_GEOLIVE": { - messageText = LocaleController.formatString("ChannelMessageLiveLocation", R.string.ChannelMessageLiveLocation, args[0]); - message1 = LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation); - break; - } - case "CHANNEL_MESSAGE_GIF": { - messageText = LocaleController.formatString("ChannelMessageGIF", R.string.ChannelMessageGIF, args[0]); - message1 = LocaleController.getString("AttachGif", R.string.AttachGif); - break; - } - case "CHANNEL_MESSAGE_GAME": { - messageText = LocaleController.formatString("NotificationMessageGame", R.string.NotificationMessageGame, args[0]); - message1 = LocaleController.getString("AttachGame", R.string.AttachGame); - break; - } - case "CHANNEL_MESSAGE_FWDS": { - messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("ForwardedMessageCount", Utilities.parseInt(args[1])).toLowerCase()); - localMessage = true; - break; - } - case "CHANNEL_MESSAGE_PHOTOS": { - messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("Photos", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "CHANNEL_MESSAGE_VIDEOS": { - messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("Videos", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "CHANNEL_MESSAGE_PLAYLIST": { - messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("MusicFiles", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "CHANNEL_MESSAGE_DOCS": { - messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("Files", Utilities.parseInt(args[1]))); - localMessage = true; - break; - } - case "CHANNEL_MESSAGES": { - messageText = LocaleController.formatString("ChannelMessageAlbum", R.string.ChannelMessageAlbum, args[0]); - localMessage = true; - break; - } - case "CHAT_MESSAGE_TEXT": { - messageText = LocaleController.formatString("NotificationMessageGroupText", R.string.NotificationMessageGroupText, args[0], args[1], args[2]); - message1 = args[2]; - break; - } - case "CHAT_MESSAGE_NOTEXT": { - messageText = LocaleController.formatString("NotificationMessageGroupNoText", R.string.NotificationMessageGroupNoText, args[0], args[1]); - message1 = LocaleController.getString("Message", R.string.Message); - break; - } - case "CHAT_MESSAGE_PHOTO": { - messageText = LocaleController.formatString("NotificationMessageGroupPhoto", R.string.NotificationMessageGroupPhoto, args[0], args[1]); - message1 = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); - break; - } - case "CHAT_MESSAGE_VIDEO": { - messageText = LocaleController.formatString("NotificationMessageGroupVideo", R.string.NotificationMessageGroupVideo, args[0], args[1]); - message1 = LocaleController.getString("AttachVideo", R.string.AttachVideo); - break; - } - case "CHAT_MESSAGE_ROUND": { - messageText = LocaleController.formatString("NotificationMessageGroupRound", R.string.NotificationMessageGroupRound, args[0], args[1]); - message1 = LocaleController.getString("AttachRound", R.string.AttachRound); - break; - } - case "CHAT_MESSAGE_DOC": { - messageText = LocaleController.formatString("NotificationMessageGroupDocument", R.string.NotificationMessageGroupDocument, args[0], args[1]); - message1 = LocaleController.getString("AttachDocument", R.string.AttachDocument); - break; - } - case "CHAT_MESSAGE_STICKER": { - if (args.length > 2 && !TextUtils.isEmpty(args[2])) { - messageText = LocaleController.formatString("NotificationMessageGroupStickerEmoji", R.string.NotificationMessageGroupStickerEmoji, args[0], args[1], args[2]); - message1 = args[2] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); - } else { - messageText = LocaleController.formatString("NotificationMessageGroupSticker", R.string.NotificationMessageGroupSticker, args[0], args[1]); - message1 = args[1] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); - } - break; - } - case "CHAT_MESSAGE_AUDIO": { - messageText = LocaleController.formatString("NotificationMessageGroupAudio", R.string.NotificationMessageGroupAudio, args[0], args[1]); - message1 = LocaleController.getString("AttachAudio", R.string.AttachAudio); - break; - } - case "CHAT_MESSAGE_CONTACT": { - messageText = LocaleController.formatString("NotificationMessageGroupContact2", R.string.NotificationMessageGroupContact2, args[0], args[1], args[2]); - message1 = LocaleController.getString("AttachContact", R.string.AttachContact); - break; - } - case "CHAT_MESSAGE_QUIZ": { - messageText = LocaleController.formatString("NotificationMessageGroupQuiz2", R.string.NotificationMessageGroupQuiz2, args[0], args[1], args[2]); - message1 = LocaleController.getString("PollQuiz", R.string.PollQuiz); - break; - } - case "CHAT_MESSAGE_POLL": { - messageText = LocaleController.formatString("NotificationMessageGroupPoll2", R.string.NotificationMessageGroupPoll2, args[0], args[1], args[2]); - message1 = LocaleController.getString("Poll", R.string.Poll); - break; - } - case "CHAT_MESSAGE_GEO": { - messageText = LocaleController.formatString("NotificationMessageGroupMap", R.string.NotificationMessageGroupMap, args[0], args[1]); - message1 = LocaleController.getString("AttachLocation", R.string.AttachLocation); - break; - } - case "CHAT_MESSAGE_GEOLIVE": { - messageText = LocaleController.formatString("NotificationMessageGroupLiveLocation", R.string.NotificationMessageGroupLiveLocation, args[0], args[1]); - message1 = LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation); - break; - } - case "CHAT_MESSAGE_GIF": { - messageText = LocaleController.formatString("NotificationMessageGroupGif", R.string.NotificationMessageGroupGif, args[0], args[1]); - message1 = LocaleController.getString("AttachGif", R.string.AttachGif); - break; - } - case "CHAT_MESSAGE_GAME": { - messageText = LocaleController.formatString("NotificationMessageGroupGame", R.string.NotificationMessageGroupGame, args[0], args[1], args[2]); - message1 = LocaleController.getString("AttachGame", R.string.AttachGame); - break; - } - case "CHAT_MESSAGE_GAME_SCORE": { - messageText = LocaleController.formatString("NotificationMessageGroupGameScored", R.string.NotificationMessageGroupGameScored, args[0], args[1], args[2], args[3]); - break; - } - case "CHAT_MESSAGE_INVOICE": { - messageText = LocaleController.formatString("NotificationMessageGroupInvoice", R.string.NotificationMessageGroupInvoice, args[0], args[1], args[2]); - message1 = LocaleController.getString("PaymentInvoice", R.string.PaymentInvoice); - break; - } - case "CHAT_CREATED": - case "CHAT_ADD_YOU": { - messageText = LocaleController.formatString("NotificationInvitedToGroup", R.string.NotificationInvitedToGroup, args[0], args[1]); - break; - } - case "CHAT_TITLE_EDITED": { - messageText = LocaleController.formatString("NotificationEditedGroupName", R.string.NotificationEditedGroupName, args[0], args[1]); - break; - } - case "CHAT_PHOTO_EDITED": { - messageText = LocaleController.formatString("NotificationEditedGroupPhoto", R.string.NotificationEditedGroupPhoto, args[0], args[1]); - break; - } - case "CHAT_ADD_MEMBER": { - messageText = LocaleController.formatString("NotificationGroupAddMember", R.string.NotificationGroupAddMember, args[0], args[1], args[2]); - break; - } - case "CHAT_VOICECHAT_START": { - messageText = LocaleController.formatString("NotificationGroupCreatedCall", R.string.NotificationGroupCreatedCall, args[0], args[1]); - break; - } - case "CHAT_VOICECHAT_INVITE": { - messageText = LocaleController.formatString("NotificationGroupInvitedToCall", R.string.NotificationGroupInvitedToCall, args[0], args[1], args[2]); - break; - } - case "CHAT_VOICECHAT_END": { - messageText = LocaleController.formatString("NotificationGroupEndedCall", R.string.NotificationGroupEndedCall, args[0], args[1]); - break; - } - case "CHAT_VOICECHAT_INVITE_YOU": { - messageText = LocaleController.formatString("NotificationGroupInvitedYouToCall", R.string.NotificationGroupInvitedYouToCall, args[0], args[1]); - break; - } - case "CHAT_DELETE_MEMBER": { - messageText = LocaleController.formatString("NotificationGroupKickMember", R.string.NotificationGroupKickMember, args[0], args[1]); - break; - } - case "CHAT_DELETE_YOU": { - messageText = LocaleController.formatString("NotificationGroupKickYou", R.string.NotificationGroupKickYou, args[0], args[1]); - break; - } - case "CHAT_LEFT": { - messageText = LocaleController.formatString("NotificationGroupLeftMember", R.string.NotificationGroupLeftMember, args[0], args[1]); - break; - } - case "CHAT_RETURNED": { - messageText = LocaleController.formatString("NotificationGroupAddSelf", R.string.NotificationGroupAddSelf, args[0], args[1]); - break; - } - case "CHAT_JOINED": { - messageText = LocaleController.formatString("NotificationGroupAddSelfMega", R.string.NotificationGroupAddSelfMega, args[0], args[1]); - break; - } - case "CHAT_REQ_JOINED": { - messageText = LocaleController.formatString("UserAcceptedToGroupPushWithGroup", R.string.UserAcceptedToGroupPushWithGroup, args[0], args[1]); - break; - } - case "CHAT_MESSAGE_FWDS": { - messageText = LocaleController.formatString("NotificationGroupForwardedFew", R.string.NotificationGroupForwardedFew, args[0], args[1], LocaleController.formatPluralString("messages", Utilities.parseInt(args[2]))); - localMessage = true; - break; - } - case "CHAT_MESSAGE_PHOTOS": { - messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("Photos", Utilities.parseInt(args[2]))); - localMessage = true; - break; - } - case "CHAT_MESSAGE_VIDEOS": { - messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("Videos", Utilities.parseInt(args[2]))); - localMessage = true; - break; - } - case "CHAT_MESSAGE_PLAYLIST": { - messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("MusicFiles", Utilities.parseInt(args[2]))); - localMessage = true; - break; - } - case "CHAT_MESSAGE_DOCS": { - messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("Files", Utilities.parseInt(args[2]))); - localMessage = true; - break; - } - case "CHAT_MESSAGES": { - messageText = LocaleController.formatString("NotificationGroupAlbum", R.string.NotificationGroupAlbum, args[0], args[1]); - localMessage = true; - break; - } - case "PINNED_TEXT": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedText", R.string.NotificationActionPinnedText, args[0], args[1], args[2]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedTextChannel", R.string.NotificationActionPinnedTextChannel, args[0], args[1]); - } - } - break; - } - case "PINNED_NOTEXT": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedNoTextUser", R.string.NotificationActionPinnedNoTextUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedNoText", R.string.NotificationActionPinnedNoText, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedNoTextChannel", R.string.NotificationActionPinnedNoTextChannel, args[0]); - } - } - break; - } - case "PINNED_PHOTO": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedPhotoUser", R.string.NotificationActionPinnedPhotoUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedPhoto", R.string.NotificationActionPinnedPhoto, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedPhotoChannel", R.string.NotificationActionPinnedPhotoChannel, args[0]); - } - } - break; - } - case "PINNED_VIDEO": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedVideoUser", R.string.NotificationActionPinnedVideoUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedVideo", R.string.NotificationActionPinnedVideo, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedVideoChannel", R.string.NotificationActionPinnedVideoChannel, args[0]); - } - } - break; - } - case "PINNED_ROUND": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedRoundUser", R.string.NotificationActionPinnedRoundUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedRound", R.string.NotificationActionPinnedRound, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedRoundChannel", R.string.NotificationActionPinnedRoundChannel, args[0]); - } - } - break; - } - case "PINNED_DOC": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedFileUser", R.string.NotificationActionPinnedFileUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedFile", R.string.NotificationActionPinnedFile, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedFileChannel", R.string.NotificationActionPinnedFileChannel, args[0]); - } - } - break; - } - case "PINNED_STICKER": { - if (dialogId > 0) { - if (args.length > 1 && !TextUtils.isEmpty(args[1])) { - messageText = LocaleController.formatString("NotificationActionPinnedStickerEmojiUser", R.string.NotificationActionPinnedStickerEmojiUser, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedStickerUser", R.string.NotificationActionPinnedStickerUser, args[0]); - } - } else { - if (isGroup) { - if (args.length > 2 && !TextUtils.isEmpty(args[2])) { - messageText = LocaleController.formatString("NotificationActionPinnedStickerEmoji", R.string.NotificationActionPinnedStickerEmoji, args[0], args[2], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedSticker", R.string.NotificationActionPinnedSticker, args[0], args[1]); - } - } else { - if (args.length > 1 && !TextUtils.isEmpty(args[1])) { - messageText = LocaleController.formatString("NotificationActionPinnedStickerEmojiChannel", R.string.NotificationActionPinnedStickerEmojiChannel, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedStickerChannel", R.string.NotificationActionPinnedStickerChannel, args[0]); - } - } - } - break; - } - case "PINNED_AUDIO": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedVoiceUser", R.string.NotificationActionPinnedVoiceUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedVoice", R.string.NotificationActionPinnedVoice, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedVoiceChannel", R.string.NotificationActionPinnedVoiceChannel, args[0]); - } - } - break; - } - case "PINNED_CONTACT": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedContactUser", R.string.NotificationActionPinnedContactUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedContact2", R.string.NotificationActionPinnedContact2, args[0], args[2], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedContactChannel2", R.string.NotificationActionPinnedContactChannel2, args[0], args[1]); - } - } - break; - } - case "PINNED_QUIZ": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedQuizUser", R.string.NotificationActionPinnedQuizUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedQuiz2", R.string.NotificationActionPinnedQuiz2, args[0], args[2], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedQuizChannel2", R.string.NotificationActionPinnedQuizChannel2, args[0], args[1]); - } - } - break; - } - case "PINNED_POLL": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedPollUser", R.string.NotificationActionPinnedPollUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedPoll2", R.string.NotificationActionPinnedPoll2, args[0], args[2], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedPollChannel2", R.string.NotificationActionPinnedPollChannel2, args[0], args[1]); - } - } - break; - } - case "PINNED_GEO": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedGeoUser", R.string.NotificationActionPinnedGeoUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedGeo", R.string.NotificationActionPinnedGeo, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedGeoChannel", R.string.NotificationActionPinnedGeoChannel, args[0]); - } - } - break; - } - case "PINNED_GEOLIVE": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedGeoLiveUser", R.string.NotificationActionPinnedGeoLiveUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedGeoLive", R.string.NotificationActionPinnedGeoLive, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedGeoLiveChannel", R.string.NotificationActionPinnedGeoLiveChannel, args[0]); - } - } - break; - } - case "PINNED_GAME": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedGameUser", R.string.NotificationActionPinnedGameUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedGame", R.string.NotificationActionPinnedGame, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedGameChannel", R.string.NotificationActionPinnedGameChannel, args[0]); - } - } - break; - } - case "PINNED_GAME_SCORE": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedGameScoreUser", R.string.NotificationActionPinnedGameScoreUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedGameScore", R.string.NotificationActionPinnedGameScore, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedGameScoreChannel", R.string.NotificationActionPinnedGameScoreChannel, args[0]); - } - } - break; - } - case "PINNED_INVOICE": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedInvoiceUser", R.string.NotificationActionPinnedInvoiceUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedInvoice", R.string.NotificationActionPinnedInvoice, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedInvoiceChannel", R.string.NotificationActionPinnedInvoiceChannel, args[0]); - } - } - break; - } - case "PINNED_GIF": { - if (dialogId > 0) { - messageText = LocaleController.formatString("NotificationActionPinnedGifUser", R.string.NotificationActionPinnedGifUser, args[0], args[1]); - } else { - if (isGroup) { - messageText = LocaleController.formatString("NotificationActionPinnedGif", R.string.NotificationActionPinnedGif, args[0], args[1]); - } else { - messageText = LocaleController.formatString("NotificationActionPinnedGifChannel", R.string.NotificationActionPinnedGifChannel, args[0]); - } - } - break; - } - case "ENCRYPTED_MESSAGE": { - messageText = LocaleController.getString("YouHaveNewMessage", R.string.YouHaveNewMessage); - name = LocaleController.getString("SecretChatName", R.string.SecretChatName); - localMessage = true; - break; - } - case "REACT_TEXT": { - break; - } - case "CONTACT_JOINED": - case "AUTH_UNKNOWN": - case "AUTH_REGION": - case "LOCKED_MESSAGE": - case "ENCRYPTION_REQUEST": - case "ENCRYPTION_ACCEPT": - case "PHONE_CALL_REQUEST": - case "MESSAGE_MUTED": - case "PHONE_CALL_MISSED": { - //ignored - break; - } - - default: { - if (BuildVars.LOGS_ENABLED) { - FileLog.w("unhandled loc_key = " + loc_key); - } - break; - } - } - } - if (messageText != null) { - TLRPC.TL_message messageOwner = new TLRPC.TL_message(); - messageOwner.id = msg_id; - messageOwner.random_id = random_id; - messageOwner.message = message1 != null ? message1 : messageText; - messageOwner.date = (int) (time / 1000); - if (pinned) { - messageOwner.action = new TLRPC.TL_messageActionPinMessage(); - } - if (supergroup) { - messageOwner.flags |= 0x80000000; - } - messageOwner.dialog_id = dialogId; - if (channel_id != 0) { - messageOwner.peer_id = new TLRPC.TL_peerChannel(); - messageOwner.peer_id.channel_id = channel_id; - } else if (chat_id != 0) { - messageOwner.peer_id = new TLRPC.TL_peerChat(); - messageOwner.peer_id.chat_id = chat_id; - } else { - messageOwner.peer_id = new TLRPC.TL_peerUser(); - messageOwner.peer_id.user_id = user_id; - } - messageOwner.flags |= 256; - if (chat_from_group_id != 0) { - messageOwner.from_id = new TLRPC.TL_peerChat(); - messageOwner.from_id.chat_id = chat_id; - } else if (chat_from_broadcast_id != 0) { - messageOwner.from_id = new TLRPC.TL_peerChannel(); - messageOwner.from_id.channel_id = chat_from_broadcast_id; - } else if (chat_from_id != 0) { - messageOwner.from_id = new TLRPC.TL_peerUser(); - messageOwner.from_id.user_id = chat_from_id; - } else { - messageOwner.from_id = messageOwner.peer_id; - } - messageOwner.mentioned = mention || pinned; - messageOwner.silent = silent; - messageOwner.from_scheduled = scheduled; - - MessageObject messageObject = new MessageObject(currentAccount, messageOwner, messageText, name, userName, localMessage, channel, supergroup, edited); - messageObject.isReactionPush = loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_"); - ArrayList arrayList = new ArrayList<>(); - arrayList.add(messageObject); - canRelease = false; - NotificationsController.getInstance(currentAccount).processNewMessages(arrayList, true, true, countDownLatch); - } - } - } - } - if (canRelease) { - countDownLatch.countDown(); - } - - ConnectionsManager.onInternalPushReceived(currentAccount); - ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); - } catch (Throwable e) { - if (currentAccount != -1) { - ConnectionsManager.onInternalPushReceived(currentAccount); - ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); - countDownLatch.countDown(); - } else { - onDecryptError(); - } - if (BuildVars.LOGS_ENABLED) { - FileLog.e("error in loc_key = " + loc_key + " json " + jsonString); - } - FileLog.e(e); - } - }); - }); - try { - countDownLatch.await(); - } catch (Throwable ignore) { - - } - if (BuildVars.DEBUG_VERSION) { - FileLog.d("finished GCM service, time = " + (SystemClock.elapsedRealtime() - receiveTime)); - } - } - - private String getReactedText(String loc_key, Object[] args) { - switch (loc_key) { - case "REACT_TEXT": { - return LocaleController.formatString("PushReactText", R.string.PushReactText, args); - } - case "REACT_NOTEXT": { - return LocaleController.formatString("PushReactNoText", R.string.PushReactNoText, args); - } - case "REACT_PHOTO": { - return LocaleController.formatString("PushReactPhoto", R.string.PushReactPhoto, args); - } - case "REACT_VIDEO": { - return LocaleController.formatString("PushReactVideo", R.string.PushReactVideo, args); - } - case "REACT_ROUND": { - return LocaleController.formatString("PushReactRound", R.string.PushReactRound, args); - } - case "REACT_DOC": { - return LocaleController.formatString("PushReactDoc", R.string.PushReactDoc, args); - } - case "REACT_STICKER": { - return LocaleController.formatString("PushReactSticker", R.string.PushReactSticker, args); - } - case "REACT_AUDIO": { - return LocaleController.formatString("PushReactAudio", R.string.PushReactAudio, args); - } - case "REACT_CONTACT": { - return LocaleController.formatString("PushReactContect", R.string.PushReactContect, args); - } - case "REACT_GEO": { - return LocaleController.formatString("PushReactGeo", R.string.PushReactGeo, args); - } - case "REACT_GEOLIVE": { - return LocaleController.formatString("PushReactGeoLocation", R.string.PushReactGeoLocation, args); - } - case "REACT_POLL": { - return LocaleController.formatString("PushReactPoll", R.string.PushReactPoll, args); - } - case "REACT_QUIZ": { - return LocaleController.formatString("PushReactQuiz", R.string.PushReactQuiz, args); - } - case "REACT_GAME": { - return LocaleController.formatString("PushReactGame", R.string.PushReactGame, args); - } - case "REACT_INVOICE": { - return LocaleController.formatString("PushReactInvoice", R.string.PushReactInvoice, args); - } - case "REACT_GIF": { - return LocaleController.formatString("PushReactGif", R.string.PushReactGif, args); - } - case "CHAT_REACT_TEXT": { - return LocaleController.formatString("PushChatReactText", R.string.PushChatReactText, args); - } - case "CHAT_REACT_NOTEXT": { - return LocaleController.formatString("PushChatReactNotext", R.string.PushChatReactNotext, args); - } - case "CHAT_REACT_PHOTO": { - return LocaleController.formatString("PushChatReactPhoto", R.string.PushChatReactPhoto, args); - } - case "CHAT_REACT_VIDEO": { - return LocaleController.formatString("PushChatReactVideo", R.string.PushChatReactVideo, args); - } - case "CHAT_REACT_ROUND": { - return LocaleController.formatString("PushChatReactRound", R.string.PushChatReactRound, args); - } - case "CHAT_REACT_DOC": { - return LocaleController.formatString("PushChatReactDoc", R.string.PushChatReactDoc, args); - } - case "CHAT_REACT_STICKER": { - return LocaleController.formatString("PushChatReactSticker", R.string.PushChatReactSticker, args); - } - case "CHAT_REACT_AUDIO": { - return LocaleController.formatString("PushChatReactAudio", R.string.PushChatReactAudio, args); - } - case "CHAT_REACT_CONTACT": { - return LocaleController.formatString("PushChatReactContact", R.string.PushChatReactContact, args); - } - case "CHAT_REACT_GEO": { - return LocaleController.formatString("PushChatReactGeo", R.string.PushChatReactGeo, args); - } - case "CHAT_REACT_GEOLIVE": { - return LocaleController.formatString("PushChatReactGeoLive", R.string.PushChatReactGeoLive, args); - } - case "CHAT_REACT_POLL": { - return LocaleController.formatString("PushChatReactPoll", R.string.PushChatReactPoll, args); - } - case "CHAT_REACT_QUIZ": { - return LocaleController.formatString("PushChatReactQuiz", R.string.PushChatReactQuiz, args); - } - case "CHAT_REACT_GAME": { - return LocaleController.formatString("PushChatReactGame", R.string.PushChatReactGame, args); - } - case "CHAT_REACT_INVOICE": { - return LocaleController.formatString("PushChatReactInvoice", R.string.PushChatReactInvoice, args); - } - case "CHAT_REACT_GIF": { - return LocaleController.formatString("PushChatReactGif", R.string.PushChatReactGif, args); - } - } - return null; - } - - private void onDecryptError() { - for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { - if (UserConfig.getInstance(a).isClientActivated()) { - ConnectionsManager.onInternalPushReceived(a); - ConnectionsManager.getInstance(a).resumeNetworkMaybe(); - } - } - countDownLatch.countDown(); + PushListenerController.processRemoteMessage(PushListenerController.PUSH_TYPE_FIREBASE, data.get("p"), time); } @Override - public void onNewToken(String token) { + public void onNewToken(@NonNull String token) { AndroidUtilities.runOnUIThread(() -> { if (BuildVars.LOGS_ENABLED) { - FileLog.d("Refreshed token: " + token); + FileLog.d("Refreshed FCM token: " + token); } ApplicationLoader.postInitApplication(); - sendRegistrationToServer(token); - }); - } - - public static void sendRegistrationToServer(final String token) { - Utilities.stageQueue.postRunnable(() -> { - ConnectionsManager.setRegId(token, SharedConfig.pushStringStatus); - if (token == null) { - return; - } - boolean sendStat = false; - if (SharedConfig.pushStringGetTimeStart != 0 && SharedConfig.pushStringGetTimeEnd != 0 && (!SharedConfig.pushStatSent || !TextUtils.equals(SharedConfig.pushString, token))) { - sendStat = true; - SharedConfig.pushStatSent = false; - } - SharedConfig.pushString = token; - for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { - UserConfig userConfig = UserConfig.getInstance(a); - userConfig.registeredForPush = false; - userConfig.saveConfig(false); - if (userConfig.getClientUserId() != 0) { - final int currentAccount = a; - if (sendStat) { - TLRPC.TL_help_saveAppLog req = new TLRPC.TL_help_saveAppLog(); - TLRPC.TL_inputAppEvent event = new TLRPC.TL_inputAppEvent(); - event.time = SharedConfig.pushStringGetTimeStart; - event.type = "fcm_token_request"; - event.peer = 0; - event.data = new TLRPC.TL_jsonNull(); - req.events.add(event); - - event = new TLRPC.TL_inputAppEvent(); - event.time = SharedConfig.pushStringGetTimeEnd; - event.type = "fcm_token_response"; - event.peer = SharedConfig.pushStringGetTimeEnd - SharedConfig.pushStringGetTimeStart; - event.data = new TLRPC.TL_jsonNull(); - req.events.add(event); - - sendStat = false; - ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { - if (error != null) { - SharedConfig.pushStatSent = true; - SharedConfig.saveConfig(); - } - })); - } - AndroidUtilities.runOnUIThread(() -> MessagesController.getInstance(currentAccount).registerForPush(token)); - } - } + PushListenerController.sendRegistrationToServer(PushListenerController.PUSH_TYPE_FIREBASE, token); }); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java new file mode 100644 index 000000000..40f86462b --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java @@ -0,0 +1,166 @@ +package org.telegram.messenger; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.location.Location; +import android.os.Bundle; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.util.Consumer; + +import com.google.android.gms.common.api.ApiException; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.location.FusedLocationProviderClient; +import com.google.android.gms.location.LocationCallback; +import com.google.android.gms.location.LocationRequest; +import com.google.android.gms.location.LocationResult; +import com.google.android.gms.location.LocationServices; +import com.google.android.gms.location.LocationSettingsRequest; +import com.google.android.gms.location.LocationSettingsStatusCodes; +import com.google.android.gms.location.SettingsClient; + +@SuppressLint("MissingPermission") +public class GoogleLocationProvider implements ILocationServiceProvider { + private FusedLocationProviderClient locationProviderClient; + private SettingsClient settingsClient; + + @Override + public void init(Context context) { + locationProviderClient = LocationServices.getFusedLocationProviderClient(context); + settingsClient = new SettingsClient(context); + } + + @Override + public ILocationRequest onCreateLocationRequest() { + return new GoogleLocationRequest(LocationRequest.create()); + } + + @Override + public void getLastLocation(Consumer callback) { + locationProviderClient.getLastLocation().addOnCompleteListener(task -> callback.accept(task.getResult())); + } + + @Override + public void requestLocationUpdates(ILocationRequest request, ILocationListener locationListener) { + locationProviderClient.requestLocationUpdates(((GoogleLocationRequest) request).request, new LocationCallback() { + @Override + public void onLocationResult(@NonNull LocationResult locationResult) { + locationListener.onLocationChanged(locationResult.getLastLocation()); + } + }, Looper.getMainLooper()); + } + + @Override + public void removeLocationUpdates(ILocationListener locationListener) { + locationProviderClient.removeLocationUpdates(new LocationCallback() { + @Override + public void onLocationResult(@NonNull LocationResult locationResult) { + locationListener.onLocationChanged(locationResult.getLastLocation()); + } + }); + } + + @Override + public void checkLocationSettings(ILocationRequest request, Consumer callback) { + LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(((GoogleLocationRequest) request).request); + + settingsClient.checkLocationSettings(builder.build()).addOnCompleteListener(task -> { + try { + task.getResult(ApiException.class); + callback.accept(STATUS_SUCCESS); + } catch (ApiException exception) { + switch (exception.getStatusCode()) { + case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: + callback.accept(STATUS_RESOLUTION_REQUIRED); + break; + case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: + callback.accept(STATUS_SETTINGS_CHANGE_UNAVAILABLE); + break; + } + } + }); + } + + @Override + public IMapApiClient onCreateLocationServicesAPI(Context context, IAPIConnectionCallbacks connectionCallbacks, IAPIOnConnectionFailedListener failedListener) { + return new GoogleApiClientImpl(new GoogleApiClient.Builder(ApplicationLoader.applicationContext) + .addApi(LocationServices.API) + .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { + @Override + public void onConnected(@Nullable Bundle bundle) { + connectionCallbacks.onConnected(bundle); + } + + @Override + public void onConnectionSuspended(int i) { + connectionCallbacks.onConnectionSuspended(i); + } + }) + .addOnConnectionFailedListener(connectionResult -> failedListener.onConnectionFailed()) + .build()); + } + + @Override + public boolean checkServices() { + return PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices(); + } + + public final static class GoogleLocationRequest implements ILocationRequest { + private LocationRequest request; + + private GoogleLocationRequest(LocationRequest request) { + this.request = request; + } + + @Override + public void setPriority(int priority) { + int outPriority; + switch (priority) { + default: + case PRIORITY_HIGH_ACCURACY: + outPriority = LocationRequest.PRIORITY_HIGH_ACCURACY; + break; + case PRIORITY_BALANCED_POWER_ACCURACY: + outPriority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; + break; + case PRIORITY_LOW_POWER: + outPriority = LocationRequest.PRIORITY_LOW_POWER; + break; + case PRIORITY_NO_POWER: + outPriority = LocationRequest.PRIORITY_NO_POWER; + break; + } + request.setPriority(outPriority); + } + + @Override + public void setInterval(long interval) { + request.setInterval(interval); + } + + @Override + public void setFastestInterval(long interval) { + request.setFastestInterval(interval); + } + } + + public final static class GoogleApiClientImpl implements IMapApiClient { + private GoogleApiClient apiClient; + + private GoogleApiClientImpl(GoogleApiClient apiClient) { + this.apiClient = apiClient; + } + + @Override + public void connect() { + apiClient.connect(); + } + + @Override + public void disconnect() { + apiClient.disconnect(); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GoogleMapsProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/GoogleMapsProvider.java new file mode 100644 index 000000000..648a6a21a --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/GoogleMapsProvider.java @@ -0,0 +1,620 @@ +package org.telegram.messenger; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.location.Location; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +import androidx.core.util.Consumer; + +import com.google.android.gms.maps.CameraUpdate; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.MapView; +import com.google.android.gms.maps.MapsInitializer; +import com.google.android.gms.maps.Projection; +import com.google.android.gms.maps.UiSettings; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.Dash; +import com.google.android.gms.maps.model.Gap; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MapStyleOptions; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GoogleMapsProvider implements IMapsProvider { + + @Override + public void initializeMaps(Context context) { + MapsInitializer.initialize(context); + } + + @Override + public IMapView onCreateMapView(Context context) { + return new GoogleMapView(context); + } + + @Override + public ICameraUpdate newCameraUpdateLatLng(LatLng latLng) { + return new GoogleCameraUpdate(CameraUpdateFactory.newLatLng(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude))); + } + + @Override + public ICameraUpdate newCameraUpdateLatLngZoom(LatLng latLng, float zoom) { + return new GoogleCameraUpdate(CameraUpdateFactory.newLatLngZoom(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude), zoom)); + } + + @Override + public ICameraUpdate newCameraUpdateLatLngBounds(ILatLngBounds bounds, int padding) { + return new GoogleCameraUpdate(CameraUpdateFactory.newLatLngBounds(((GoogleLatLngBounds) bounds).bounds, padding)); + } + + @Override + public ILatLngBoundsBuilder onCreateLatLngBoundsBuilder() { + return new GoogleLatLngBoundsBuilder(); + } + + @Override + public IMapStyleOptions loadRawResourceStyle(Context context, int resId) { + return new GoogleMapStyleOptions(MapStyleOptions.loadRawResourceStyle(context, resId)); + } + + @Override + public String getMapsAppPackageName() { + return "com.google.android.apps.maps"; + } + + @Override + public int getInstallMapsString() { + return R.string.InstallGoogleMaps; + } + + @Override + public IMarkerOptions onCreateMarkerOptions() { + return new GoogleMarkerOptions(); + } + + @Override + public ICircleOptions onCreateCircleOptions() { + return new GoogleCircleOptions(); + } + + public final static class GoogleMapImpl implements IMap { + private GoogleMap googleMap; + + private Map implToAbsMarkerMap = new HashMap<>(); + private Map implToAbsCircleMap = new HashMap<>(); + + private GoogleMapImpl(GoogleMap googleMap) { + this.googleMap = googleMap; + } + + @Override + public void setMapType(int mapType) { + switch (mapType) { + case MAP_TYPE_NORMAL: + googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); + break; + case MAP_TYPE_SATELLITE: + googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); + break; + case MAP_TYPE_HYBRID: + googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); + break; + } + } + + @Override + public float getMaxZoomLevel() { + return googleMap.getMaxZoomLevel(); + } + + @SuppressLint("MissingPermission") + @Override + public void setMyLocationEnabled(boolean enabled) { + googleMap.setMyLocationEnabled(enabled); + } + + @Override + public IUISettings getUiSettings() { + return new GoogleUISettings(googleMap.getUiSettings()); + } + + @Override + public void setOnCameraMoveStartedListener(OnCameraMoveStartedListener onCameraMoveStartedListener) { + googleMap.setOnCameraMoveStartedListener(reason -> { + int outReason; + switch (reason) { + default: + case GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE: + outReason = OnCameraMoveStartedListener.REASON_GESTURE; + break; + case GoogleMap.OnCameraMoveStartedListener.REASON_API_ANIMATION: + outReason = OnCameraMoveStartedListener.REASON_API_ANIMATION; + break; + case GoogleMap.OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION: + outReason = OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION; + break; + } + onCameraMoveStartedListener.onCameraMoveStarted(outReason); + }); + } + + @Override + public CameraPosition getCameraPosition() { + com.google.android.gms.maps.model.CameraPosition pos = googleMap.getCameraPosition(); + return new CameraPosition(new LatLng(pos.target.latitude, pos.target.longitude), pos.zoom); + } + + @Override + public void setOnMapLoadedCallback(Runnable callback) { + googleMap.setOnMapLoadedCallback(callback::run); + } + + @Override + public IProjection getProjection() { + return new GoogleProjection(googleMap.getProjection()); + } + + @Override + public void setPadding(int left, int top, int right, int bottom) { + googleMap.setPadding(left, top, right, bottom); + } + + @Override + public void setMapStyle(IMapStyleOptions style) { + googleMap.setMapStyle(style == null ? null : ((GoogleMapStyleOptions) style).mapStyleOptions); + } + + @Override + public IMarker addMarker(IMarkerOptions markerOptions) { + Marker impl = googleMap.addMarker(((GoogleMarkerOptions) markerOptions).markerOptions); + GoogleMarker abs = new GoogleMarker(impl); + implToAbsMarkerMap.put(impl, abs); + return abs; + } + + @Override + public ICircle addCircle(ICircleOptions circleOptions) { + Circle impl = googleMap.addCircle(((GoogleCircleOptions) circleOptions).circleOptions); + GoogleCircle abs = new GoogleCircle(impl); + implToAbsCircleMap.put(impl, abs); + return abs; + } + + @Override + public void setOnMyLocationChangeListener(Consumer callback) { + googleMap.setOnMyLocationChangeListener(callback::accept); + } + + @Override + public void setOnMarkerClickListener(OnMarkerClickListener markerClickListener) { + googleMap.setOnMarkerClickListener(marker -> { + GoogleMarker abs = implToAbsMarkerMap.get(marker); + if (abs == null) { + abs = new GoogleMarker(marker); + implToAbsMarkerMap.put(marker, abs); + } + return markerClickListener.onClick(abs); + }); + } + + @Override + public void setOnCameraMoveListener(Runnable callback) { + googleMap.setOnCameraMoveListener(callback::run); + } + + @Override + public void animateCamera(ICameraUpdate update) { + googleMap.animateCamera(((GoogleCameraUpdate) update).cameraUpdate); + } + + @Override + public void animateCamera(ICameraUpdate update, ICancelableCallback callback) { + googleMap.animateCamera(((GoogleCameraUpdate) update).cameraUpdate, callback == null ? null : new GoogleMap.CancelableCallback() { + @Override + public void onFinish() { + callback.onFinish(); + } + + @Override + public void onCancel() { + callback.onCancel(); + } + }); + } + + @Override + public void animateCamera(ICameraUpdate update, int duration, ICancelableCallback callback) { + googleMap.animateCamera(((GoogleCameraUpdate) update).cameraUpdate, duration, callback == null ? null : new GoogleMap.CancelableCallback() { + @Override + public void onFinish() { + callback.onFinish(); + } + + @Override + public void onCancel() { + callback.onCancel(); + } + }); + } + + @Override + public void moveCamera(ICameraUpdate update) { + googleMap.moveCamera(((GoogleCameraUpdate) update).cameraUpdate); + } + + public final class GoogleMarker implements IMarker { + private Marker marker; + + private GoogleMarker(Marker marker) { + this.marker = marker; + } + + @Override + public Object getTag() { + return marker.getTag(); + } + + @Override + public void setTag(Object tag) { + marker.setTag(tag); + } + + @Override + public LatLng getPosition() { + com.google.android.gms.maps.model.LatLng latLng = marker.getPosition(); + return new LatLng(latLng.latitude, latLng.longitude); + } + + @Override + public void setPosition(LatLng latLng) { + marker.setPosition(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + } + + @Override + public void setRotation(int rotation) { + marker.setRotation(rotation); + } + + @Override + public void setIcon(Bitmap bitmap) { + marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap)); + } + + @Override + public void setIcon(int resId) { + marker.setIcon(BitmapDescriptorFactory.fromResource(resId)); + } + + @Override + public void remove() { + marker.remove(); + implToAbsMarkerMap.remove(marker); + } + } + + public final class GoogleCircle implements ICircle { + private Circle circle; + + private GoogleCircle(Circle circle) { + this.circle = circle; + } + + @Override + public void setStrokeColor(int color) { + circle.setStrokeColor(color); + } + + @Override + public void setFillColor(int color) { + circle.setFillColor(color); + } + + @Override + public void setRadius(double radius) { + circle.setRadius(radius); + } + + @Override + public double getRadius() { + return circle.getRadius(); + } + + @Override + public void setCenter(LatLng latLng) { + circle.setCenter(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + } + + @Override + public void remove() { + circle.remove(); + implToAbsCircleMap.remove(circle); + } + } + } + + public final static class GoogleProjection implements IProjection { + private Projection projection; + + private GoogleProjection(Projection projection) { + this.projection = projection; + } + + @Override + public Point toScreenLocation(LatLng latLng) { + return projection.toScreenLocation(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + } + } + + public final static class GoogleUISettings implements IUISettings { + private UiSettings uiSettings; + + private GoogleUISettings(UiSettings settings) { + uiSettings = settings; + } + + @Override + public void setMyLocationButtonEnabled(boolean enabled) { + uiSettings.setMyLocationButtonEnabled(enabled); + } + + @Override + public void setZoomControlsEnabled(boolean enabled) { + uiSettings.setZoomControlsEnabled(enabled); + } + + @Override + public void setCompassEnabled(boolean enabled) { + uiSettings.setCompassEnabled(enabled); + } + } + + public final static class GoogleCircleOptions implements ICircleOptions { + private CircleOptions circleOptions; + + private GoogleCircleOptions() { + circleOptions = new CircleOptions(); + } + + @Override + public ICircleOptions center(LatLng latLng) { + circleOptions.center(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + return this; + } + + @Override + public ICircleOptions radius(double radius) { + circleOptions.radius(radius); + return this; + } + + @Override + public ICircleOptions strokeColor(int color) { + circleOptions.strokeColor(color); + return this; + } + + @Override + public ICircleOptions fillColor(int color) { + circleOptions.fillColor(color); + return this; + } + + @Override + public ICircleOptions strokePattern(List patternItems) { + List pattern = new ArrayList<>(); + for (PatternItem item : patternItems) { + if (item instanceof PatternItem.Gap) { + pattern.add(new Gap(((PatternItem.Gap) item).length)); + } else if (item instanceof PatternItem.Dash) { + pattern.add(new Dash(((PatternItem.Dash) item).length)); + } + } + circleOptions.strokePattern(pattern); + return this; + } + + @Override + public ICircleOptions strokeWidth(int width) { + circleOptions.strokeWidth(width); + return this; + } + } + + public final static class GoogleMarkerOptions implements IMarkerOptions { + private MarkerOptions markerOptions; + + private GoogleMarkerOptions() { + this.markerOptions = new MarkerOptions(); + } + + @Override + public IMarkerOptions position(LatLng latLng) { + markerOptions.position(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + return this; + } + + @Override + public IMarkerOptions icon(Bitmap bitmap) { + markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); + return this; + } + + @Override + public IMarkerOptions icon(int resId) { + markerOptions.icon(BitmapDescriptorFactory.fromResource(resId)); + return this; + } + + @Override + public IMarkerOptions anchor(float lat, float lng) { + markerOptions.anchor(lat, lng); + return this; + } + + @Override + public IMarkerOptions title(String title) { + markerOptions.title(title); + return this; + } + + @Override + public IMarkerOptions snippet(String snippet) { + markerOptions.snippet(snippet); + return this; + } + + @Override + public IMarkerOptions flat(boolean flat) { + markerOptions.flat(flat); + return this; + } + } + + public final static class GoogleLatLngBoundsBuilder implements ILatLngBoundsBuilder { + private LatLngBounds.Builder builder; + + private GoogleLatLngBoundsBuilder() { + builder = new LatLngBounds.Builder(); + } + + @Override + public ILatLngBoundsBuilder include(LatLng latLng) { + builder.include(new com.google.android.gms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + return this; + } + + @Override + public ILatLngBounds build() { + return new GoogleLatLngBounds(builder.build()); + } + } + + public final static class GoogleLatLngBounds implements ILatLngBounds { + private LatLngBounds bounds; + + private GoogleLatLngBounds(LatLngBounds bounds) { + this.bounds = bounds; + } + + @Override + public LatLng getCenter() { + com.google.android.gms.maps.model.LatLng latLng = bounds.getCenter(); + return new LatLng(latLng.latitude, latLng.longitude); + } + } + + public final static class GoogleMapView implements IMapView { + private MapView mapView; + + private ITouchInterceptor dispatchInterceptor; + private ITouchInterceptor interceptInterceptor; + private Runnable onLayoutListener; + + private GoogleMapView(Context context) { + mapView = new MapView(context) { + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (dispatchInterceptor != null) { + return dispatchInterceptor.onInterceptTouchEvent(ev, super::dispatchTouchEvent); + } + return super.dispatchTouchEvent(ev); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (interceptInterceptor != null) { + return interceptInterceptor.onInterceptTouchEvent(ev, super::onInterceptTouchEvent); + } + return super.onInterceptTouchEvent(ev); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (onLayoutListener != null) { + onLayoutListener.run(); + } + } + }; + } + + @Override + public void setOnDispatchTouchEventInterceptor(ITouchInterceptor touchInterceptor) { + dispatchInterceptor = touchInterceptor; + } + + @Override + public void setOnInterceptTouchEventInterceptor(ITouchInterceptor touchInterceptor) { + interceptInterceptor = touchInterceptor; + } + + @Override + public void setOnLayoutListener(Runnable callback) { + onLayoutListener = callback; + } + + @Override + public View getView() { + return mapView; + } + + @Override + public void getMapAsync(Consumer callback) { + mapView.getMapAsync(googleMap -> callback.accept(new GoogleMapImpl(googleMap))); + } + + @Override + public void onPause() { + mapView.onPause(); + } + + @Override + public void onResume() { + mapView.onResume(); + } + + @Override + public void onCreate(Bundle savedInstance) { + mapView.onCreate(savedInstance); + } + + @Override + public void onDestroy() { + mapView.onDestroy(); + } + + @Override + public void onLowMemory() { + mapView.onLowMemory(); + } + } + + public final static class GoogleCameraUpdate implements ICameraUpdate { + private CameraUpdate cameraUpdate; + + private GoogleCameraUpdate(CameraUpdate update) { + this.cameraUpdate = update; + } + } + + public final static class GoogleMapStyleOptions implements IMapStyleOptions { + private MapStyleOptions mapStyleOptions; + + private GoogleMapStyleOptions(MapStyleOptions mapStyleOptions) { + this.mapStyleOptions = mapStyleOptions; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ILocationServiceProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/ILocationServiceProvider.java new file mode 100644 index 000000000..e901acc01 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ILocationServiceProvider.java @@ -0,0 +1,51 @@ +package org.telegram.messenger; + +import android.content.Context; +import android.location.Location; +import android.os.Bundle; + +import androidx.core.util.Consumer; + +public interface ILocationServiceProvider { + int PRIORITY_HIGH_ACCURACY = 0, + PRIORITY_BALANCED_POWER_ACCURACY = 1, + PRIORITY_LOW_POWER = 2, + PRIORITY_NO_POWER = 3; + + int STATUS_SUCCESS = 0, + STATUS_RESOLUTION_REQUIRED = 1, + STATUS_SETTINGS_CHANGE_UNAVAILABLE = 2; + + void init(Context context); + ILocationRequest onCreateLocationRequest(); + IMapApiClient onCreateLocationServicesAPI(Context context, IAPIConnectionCallbacks connectionCallbacks, IAPIOnConnectionFailedListener failedListener); + boolean checkServices(); + void getLastLocation(Consumer callback); + void requestLocationUpdates(ILocationRequest request, ILocationListener locationListener); + void removeLocationUpdates(ILocationListener locationListener); + void checkLocationSettings(ILocationRequest request, Consumer callback); + + interface ILocationRequest { + void setPriority(int priority); + void setInterval(long interval); + void setFastestInterval(long interval); + } + + interface IMapApiClient { + void connect(); + void disconnect(); + } + + interface IAPIConnectionCallbacks { + void onConnected(Bundle bundle); + void onConnectionSuspended(int i); + } + + interface IAPIOnConnectionFailedListener { + void onConnectionFailed(); + } + + interface ILocationListener { + void onLocationChanged(Location location); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/IMapsProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/IMapsProvider.java new file mode 100644 index 000000000..18d8249d9 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/IMapsProvider.java @@ -0,0 +1,191 @@ +package org.telegram.messenger; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.location.Location; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +import androidx.core.util.Consumer; + +import java.util.List; + +public interface IMapsProvider { + int MAP_TYPE_NORMAL = 0, + MAP_TYPE_SATELLITE = 1, + MAP_TYPE_HYBRID = 2; + + void initializeMaps(Context context); + IMapView onCreateMapView(Context context); + IMarkerOptions onCreateMarkerOptions(); + ICircleOptions onCreateCircleOptions(); + ILatLngBoundsBuilder onCreateLatLngBoundsBuilder(); + ICameraUpdate newCameraUpdateLatLng(LatLng latLng); + ICameraUpdate newCameraUpdateLatLngZoom(LatLng latLng, float zoom); + ICameraUpdate newCameraUpdateLatLngBounds(ILatLngBounds bounds, int padding); + IMapStyleOptions loadRawResourceStyle(Context context, int resId); + String getMapsAppPackageName(); + int getInstallMapsString(); + + interface IMap { + void setMapType(int mapType); + void animateCamera(ICameraUpdate update); + void animateCamera(ICameraUpdate update, ICancelableCallback callback); + void animateCamera(ICameraUpdate update, int duration, ICancelableCallback callback); + void moveCamera(ICameraUpdate update); + float getMaxZoomLevel(); + void setMyLocationEnabled(boolean enabled); + IUISettings getUiSettings(); + void setOnCameraMoveStartedListener(OnCameraMoveStartedListener onCameraMoveStartedListener); + CameraPosition getCameraPosition(); + void setOnMapLoadedCallback(Runnable callback); + IProjection getProjection(); + void setPadding(int left, int top, int right, int bottom); + void setMapStyle(IMapStyleOptions style); + IMarker addMarker(IMarkerOptions markerOptions); + void setOnMyLocationChangeListener(Consumer callback); + void setOnMarkerClickListener(OnMarkerClickListener markerClickListener); + void setOnCameraMoveListener(Runnable callback); + ICircle addCircle(ICircleOptions circleOptions); + } + + interface IMapView { + View getView(); + void getMapAsync(Consumer callback); + void onResume(); + void onPause(); + void onCreate(Bundle savedInstance); + void onDestroy(); + void onLowMemory(); + void setOnDispatchTouchEventInterceptor(ITouchInterceptor touchInterceptor); + void setOnInterceptTouchEventInterceptor(ITouchInterceptor touchInterceptor); + void setOnLayoutListener(Runnable callback); + } + + interface IUISettings { + void setZoomControlsEnabled(boolean enabled); + void setMyLocationButtonEnabled(boolean enabled); + void setCompassEnabled(boolean enabled); + } + + interface IMarker { + Object getTag(); + void setTag(Object tag); + LatLng getPosition(); + void setPosition(LatLng latLng); + void setRotation(int rotation); + void setIcon(Bitmap bitmap); + void setIcon(int resId); + void remove(); + } + + interface IMarkerOptions { + IMarkerOptions position(LatLng latLng); + IMarkerOptions icon(Bitmap bitmap); + IMarkerOptions icon(int resId); + IMarkerOptions anchor(float lat, float lng); + IMarkerOptions title(String title); + IMarkerOptions snippet(String snippet); + IMarkerOptions flat(boolean flat); + } + + interface ICircle { + void setStrokeColor(int color); + void setFillColor(int color); + void setRadius(double radius); + double getRadius(); + void setCenter(LatLng latLng); + void remove(); + } + + interface ICircleOptions { + ICircleOptions center(LatLng latLng); + ICircleOptions radius(double radius); + ICircleOptions strokeColor(int color); + ICircleOptions fillColor(int color); + ICircleOptions strokePattern(List patternItems); + ICircleOptions strokeWidth(int width); + } + + interface ILatLngBoundsBuilder { + ILatLngBoundsBuilder include(LatLng latLng); + ILatLngBounds build(); + } + + interface ILatLngBounds { + LatLng getCenter(); + } + + interface IMapStyleOptions {} + + interface ICameraUpdate {} + + interface IProjection { + Point toScreenLocation(LatLng latLng); + } + + interface ITouchInterceptor { + boolean onInterceptTouchEvent(MotionEvent ev, ICallableMethod origMethod); + } + + interface ICallableMethod { + R call(A arg); + } + + interface ICancelableCallback { + void onFinish(); + void onCancel(); + } + + interface OnCameraMoveStartedListener { + int REASON_GESTURE = 1, + REASON_API_ANIMATION = 2, + REASON_DEVELOPER_ANIMATION = 3; + + void onCameraMoveStarted(int reason); + } + + interface OnMarkerClickListener { + boolean onClick(IMarker marker); + } + + class PatternItem { + public final static class Gap extends PatternItem { + public final int length; + + public Gap(int length) { + this.length = length; + } + } + + public final static class Dash extends PatternItem { + public final int length; + + public Dash(int length) { + this.length = length; + } + } + } + + final class CameraPosition { + public final LatLng target; + public final float zoom; + + public CameraPosition(LatLng target, float zoom) { + this.target = target; + this.zoom = zoom; + } + } + + final class LatLng { + public final double latitude; + public final double longitude; + + public LatLng(double latitude, double longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java index 94095b172..682880ac1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java @@ -34,6 +34,7 @@ import androidx.exifinterface.media.ExifInterface; import org.json.JSONArray; import org.json.JSONObject; import org.telegram.messenger.secretmedia.EncryptedFileInputStream; +import org.telegram.messenger.utils.BitmapsCache; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; @@ -83,6 +84,7 @@ import java.util.zip.GZIPInputStream; * b - need blur image * g - autoplay * lastframe - return firstframe for Lottie animation + * firstframe - return firstframe for Lottie animation */ public class ImageLoader { @@ -131,6 +133,19 @@ public class ImageLoader { public static final String AUTOPLAY_FILTER = "g"; + public static boolean hasAutoplayFilter(String s) { + if (s == null) { + return false; + } + String[] words = s.split("_"); + for (int i = 0; i < words.length; ++i) { + if (AUTOPLAY_FILTER.equals(words[i])) { + return true; + } + } + return false; + } + public void moveToFront(String key) { if (key == null) { return; @@ -845,6 +860,7 @@ public class ImageLoader { boolean precache = false; boolean limitFps = false; boolean lastFrameBitmap = false; + boolean firstFrameBitmap = false; int autoRepeat = 1; int[] colors = null; String diceEmoji = null; @@ -870,6 +886,10 @@ public class ImageLoader { if (cacheImage.filter.contains("lastframe")) { lastFrameBitmap = true; } + if (cacheImage.filter.contains("firstframe")) { + firstFrameBitmap = true; + } + } if (args.length >= 3) { @@ -895,8 +915,6 @@ public class ImageLoader { fitzModifier = 6; } } - - } RLottieDrawable lottieDrawable; if (diceEmoji != null) { @@ -932,17 +950,24 @@ public class ImageLoader { } } } - if (lastFrameBitmap) { + if (lastFrameBitmap || firstFrameBitmap) { precache = false; } + BitmapsCache.CacheOptions cacheOptions = null; + if (precache) { + cacheOptions = new BitmapsCache.CacheOptions(); + if (cacheImage.filter != null && cacheImage.filter.contains("compress")) { + cacheOptions.compressQuality = BitmapsCache.COMPRESS_QUALITY_DEFAULT; + } + } if (compressed) { - lottieDrawable = new RLottieDrawable(cacheImage.finalFilePath, decompressGzip(cacheImage.finalFilePath), w, h, precache, limitFps, null, fitzModifier); + lottieDrawable = new RLottieDrawable(cacheImage.finalFilePath, decompressGzip(cacheImage.finalFilePath), w, h, cacheOptions, limitFps, null, fitzModifier); } else { - lottieDrawable = new RLottieDrawable(cacheImage.finalFilePath, w, h, precache, limitFps, null, fitzModifier); + lottieDrawable = new RLottieDrawable(cacheImage.finalFilePath, w, h, cacheOptions, limitFps, null, fitzModifier); } } - if (lastFrameBitmap) { - loadLastFrame(lottieDrawable, h, w); + if (lastFrameBitmap || firstFrameBitmap) { + loadLastFrame(lottieDrawable, h, w, lastFrameBitmap); } else { lottieDrawable.setAutoRepeat(autoRepeat); onPostExecute(lottieDrawable); @@ -956,6 +981,7 @@ public class ImageLoader { seekTo = 0; } boolean limitFps = false; + boolean precache = false; if (cacheImage.filter != null) { String[] args = cacheImage.filter.split("_"); if (args.length >= 2) { @@ -965,11 +991,23 @@ public class ImageLoader { limitFps = true; } } + for (int i = 0; i < args.length; i++) { + if ("pcache".equals(args[i])) { + precache = true; + } + } } - if ((isAnimatedAvatar(cacheImage.filter) || AUTOPLAY_FILTER.equals(cacheImage.filter)) && !(cacheImage.imageLocation.document instanceof TLRPC.TL_documentEncrypted)) { + if ((isAnimatedAvatar(cacheImage.filter) || AUTOPLAY_FILTER.equals(cacheImage.filter)) && !(cacheImage.imageLocation.document instanceof TLRPC.TL_documentEncrypted) && !precache) { TLRPC.Document document = cacheImage.imageLocation.document instanceof TLRPC.Document ? cacheImage.imageLocation.document : null; long size = document != null ? cacheImage.size : cacheImage.imageLocation.currentSize; - fileDrawable = new AnimatedFileDrawable(cacheImage.finalFilePath, false, size, document, document == null ? cacheImage.imageLocation : null, cacheImage.parentObject, seekTo, cacheImage.currentAccount, false); + BitmapsCache.CacheOptions cacheOptions = null; + if (precache) { + cacheOptions = new BitmapsCache.CacheOptions(); + if (cacheImage.filter != null && cacheImage.filter.contains("compress")) { + cacheOptions.compressQuality = BitmapsCache.COMPRESS_QUALITY_DEFAULT; + } + } + fileDrawable = new AnimatedFileDrawable(cacheImage.finalFilePath, false, size, document, document == null ? cacheImage.imageLocation : null, cacheImage.parentObject, seekTo, cacheImage.currentAccount, false, cacheOptions); fileDrawable.setIsWebmSticker(MessageObject.isWebM(document) || MessageObject.isVideoSticker(document) || isAnimatedAvatar(cacheImage.filter)); } else { @@ -984,7 +1022,14 @@ public class ImageLoader { h = (int) (h_filter * AndroidUtilities.density); } } - fileDrawable = new AnimatedFileDrawable(cacheImage.finalFilePath, "d".equals(cacheImage.filter), 0, cacheImage.imageLocation.document, null, null, seekTo, cacheImage.currentAccount, false, w, h); + BitmapsCache.CacheOptions cacheOptions = null; + if (precache) { + cacheOptions = new BitmapsCache.CacheOptions(); + if (cacheImage.filter != null && cacheImage.filter.contains("compress")) { + cacheOptions.compressQuality = BitmapsCache.COMPRESS_QUALITY_DEFAULT; + } + } + fileDrawable = new AnimatedFileDrawable(cacheImage.finalFilePath, "d".equals(cacheImage.filter), 0, cacheImage.imageLocation.document, null, null, seekTo, cacheImage.currentAccount, false, w, h, cacheOptions); fileDrawable.setIsWebmSticker(MessageObject.isWebM(cacheImage.imageLocation.document) || MessageObject.isVideoSticker(cacheImage.imageLocation.document) || isAnimatedAvatar(cacheImage.filter)); } fileDrawable.setLimitFps(limitFps); @@ -1340,7 +1385,7 @@ public class ImageLoader { Utilities.loadWebpImage(image, buffer, buffer.limit(), null, !opts.inPurgeable); file.close(); } else { - if (opts.inPurgeable || secureDocumentKey != null) { + if (opts.inPurgeable || secureDocumentKey != null || Build.VERSION.SDK_INT <= 29) { RandomAccessFile f = new RandomAccessFile(cacheFileFinal, "r"); int len = (int) f.length(); int offset = 0; @@ -1460,11 +1505,14 @@ public class ImageLoader { Utilities.pinBitmap(image); } } - } catch (Throwable ignore) { - + } catch (Throwable e) { + FileLog.e(e); } } Thread.interrupted(); + if (BuildVars.LOGS_ENABLED && inEncryptedFile) { + FileLog.e("Image Loader image is empty = " + (image == null) + " " + cacheFileFinal); + } if (needInvert || orientation != 0) { onPostExecute(image != null ? new ExtendedBitmapDrawable(image, needInvert, orientation) : null); } else { @@ -1473,10 +1521,12 @@ public class ImageLoader { } } - private void loadLastFrame(RLottieDrawable lottieDrawable, int w, int h) { + private void loadLastFrame(RLottieDrawable lottieDrawable, int w, int h, boolean lastFrame) { Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); - canvas.scale(2f, 2f, w / 2f, h / 2f); + if (lastFrame) { + canvas.scale(2f, 2f, w / 2f, h / 2f); + } AndroidUtilities.runOnUIThread(() -> { lottieDrawable.setOnFrameReadyRunnable(() -> { @@ -1484,13 +1534,17 @@ public class ImageLoader { BitmapDrawable bitmapDrawable = null; if (lottieDrawable.getBackgroundBitmap() != null || lottieDrawable.getRenderingBitmap() != null) { Bitmap currentBitmap = lottieDrawable.getBackgroundBitmap() != null ? lottieDrawable.getBackgroundBitmap() : lottieDrawable.getRenderingBitmap(); + canvas.save(); + if (!lastFrame) { + canvas.scale(currentBitmap.getWidth() / w, currentBitmap.getHeight() / h, w / 2f, h / 2f); + } canvas.drawBitmap(currentBitmap, 0, 0, null); bitmapDrawable = new BitmapDrawable(bitmap); } onPostExecute(bitmapDrawable); lottieDrawable.recycle(); }); - lottieDrawable.setCurrentFrame(lottieDrawable.getFramesCount() - 1, true, true); + lottieDrawable.setCurrentFrame(lastFrame ? lottieDrawable.getFramesCount() - 1 : 0, true, true); }); } @@ -2718,7 +2772,7 @@ public class ImageLoader { img.secureDocument = imageLocation.secureDocument; onlyCache = img.secureDocument.secureFile.dc_id == Integer.MIN_VALUE; cacheFile = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), url); - } else if (!(AUTOPLAY_FILTER.equals(filter) || isAnimatedAvatar(filter)) && (cacheType != 0 || size <= 0 || imageLocation.path != null || isEncrypted)) { + } else if (!(hasAutoplayFilter(filter) || isAnimatedAvatar(filter)) && (cacheType != 0 || size <= 0 || imageLocation.path != null || isEncrypted)) { cacheFile = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), url); if (cacheFile.exists()) { cacheFileExists = true; @@ -2790,7 +2844,7 @@ public class ImageLoader { cacheFile = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), imageLocation.location.volume_id + "_" + imageLocation.location.local_id + ".temp"); } } - if (AUTOPLAY_FILTER.equals(filter) || isAnimatedAvatar(filter)) { + if (hasAutoplayFilter(filter) || isAnimatedAvatar(filter)) { img.imageType = FileLoader.IMAGE_TYPE_ANIMATION; img.size = fileSize; onlyCache = true; @@ -2811,6 +2865,7 @@ public class ImageLoader { img.encryptionKeyPath = new File(FileLoader.getInternalCacheDir(), url + ".enc.key"); } img.addImageReceiver(imageReceiver, key, filter, type, guid); + if (onlyCache || cacheFileExists || cacheFile.exists()) { img.finalFilePath = cacheFile; img.imageLocation = imageLocation; @@ -2900,8 +2955,8 @@ public class ImageLoader { if (imageReceiver == null) { return; } - boolean imageSet = false; + boolean mediaSet = false; String mediaKey = imageReceiver.getMediaKey(); int guid = imageReceiver.getNewGuid(); if (mediaKey != null) { @@ -2927,13 +2982,22 @@ public class ImageLoader { } } } - if (drawable != null) { + boolean hasBitmap = true; + if (drawable instanceof RLottieDrawable) { + hasBitmap = ((RLottieDrawable) drawable).hasBitmap(); + } else if (drawable instanceof AnimatedFileDrawable) { + hasBitmap = ((AnimatedFileDrawable) drawable).hasBitmap(); + } + if (hasBitmap && drawable != null) { cancelLoadingForImageReceiver(imageReceiver, true); imageReceiver.setImageBitmapByKey(drawable, mediaKey, ImageReceiver.TYPE_MEDIA, true, guid); imageSet = true; if (!imageReceiver.isForcePreview()) { return; } + } else if (drawable != null) { + mediaSet = true; + imageReceiver.setImageBitmapByKey(drawable, mediaKey, ImageReceiver.TYPE_MEDIA, true, guid); } } String imageKey = imageReceiver.getImageKey(); @@ -2965,7 +3029,7 @@ public class ImageLoader { cancelLoadingForImageReceiver(imageReceiver, true); imageReceiver.setImageBitmapByKey(drawable, imageKey, ImageReceiver.TYPE_IMAGE, true, guid); imageSet = true; - if (!imageReceiver.isForcePreview() && mediaKey == null) { + if (!imageReceiver.isForcePreview() && (mediaKey == null || mediaSet)) { return; } } @@ -3157,10 +3221,15 @@ public class ImageLoader { thumbKey += "@" + thumbFilter; } - if (imageReceiver.getUniqKeyPrefix() != null) { + if (imageReceiver.getUniqKeyPrefix() != null && imageKey != null) { imageKey = imageReceiver.getUniqKeyPrefix() + imageKey; } + if (imageReceiver.getUniqKeyPrefix() != null && mediaKey != null) { + mediaKey = imageReceiver.getUniqKeyPrefix() + mediaKey; + } + + if (imageLocation != null && imageLocation.path != null) { createLoadOperationForImageReceiver(imageReceiver, thumbKey, thumbUrl, thumbExt, thumbLocation, thumbFilter, 0, 1, ImageReceiver.TYPE_THUMB, thumbSet ? 2 : 1, guid); createLoadOperationForImageReceiver(imageReceiver, imageKey, imageUrl, imageExt, imageLocation, imageFilter, imageReceiver.getSize(), 1, ImageReceiver.TYPE_IMAGE, 0, guid); @@ -3177,7 +3246,9 @@ public class ImageLoader { if (!imageSet) { createLoadOperationForImageReceiver(imageReceiver, imageKey, imageUrl, imageExt, imageLocation, imageFilter, 0, imageCacheType, ImageReceiver.TYPE_IMAGE, 0, guid); } - createLoadOperationForImageReceiver(imageReceiver, mediaKey, mediaUrl, mediaExt, mediaLocation, mediaFilter, imageReceiver.getSize(), mediaCacheType, ImageReceiver.TYPE_MEDIA, 0, guid); + if (!mediaSet) { + createLoadOperationForImageReceiver(imageReceiver, mediaKey, mediaUrl, mediaExt, mediaLocation, mediaFilter, imageReceiver.getSize(), mediaCacheType, ImageReceiver.TYPE_MEDIA, 0, guid); + } } else { int imageCacheType = imageReceiver.getCacheType(); if (imageCacheType == 0 && saveImageToCache) { @@ -3204,6 +3275,10 @@ public class ImageLoader { return imageLocation != null && (MessageObject.isAnimatedStickerDocument(imageLocation.document, true) || imageLocation.imageType == FileLoader.IMAGE_TYPE_LOTTIE || MessageObject.isVideoSticker(imageLocation.document)) || isAnimatedAvatar(key); } + public boolean hasLottieMemCache(String key) { + return lottieMemCache != null && lottieMemCache.contains(key); + } + private void httpFileLoadError(final String location) { imageLoadQueue.postRunnable(() -> { CacheImage img = imageLoadingByUrl.get(location); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java index bd97c498f..1045c03ab 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java @@ -32,6 +32,7 @@ import androidx.annotation.Keep; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AnimatedFileDrawable; import org.telegram.ui.Components.LoadingStickerDrawable; import org.telegram.ui.Components.RLottieDrawable; @@ -41,6 +42,8 @@ import java.util.ArrayList; public class ImageReceiver implements NotificationCenter.NotificationCenterDelegate { + private long currentTime; + public interface ImageReceiverDelegate { void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb, boolean memCache); @@ -195,7 +198,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private int imageTag; private Drawable currentImageDrawable; private BitmapShader imageShader; - private int imageOrientation; + protected int imageOrientation; private ImageLocation currentThumbLocation; private String currentThumbFilter; @@ -224,11 +227,13 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private long currentSize; private int currentCacheType; + private boolean allowLottieVibration = true; private boolean allowStartAnimation = true; private boolean allowStartLottieAnimation = true; private boolean useSharedAnimationQueue; private boolean allowDecodeSingleFrame; private int autoRepeat = 1; + private long autoRepeatTimeout; private boolean animationReadySent; private boolean crossfadeWithOldImage; @@ -282,6 +287,8 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private boolean videoThumbIsSame; private boolean allowLoadingOnAttachedOnly; private boolean shouldLoadOnAttach; + private boolean skipUpdateFrame; + public boolean clip = true; public int animatedFileDrawableRepeatMaxCount; @@ -481,13 +488,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } ImageLoader.getInstance().cancelLoadingForImageReceiver(this, true); - if (parentView != null) { - if (invalidateAll) { - parentView.invalidate(); - } else { - parentView.invalidate((int) imageX, (int) imageY, (int) (imageX + imageW), (int) (imageY + imageH)); - } - } + invalidate(); if (delegate != null) { delegate.didSetImage(this, currentImageDrawable != null || currentThumbDrawable != null || staticThumbDrawable != null || currentMediaDrawable != null, currentImageDrawable == null && currentMediaDrawable == null, false); } @@ -522,6 +523,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg mediaKey += "@" + mediaFilter; } + if (uniqKeyPrefix != null) { + mediaKey = uniqKeyPrefix + mediaKey; + } + if (mediaKey == null && currentImageKey != null && currentImageKey.equals(imageKey) || currentMediaKey != null && currentMediaKey.equals(mediaKey)) { if (delegate != null) { delegate.didSetImage(this, currentImageDrawable != null || currentThumbDrawable != null || staticThumbDrawable != null || currentMediaDrawable != null, currentImageDrawable == null && currentMediaDrawable == null, false); @@ -650,13 +655,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private void loadImage() { ImageLoader.getInstance().loadImageForImageReceiver(this); - if (parentView != null) { - if (invalidateAll) { - parentView.invalidate(); - } else { - parentView.invalidate((int) imageX, (int) imageY, (int) (imageX + imageW), (int) (imageY + imageH)); - } - } + invalidate(); } public boolean canInvertBitmap() { @@ -773,7 +772,12 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg fileDrawable.setAllowDecodeSingleFrame(allowDecodeSingleFrame); } else if (bitmap instanceof RLottieDrawable) { RLottieDrawable fileDrawable = (RLottieDrawable) bitmap; - fileDrawable.addParentView(parentView); + if (attachedToWindow) { + fileDrawable.addParentView(this); + } + if (fileDrawable != null) { + fileDrawable.setAllowVibration(allowLottieVibration); + } if (allowStartLottieAnimation && (!fileDrawable.isHeavyDrawable() || currentOpenedLayerFlags == 0)) { fileDrawable.start(); } @@ -823,13 +827,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (delegate != null) { delegate.didSetImage(this, currentThumbDrawable != null || staticThumbDrawable != null, true, false); } - if (parentView != null) { - if (invalidateAll) { - parentView.invalidate(); - } else { - parentView.invalidate((int) imageX, (int) imageY, (int) (imageX + imageW), (int) (imageY + imageH)); - } - } + invalidate(); if (forceCrossfade && crossfadeWithOldImage && crossfadeImage != null) { currentAlpha = 0.0f; lastUpdateAlphaTime = System.currentTimeMillis(); @@ -939,6 +937,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (animatedFileDrawable != null) { animatedFileDrawable.removeParent(this); } + RLottieDrawable lottieDrawable = getLottieAnimation(); + if (lottieDrawable != null) { + lottieDrawable.removeParentView(this); + } } private boolean setBackupImage() { @@ -949,6 +951,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg temp.clear(); setImageBackup = temp; RLottieDrawable lottieDrawable = getLottieAnimation(); + if (lottieDrawable != null) { + lottieDrawable.setAllowVibration(allowLottieVibration); + } if (lottieDrawable != null && allowStartLottieAnimation && (!lottieDrawable.isHeavyDrawable() || currentOpenedLayerFlags == 0)) { lottieDrawable.start(); } @@ -968,18 +973,20 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg return true; } RLottieDrawable lottieDrawable = getLottieAnimation(); + if (lottieDrawable != null) { + lottieDrawable.addParentView(this); + lottieDrawable.setAllowVibration(allowLottieVibration); + } if (lottieDrawable != null && allowStartLottieAnimation && (!lottieDrawable.isHeavyDrawable() || currentOpenedLayerFlags == 0)) { lottieDrawable.start(); } AnimatedFileDrawable animatedFileDrawable = getAnimation(); - if (animatedFileDrawable != null && parentView != null) { + if (animatedFileDrawable != null) { animatedFileDrawable.addParent(this); } if (animatedFileDrawable != null && allowStartAnimation && currentOpenedLayerFlags == 0) { animatedFileDrawable.checkRepeat(); - if (parentView != null) { - parentView.invalidate(); - } + invalidate(); } if (NotificationCenter.getGlobalInstance().isAnimationInProgress()) { didReceivedNotification(NotificationCenter.stopAllHeavyOperations, currentAccount, 512); @@ -987,25 +994,23 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg return false; } - private void drawDrawable(Canvas canvas, Drawable drawable, int alpha, BitmapShader shader, int orientation) { + private void drawDrawable(Canvas canvas, Drawable drawable, int alpha, BitmapShader shader, int orientation, BackgroundThreadDrawHolder backgroundThreadDrawHolder) { if (isPressed == 0 && pressedProgress != 0) { pressedProgress -= 16 / 150f; if (pressedProgress < 0) { pressedProgress = 0; } - if (parentView != null) { - parentView.invalidate(); - } + invalidate(); } if (isPressed != 0) { pressedProgress = 1f; animateFromIsPressed = isPressed; } if (pressedProgress == 0 || pressedProgress == 1f) { - drawDrawable(canvas, drawable, alpha, shader, orientation, isPressed); + drawDrawable(canvas, drawable, alpha, shader, orientation, isPressed, backgroundThreadDrawHolder); } else { - drawDrawable(canvas, drawable, alpha, shader, orientation, isPressed); - drawDrawable(canvas, drawable, (int) (alpha * pressedProgress), shader, orientation, animateFromIsPressed); + drawDrawable(canvas, drawable, alpha, shader, orientation, isPressed, backgroundThreadDrawHolder); + drawDrawable(canvas, drawable, (int) (alpha * pressedProgress), shader, orientation, animateFromIsPressed, backgroundThreadDrawHolder); } } @@ -1013,9 +1018,29 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg useRoundForThumb = value; } - private void drawDrawable(Canvas canvas, Drawable drawable, int alpha, BitmapShader shader, int orientation, int isPressed) { + protected void drawDrawable(Canvas canvas, Drawable drawable, int alpha, BitmapShader shader, int orientation, int isPressed, BackgroundThreadDrawHolder backgroundThreadDrawHolder) { + float imageX, imageY, imageH, imageW; + RectF drawRegion; + if (backgroundThreadDrawHolder != null) { + imageX = backgroundThreadDrawHolder.imageX; + imageY = backgroundThreadDrawHolder.imageY; + imageH = backgroundThreadDrawHolder.imageH; + imageW = backgroundThreadDrawHolder.imageW; + drawRegion = backgroundThreadDrawHolder.drawRegion; + } else { + imageX = this.imageX; + imageY = this.imageY; + imageH = this.imageH; + imageW = this.imageW; + drawRegion = this.drawRegion; + } if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; + if (drawable instanceof RLottieDrawable) { + ((RLottieDrawable) drawable).skipFrameUpdate = skipUpdateFrame; + } else if (drawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) drawable).skipFrameUpdate = skipUpdateFrame; + } Paint paint; if (shader != null) { @@ -1087,7 +1112,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg float scaleW = imageW == 0 ? 1.0f : (bitmapW / realImageW); float scaleH = imageH == 0 ? 1.0f : (bitmapH / realImageH); - if (shader != null) { + if (shader != null && backgroundThreadDrawHolder == null) { if (isAspectFit) { float scale = Math.max(scaleW, scaleH); bitmapW /= scale; @@ -1212,7 +1237,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg canvas.drawRoundRect(roundRect, roundRadius[0], roundRadius[0], roundPaint); } } catch (Exception e) { - onBitmapException(bitmapDrawable); + if (backgroundThreadDrawHolder == null) { + onBitmapException(bitmapDrawable); + } FileLog.e(e); } } else { @@ -1233,17 +1260,21 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg canvas.save(); bitmapW /= scale; bitmapH /= scale; - drawRegion.set(imageX + (imageW - bitmapW) / 2.0f, imageY + (imageH - bitmapH) / 2.0f, imageX + (imageW + bitmapW) / 2.0f, imageY + (imageH + bitmapH) / 2.0f); - bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); - if (bitmapDrawable instanceof AnimatedFileDrawable) { - ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(drawRegion.left, drawRegion.top, drawRegion.width(), drawRegion.height()); + if (backgroundThreadDrawHolder == null) { + drawRegion.set(imageX + (imageW - bitmapW) / 2.0f, imageY + (imageH - bitmapH) / 2.0f, imageX + (imageW + bitmapW) / 2.0f, imageY + (imageH + bitmapH) / 2.0f); + bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + if (bitmapDrawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(drawRegion.left, drawRegion.top, drawRegion.width(), drawRegion.height()); + } } if (isVisible) { try { bitmapDrawable.setAlpha(alpha); - bitmapDrawable.draw(canvas); + drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); } catch (Exception e) { - onBitmapException(bitmapDrawable); + if (backgroundThreadDrawHolder == null) { + onBitmapException(bitmapDrawable); + } FileLog.e(e); } } @@ -1251,7 +1282,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } else { if (Math.abs(scaleW - scaleH) > 0.00001f) { canvas.save(); - canvas.clipRect(imageX, imageY, imageX + imageW, imageY + imageH); + if (clip) { + canvas.clipRect(imageX, imageY, imageX + imageW, imageY + imageH); + } if (orientation % 360 != 0) { if (centerRotation) { @@ -1271,14 +1304,16 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (bitmapDrawable instanceof AnimatedFileDrawable) { ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(imageX, imageY, imageW, imageH); } - if (orientation % 360 == 90 || orientation % 360 == 270) { - float width = drawRegion.width() / 2; - float height = drawRegion.height() / 2; - float centerX = drawRegion.centerX(); - float centerY = drawRegion.centerY(); - bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); - } else { - bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + if (backgroundThreadDrawHolder == null) { + if (orientation % 360 == 90 || orientation % 360 == 270) { + float width = drawRegion.width() / 2; + float height = drawRegion.height() / 2; + float centerX = drawRegion.centerX(); + float centerY = drawRegion.centerY(); + bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); + } else { + bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + } } if (isVisible) { try { @@ -1289,10 +1324,11 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg bitmapDrawable.getPaint().setBlendMode(null); } } - bitmapDrawable.setAlpha(alpha); - bitmapDrawable.draw(canvas); + drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); } catch (Exception e) { - onBitmapException(bitmapDrawable); + if (backgroundThreadDrawHolder == null) { + onBitmapException(bitmapDrawable); + } FileLog.e(e); } } @@ -1314,14 +1350,16 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (bitmapDrawable instanceof AnimatedFileDrawable) { ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(imageX, imageY, imageW, imageH); } - if (orientation % 360 == 90 || orientation % 360 == 270) { - float width = drawRegion.width() / 2; - float height = drawRegion.height() / 2; - float centerX = drawRegion.centerX(); - float centerY = drawRegion.centerY(); - bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); - } else { - bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + if (backgroundThreadDrawHolder == null) { + if (orientation % 360 == 90 || orientation % 360 == 270) { + float width = drawRegion.width() / 2; + float height = drawRegion.height() / 2; + float centerX = drawRegion.centerX(); + float centerY = drawRegion.centerY(); + bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); + } else { + bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + } } if (isVisible) { try { @@ -1332,8 +1370,8 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg bitmapDrawable.getPaint().setBlendMode(null); } } - bitmapDrawable.setAlpha(alpha); - bitmapDrawable.draw(canvas); + + drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); } catch (Exception e) { onBitmapException(bitmapDrawable); FileLog.e(e); @@ -1343,26 +1381,46 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } } } - } else { - if (isAspectFit) { - int bitmapW = drawable.getIntrinsicWidth(); - int bitmapH = drawable.getIntrinsicHeight(); - float realImageW = imageW - sideClip * 2; - float realImageH = imageH - sideClip * 2; - float scaleW = imageW == 0 ? 1.0f : (bitmapW / realImageW); - float scaleH = imageH == 0 ? 1.0f : (bitmapH / realImageH); - float scale = Math.max(scaleW, scaleH); - bitmapW /= scale; - bitmapH /= scale; - drawRegion.set(imageX + (imageW - bitmapW) / 2.0f, imageY + (imageH - bitmapH) / 2.0f, imageX + (imageW + bitmapW) / 2.0f, imageY + (imageH + bitmapH) / 2.0f); - } else { - drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH); + + if (drawable instanceof RLottieDrawable) { + ((RLottieDrawable) drawable).skipFrameUpdate = false; + } else if (drawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) drawable).skipFrameUpdate = false; + } + } else { + if (backgroundThreadDrawHolder == null) { + if (isAspectFit) { + int bitmapW = drawable.getIntrinsicWidth(); + int bitmapH = drawable.getIntrinsicHeight(); + float realImageW = imageW - sideClip * 2; + float realImageH = imageH - sideClip * 2; + float scaleW = imageW == 0 ? 1.0f : (bitmapW / realImageW); + float scaleH = imageH == 0 ? 1.0f : (bitmapH / realImageH); + float scale = Math.max(scaleW, scaleH); + bitmapW /= scale; + bitmapH /= scale; + drawRegion.set(imageX + (imageW - bitmapW) / 2.0f, imageY + (imageH - bitmapH) / 2.0f, imageX + (imageW + bitmapW) / 2.0f, imageY + (imageH + bitmapH) / 2.0f); + } else { + drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH); + } + drawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); } - drawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); if (isVisible) { try { drawable.setAlpha(alpha); - drawable.draw(canvas); + if (backgroundThreadDrawHolder != null) { + if (drawable instanceof SvgHelper.SvgDrawable) { + long time = backgroundThreadDrawHolder.time; + if (time == 0) { + time = System.currentTimeMillis(); + } + ((SvgHelper.SvgDrawable) drawable).drawInternal(canvas, true, time, backgroundThreadDrawHolder.imageX, backgroundThreadDrawHolder.imageY, backgroundThreadDrawHolder.imageW, backgroundThreadDrawHolder.imageH); + } else { + drawable.draw(canvas); + } + } else { + drawable.draw(canvas); + } } catch (Exception e) { FileLog.e(e); } @@ -1370,6 +1428,38 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } } + private void drawBitmapDrawable(Canvas canvas, BitmapDrawable bitmapDrawable, BackgroundThreadDrawHolder backgroundThreadDrawHolder, int alpha) { + if (backgroundThreadDrawHolder != null) { + if (bitmapDrawable instanceof RLottieDrawable) { + ((RLottieDrawable) bitmapDrawable).drawInBackground(canvas, backgroundThreadDrawHolder.imageX, backgroundThreadDrawHolder.imageY, backgroundThreadDrawHolder.imageW, backgroundThreadDrawHolder.imageH, alpha); + } else if (bitmapDrawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) bitmapDrawable).drawInBackground(canvas, backgroundThreadDrawHolder.imageX, backgroundThreadDrawHolder.imageY, backgroundThreadDrawHolder.imageW, backgroundThreadDrawHolder.imageH, alpha); + } else { + Bitmap bitmap = bitmapDrawable.getBitmap(); + if (bitmap != null) { + if (backgroundThreadDrawHolder.paint == null) { + backgroundThreadDrawHolder.paint = new Paint(Paint.ANTI_ALIAS_FLAG); + } + backgroundThreadDrawHolder.paint.setAlpha(alpha); + canvas.save(); + canvas.translate(backgroundThreadDrawHolder.imageX, backgroundThreadDrawHolder.imageY); + canvas.scale(backgroundThreadDrawHolder.imageW / bitmap.getWidth(), backgroundThreadDrawHolder.imageH / bitmap.getHeight()); + canvas.drawBitmap(bitmap, 0, 0, backgroundThreadDrawHolder.paint); + canvas.restore(); + } + } + } else { + bitmapDrawable.setAlpha(alpha); + if (bitmapDrawable instanceof RLottieDrawable) { + ((RLottieDrawable) bitmapDrawable).drawInternal(canvas, false, currentTime); + } else if (bitmapDrawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) bitmapDrawable).drawInternal(canvas, false, currentTime); + } else { + bitmapDrawable.draw(canvas); + } + } + } + public void setBlendMode(Object mode) { blendMode = mode; invalidate(); @@ -1409,18 +1499,25 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg setImage(currentMediaLocation, currentMediaFilter, currentImageLocation, currentImageFilter, currentThumbLocation, currentThumbFilter, currentThumbDrawable, currentSize, currentExt, currentParentObject, currentCacheType); } - private void checkAlphaAnimation(boolean skip) { + private void checkAlphaAnimation(boolean skip, boolean drawInBackground) { if (manualAlphaAnimator) { return; } if (currentAlpha != 1) { if (!skip) { - long currentTime = System.currentTimeMillis(); - long dt = currentTime - lastUpdateAlphaTime; - if (dt > 18) { - dt = 18; + if (drawInBackground) { + long currentTime = System.currentTimeMillis(); + long dt = currentTime - lastUpdateAlphaTime; + if (lastUpdateAlphaTime == 0) { + dt = 16; + } + if (dt > 30 && AndroidUtilities.screenRefreshRate > 60) { + dt = 30; + } + currentAlpha += dt / (float) crossfadeDuration; + } else { + currentAlpha += 16f / (float) crossfadeDuration; } - currentAlpha += dt / (float) crossfadeDuration; if (currentAlpha > 1) { currentAlpha = 1; previousAlpha = 1f; @@ -1430,26 +1527,40 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } } } - lastUpdateAlphaTime = System.currentTimeMillis(); - if (parentView != null) { - if (invalidateAll) { - parentView.invalidate(); - } else { - parentView.invalidate((int) imageX, (int) imageY, (int) (imageX + imageW), (int) (imageY + imageH)); - } - } + invalidate(); } } public void skipDraw() { - RLottieDrawable lottieDrawable = getLottieAnimation(); - if (lottieDrawable != null) { - lottieDrawable.setCurrentParentView(parentView); - lottieDrawable.updateCurrentFrame(); - } +// RLottieDrawable lottieDrawable = getLottieAnimation(); +// if (lottieDrawable != null) { +// lottieDrawable.setCurrentParentView(parentView); +// lottieDrawable.updateCurrentFrame(); +// } + } + + protected boolean customDraw( + Canvas canvas, + AnimatedFileDrawable animation, + RLottieDrawable lottieAnimation, + Drawable currentMediaDrawable, BitmapShader currentMediaShader, + Drawable currentImageDrawable, BitmapShader currentImageShader, + Drawable currentThumbDrawable, BitmapShader currentThumbShader, + boolean crossfadeWithOldImage, boolean crossfadingWithThumb, + Drawable crossfadeImage, BitmapShader crossfadeShader, + Drawable staticThumbDrawable, + float currentAlpha, float previousAlpha, float overrideAlpha, + int[] roundRadius, + BackgroundThreadDrawHolder backgroundThreadDrawHolder + ) { + return false; } public boolean draw(Canvas canvas) { + return draw(canvas, null); + } + + public boolean draw(Canvas canvas, BackgroundThreadDrawHolder backgroundThreadDrawHolder) { boolean result = false; if (gradientBitmap != null && currentImageKey != null) { canvas.save(); @@ -1458,16 +1569,89 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } try { Drawable drawable = null; - AnimatedFileDrawable animation = getAnimation(); - RLottieDrawable lottieDrawable = getLottieAnimation(); - boolean animationNotReady = animation != null && !animation.hasBitmap() || lottieDrawable != null && !lottieDrawable.hasBitmap(); + AnimatedFileDrawable animation; + RLottieDrawable lottieDrawable; + Drawable currentMediaDrawable; + BitmapShader mediaShader; + Drawable currentImageDrawable; + BitmapShader imageShader; + Drawable currentThumbDrawable; + BitmapShader thumbShader; + + boolean crossfadeWithOldImage; + boolean crossfadingWithThumb; + Drawable crossfadeImage; + BitmapShader crossfadeShader; + Drawable staticThumbDrawable; + float currentAlpha; + float previousAlpha; + float overrideAlpha; + + int[] roundRadius; + boolean animationNotReady; + boolean drawInBackground = backgroundThreadDrawHolder != null; + if (drawInBackground) { + animation = backgroundThreadDrawHolder.animation; + lottieDrawable = backgroundThreadDrawHolder.lottieDrawable; + roundRadius = backgroundThreadDrawHolder.roundRadius; + currentMediaDrawable = backgroundThreadDrawHolder.mediaDrawable; + mediaShader = backgroundThreadDrawHolder.mediaShader; + currentImageDrawable = backgroundThreadDrawHolder.imageDrawable; + imageShader = backgroundThreadDrawHolder.imageShader; + thumbShader = backgroundThreadDrawHolder.thumbShader; + crossfadeImage = backgroundThreadDrawHolder.crossfadeImage; + crossfadeWithOldImage = backgroundThreadDrawHolder.crossfadeWithOldImage; + crossfadingWithThumb = backgroundThreadDrawHolder.crossfadingWithThumb; + currentThumbDrawable = backgroundThreadDrawHolder.thumbDrawable; + staticThumbDrawable = backgroundThreadDrawHolder.staticThumbDrawable; + currentAlpha = backgroundThreadDrawHolder.currentAlpha; + previousAlpha = backgroundThreadDrawHolder.previousAlpha; + crossfadeShader = backgroundThreadDrawHolder.crossfadeShader; + animationNotReady = backgroundThreadDrawHolder.animationNotReady; + overrideAlpha = backgroundThreadDrawHolder.overrideAlpha; + } else { + animation = getAnimation(); + lottieDrawable = getLottieAnimation(); + roundRadius = this.roundRadius; + currentMediaDrawable = this.currentMediaDrawable; + mediaShader = this.mediaShader; + currentImageDrawable = this.currentImageDrawable; + imageShader = this.imageShader; + currentThumbDrawable = this.currentThumbDrawable; + thumbShader = this.thumbShader; + crossfadeWithOldImage = this.crossfadeWithOldImage; + crossfadingWithThumb = this.crossfadingWithThumb; + crossfadeImage = this.crossfadeImage; + staticThumbDrawable = this.staticThumbDrawable; + currentAlpha = this.currentAlpha; + previousAlpha = this.previousAlpha; + crossfadeShader = this.crossfadeShader; + overrideAlpha = this.overrideAlpha; + animationNotReady = animation != null && !animation.hasBitmap() || lottieDrawable != null && !lottieDrawable.hasBitmap(); + } + + if (customDraw( + canvas, + animation, lottieDrawable, + currentMediaDrawable, mediaShader, + currentImageDrawable, imageShader, + currentThumbDrawable, thumbShader, + crossfadeWithOldImage, crossfadingWithThumb, + crossfadeImage, crossfadeShader, + staticThumbDrawable, + currentAlpha, previousAlpha, overrideAlpha, + roundRadius, backgroundThreadDrawHolder + )) { + return true; + } + if (animation != null) { animation.setRoundRadius(roundRadius); } - if (lottieDrawable != null) { + if (lottieDrawable != null && !drawInBackground) { lottieDrawable.setCurrentParentView(parentView); } - if ((animation != null || lottieDrawable != null) && !animationNotReady && !animationReadySent) { + if ((animation != null || lottieDrawable != null) && !animationNotReady && !animationReadySent && !drawInBackground) { animationReadySent = true; if (delegate != null) { delegate.onAnimationReady(this); @@ -1492,6 +1676,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg drawable = staticThumbDrawable; if (useRoundForThumb && thumbShader == null) { updateDrawableRadius(staticThumbDrawable); + thumbShader = this.thumbShader; } shaderToUse = thumbShader; orientation = thumbOrientation; @@ -1506,11 +1691,12 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (previousAlpha != 1f && (drawable == currentImageDrawable || drawable == currentMediaDrawable) && staticThumbDrawable != null) { if (useRoundForThumb && thumbShader == null) { updateDrawableRadius(staticThumbDrawable); + thumbShader = this.thumbShader; } - drawDrawable(canvas, staticThumbDrawable, (int) (overrideAlpha * 255), thumbShader, orientation); + drawDrawable(canvas, staticThumbDrawable, (int) (overrideAlpha * 255), thumbShader, orientation, backgroundThreadDrawHolder); } if (crossfadeWithThumb && animationNotReady) { - drawDrawable(canvas, drawable, (int) (overrideAlpha * 255), shaderToUse, orientation); + drawDrawable(canvas, drawable, (int) (overrideAlpha * 255), shaderToUse, orientation, backgroundThreadDrawHolder); } else { if (crossfadeWithThumb && currentAlpha != 1.0f) { Drawable thumbDrawable = null; @@ -1526,6 +1712,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg thumbDrawable = staticThumbDrawable; if (useRoundForThumb && thumbShader == null) { updateDrawableRadius(staticThumbDrawable); + thumbShader = this.thumbShader; } thumbShaderToUse = thumbShader; } @@ -1534,6 +1721,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg thumbDrawable = staticThumbDrawable; if (useRoundForThumb && thumbShader == null) { updateDrawableRadius(staticThumbDrawable); + thumbShader = this.thumbShader; } thumbShaderToUse = thumbShader; } @@ -1550,30 +1738,30 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } else { alpha = (int) (overrideAlpha * previousAlpha * 255); } - drawDrawable(canvas, thumbDrawable, alpha, thumbShaderToUse, thumbOrientation); + drawDrawable(canvas, thumbDrawable, alpha, thumbShaderToUse, thumbOrientation, backgroundThreadDrawHolder); if (alpha != 255 && thumbDrawable instanceof Emoji.EmojiDrawable) { thumbDrawable.setAlpha(255); } } } - drawDrawable(canvas, drawable, (int) (overrideAlpha * currentAlpha * 255), shaderToUse, orientation); + drawDrawable(canvas, drawable, (int) (overrideAlpha * currentAlpha * 255), shaderToUse, orientation, backgroundThreadDrawHolder); } } else { - drawDrawable(canvas, drawable, (int) (overrideAlpha * 255), shaderToUse, orientation); + drawDrawable(canvas, drawable, (int) (overrideAlpha * 255), shaderToUse, orientation, backgroundThreadDrawHolder); } - checkAlphaAnimation(animationNotReady && crossfadeWithThumb); + checkAlphaAnimation(animationNotReady && crossfadeWithThumb, drawInBackground); result = true; } else if (staticThumbDrawable != null) { - drawDrawable(canvas, staticThumbDrawable, (int) (overrideAlpha * 255), null, thumbOrientation); - checkAlphaAnimation(animationNotReady); + drawDrawable(canvas, staticThumbDrawable, (int) (overrideAlpha * 255), null, thumbOrientation, backgroundThreadDrawHolder); + checkAlphaAnimation(animationNotReady, drawInBackground); result = true; } else { - checkAlphaAnimation(animationNotReady); + checkAlphaAnimation(animationNotReady, drawInBackground); } - if (drawable == null && animationNotReady && parentView != null) { - parentView.invalidate(); + if (drawable == null && animationNotReady && !drawInBackground) { + invalidate(); } } catch (Exception e) { FileLog.e(e); @@ -1819,9 +2007,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } public void setParentView(View view) { + View oldParent = parentView; parentView = view; AnimatedFileDrawable animation = getAnimation(); - if (animation != null) { + if (animation != null && attachedToWindow) { animation.setParentView(parentView); } } @@ -2054,6 +2243,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg allowStartAnimation = value; } + public void setAllowLottieVibration(boolean allow) { + allowLottieVibration = allow; + } + public boolean getAllowStartAnimation() { return allowStartAnimation; } @@ -2074,6 +2267,14 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } } + public void setAutoRepeatTimeout(long timeout) { + autoRepeatTimeout = timeout; + RLottieDrawable drawable = getLottieAnimation(); + if (drawable != null) { + drawable.setAutoRepeatTimeout(autoRepeatTimeout); + } + } + public void setUseSharedAnimationQueue(boolean value) { useSharedAnimationQueue = value; } @@ -2188,6 +2389,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } } currentImageDrawable = drawable; + if (drawable instanceof ExtendedBitmapDrawable) { imageOrientation = ((ExtendedBitmapDrawable) drawable).getOrientation(); } @@ -2195,7 +2397,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (allowCrossFade && isVisible && (!memCache && !forcePreview || forceCrossfade) && crossfadeDuration != 0) { boolean allowCrossfade = true; - if (currentMediaDrawable instanceof AnimatedFileDrawable && ((AnimatedFileDrawable) currentMediaDrawable).hasBitmap()) { + if (currentMediaDrawable instanceof RLottieDrawable && ((RLottieDrawable) currentMediaDrawable).hasBitmap()) { + allowCrossfade = false; + } else if (currentMediaDrawable instanceof AnimatedFileDrawable && ((AnimatedFileDrawable) currentMediaDrawable).hasBitmap()) { allowCrossfade = false; } else if (currentImageDrawable instanceof RLottieDrawable) { allowCrossfade = staticThumbDrawable instanceof LoadingStickerDrawable || staticThumbDrawable instanceof SvgHelper.SvgDrawable || staticThumbDrawable instanceof Emoji.EmojiDrawable; @@ -2230,8 +2434,6 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg long currentTimestamp = 0; if (currentThumbDrawable instanceof AnimatedFileDrawable) { currentTimestamp = ((AnimatedFileDrawable) currentThumbDrawable).getLastFrameTimestamp(); - } else if (currentImageDrawable instanceof AnimatedFileDrawable) { - currentTimestamp = ((AnimatedFileDrawable) currentImageDrawable).getLastFrameTimestamp(); } animatedFileDrawable.seekTo(currentTimestamp, true, true); } @@ -2240,7 +2442,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg updateDrawableRadius(drawable); if (currentImageDrawable == null) { - boolean allowCorssfade = true; + boolean allowCrossfade = true; if (!memCache && !forcePreview || forceCrossfade) { if (currentThumbDrawable == null && staticThumbDrawable == null || currentAlpha == 1.0f || forceCrossfade) { if (currentThumbDrawable != null && staticThumbDrawable != null) { @@ -2315,21 +2517,18 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } } else if (drawable instanceof RLottieDrawable) { RLottieDrawable fileDrawable = (RLottieDrawable) drawable; - fileDrawable.addParentView(parentView); + if (attachedToWindow) { + fileDrawable.addParentView(this); + } if (allowStartLottieAnimation && (!fileDrawable.isHeavyDrawable() || currentOpenedLayerFlags == 0)) { fileDrawable.start(); } fileDrawable.setAllowDecodeSingleFrame(true); fileDrawable.setAutoRepeat(autoRepeat); + fileDrawable.setAutoRepeatTimeout(autoRepeatTimeout); animationReadySent = false; } - if (parentView != null) { - if (invalidateAll) { - parentView.invalidate(); - } else { - parentView.invalidate((int) imageX, (int) imageY, (int) (imageX + imageW), (int) (imageY + imageH)); - } - } + invalidate(); return true; } @@ -2366,7 +2565,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } if (image instanceof RLottieDrawable) { RLottieDrawable lottieDrawable = (RLottieDrawable) image; - lottieDrawable.removeParentView(parentView); + lottieDrawable.removeParentView(this); } if (image instanceof AnimatedFileDrawable) { AnimatedFileDrawable animatedFileDrawable = (AnimatedFileDrawable) image; @@ -2477,26 +2676,31 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg currentOpenedLayerFlags &= ~layer; if (currentOpenedLayerFlags == 0) { RLottieDrawable lottieDrawable = getLottieAnimation(); + if (lottieDrawable != null) { + lottieDrawable.setAllowVibration(allowLottieVibration); + } if (allowStartLottieAnimation && lottieDrawable != null && lottieDrawable.isHeavyDrawable()) { lottieDrawable.start(); } AnimatedFileDrawable animatedFileDrawable = getAnimation(); if (allowStartAnimation && animatedFileDrawable != null) { animatedFileDrawable.checkRepeat(); - if (parentView != null) { - parentView.invalidate(); - } + invalidate(); } } } } public void startCrossfadeFromStaticThumb(Bitmap thumb) { + startCrossfadeFromStaticThumb(new BitmapDrawable(null, thumb)); + } + + public void startCrossfadeFromStaticThumb(Drawable thumb) { currentThumbKey = null; currentThumbDrawable = null; thumbShader = null; roundPaint.setShader(null); - staticThumbDrawable = new BitmapDrawable(null, thumb); + staticThumbDrawable = thumb; crossfadeWithThumb = true; currentAlpha = 0f; updateDrawableRadius(staticThumbDrawable); @@ -2539,4 +2743,110 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg allowLoadingOnAttachedOnly = b; } + public void setSkipUpdateFrame(boolean skipUpdateFrame) { + this.skipUpdateFrame = skipUpdateFrame; + } + + public void setCurrentTime(long time) { + this.currentTime = time; + } + + public BackgroundThreadDrawHolder setDrawInBackgroundThread(BackgroundThreadDrawHolder holder) { + if (holder == null) { + holder = new BackgroundThreadDrawHolder(); + } + holder.animation = getAnimation(); + holder.lottieDrawable = getLottieAnimation(); + for (int i = 0; i < 4; i++) { + holder.roundRadius[i] = roundRadius[i]; + } + holder.mediaDrawable = currentMediaDrawable; + holder.mediaShader = mediaShader; + holder.imageDrawable = currentImageDrawable; + holder.imageShader = imageShader; + holder.thumbDrawable = currentThumbDrawable; + holder.thumbShader = thumbShader; + holder.staticThumbDrawable = staticThumbDrawable; + holder.crossfadeImage = crossfadeImage; + holder.crossfadingWithThumb = crossfadingWithThumb; + holder.crossfadeWithOldImage = crossfadeWithOldImage; + holder.currentAlpha = currentAlpha; + holder.previousAlpha = previousAlpha; + holder.crossfadeShader = crossfadeShader; + holder.animationNotReady = holder.animation != null && !holder.animation.hasBitmap() || holder.lottieDrawable != null && !holder.lottieDrawable.hasBitmap(); + holder.imageX = imageX; + holder.imageY = imageY; + holder.imageW = imageW; + holder.imageH = imageH; + holder.overrideAlpha = overrideAlpha; + return holder; + } + + public static class BackgroundThreadDrawHolder { + public boolean animationNotReady; + public float overrideAlpha; + public long time; + private AnimatedFileDrawable animation; + private RLottieDrawable lottieDrawable; + private int[] roundRadius = new int[4]; + private BitmapShader mediaShader; + private Drawable mediaDrawable; + private BitmapShader imageShader; + private Drawable imageDrawable; + private Drawable thumbDrawable; + private BitmapShader thumbShader; + private Drawable staticThumbDrawable; + private float currentAlpha; + private float previousAlpha; + private BitmapShader crossfadeShader; + public float imageH, imageW, imageX, imageY; + private boolean crossfadeWithOldImage; + private boolean crossfadingWithThumb; + private Drawable crossfadeImage; + public RectF drawRegion = new RectF(); + Paint paint; + + public void release() { + animation = null; + lottieDrawable = null; + for (int i = 0; i < 4; i++) { + roundRadius[i] = roundRadius[i]; + } + mediaDrawable = null; + mediaShader = null; + imageDrawable = null; + imageShader = null; + thumbDrawable = null; + thumbShader = null; + staticThumbDrawable = null; + crossfadeImage = null; + } + + public void setBounds(Rect bounds) { + if (bounds != null) { + imageX = bounds.left; + imageY = bounds.top; + imageW = bounds.width(); + imageH = bounds.height(); + } + } + + public void getBounds(RectF out) { + if (out != null) { + out.left = imageX; + out.top = imageY; + out.right = out.left + imageW; + out.bottom = out.top + imageH; + } + } + + public void getBounds(Rect out) { + if (out != null) { + out.left = (int) imageX; + out.top = (int) imageY; + out.right = (int) (out.left + imageW); + out.bottom = (int) (out.top + imageH); + } + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java index 2c9ca7181..894b11e05 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java @@ -8,6 +8,7 @@ package org.telegram.messenger; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.location.Address; @@ -23,17 +24,6 @@ import android.util.SparseIntArray; import androidx.collection.LongSparseArray; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GoogleApiAvailability; -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.PendingResult; -import com.google.android.gms.common.api.Status; -import com.google.android.gms.location.LocationRequest; -import com.google.android.gms.location.LocationServices; -import com.google.android.gms.location.LocationSettingsRequest; -import com.google.android.gms.location.LocationSettingsResult; -import com.google.android.gms.location.LocationSettingsStatusCodes; - import org.telegram.SQLite.SQLiteCursor; import org.telegram.SQLite.SQLitePreparedStatement; import org.telegram.tgnet.NativeByteBuffer; @@ -45,7 +35,8 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; -public class LocationController extends BaseController implements NotificationCenter.NotificationCenterDelegate, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { +@SuppressLint("MissingPermission") +public class LocationController extends BaseController implements NotificationCenter.NotificationCenterDelegate, ILocationServiceProvider.IAPIConnectionCallbacks, ILocationServiceProvider.IAPIOnConnectionFailedListener { private LongSparseArray sharingLocationsMap = new LongSparseArray<>(); private ArrayList sharingLocations = new ArrayList<>(); @@ -58,10 +49,10 @@ public class LocationController extends BaseController implements NotificationCe private FusedLocationListener fusedLocationListener = new FusedLocationListener(); private Location lastKnownLocation; private long lastLocationSendTime; - private boolean locationSentSinceLastGoogleMapUpdate = true; + private boolean locationSentSinceLastMapUpdate = true; private long lastLocationStartTime; private boolean started; - private boolean lastLocationByGoogleMaps; + private boolean lastLocationByMaps; private SparseIntArray requests = new SparseIntArray(); private LongSparseArray cacheRequests = new LongSparseArray<>(); private long locationEndWatchTime; @@ -72,9 +63,9 @@ public class LocationController extends BaseController implements NotificationCe public ArrayList sharingLocationsUI = new ArrayList<>(); private LongSparseArray sharingLocationsMapUI = new LongSparseArray<>(); - private Boolean playServicesAvailable; + private Boolean servicesAvailable; private boolean wasConnectedToPlayServices; - private GoogleApiClient googleApiClient; + private ILocationServiceProvider.IMapApiClient apiClient; private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private final static long UPDATE_INTERVAL = 1000, FASTEST_INTERVAL = 1000; private final static int BACKGROUD_UPDATE_TIME = 30 * 1000; @@ -86,7 +77,7 @@ public class LocationController extends BaseController implements NotificationCe private ArrayList cachedNearbyUsers = new ArrayList<>(); private ArrayList cachedNearbyChats = new ArrayList<>(); - private LocationRequest locationRequest; + private ILocationServiceProvider.ILocationRequest locationRequest; private static volatile LocationController[] Instance = new LocationController[UserConfig.MAX_ACCOUNT_COUNT]; @@ -147,7 +138,7 @@ public class LocationController extends BaseController implements NotificationCe } } - private class FusedLocationListener implements com.google.android.gms.location.LocationListener { + private class FusedLocationListener implements ILocationServiceProvider.ILocationListener { @Override public void onLocationChanged(Location location) { @@ -162,13 +153,10 @@ public class LocationController extends BaseController implements NotificationCe super(instance); locationManager = (LocationManager) ApplicationLoader.applicationContext.getSystemService(Context.LOCATION_SERVICE); - googleApiClient = new GoogleApiClient.Builder(ApplicationLoader.applicationContext). - addApi(LocationServices.API). - addConnectionCallbacks(this). - addOnConnectionFailedListener(this).build(); + apiClient = ApplicationLoader.getLocationServiceProvider().onCreateLocationServicesAPI(ApplicationLoader.applicationContext, this, this); - locationRequest = new LocationRequest(); - locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); + locationRequest = ApplicationLoader.getLocationServiceProvider().onCreateLocationRequest(); + locationRequest.setPriority(ILocationServiceProvider.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(UPDATE_INTERVAL); locationRequest.setFastestInterval(FASTEST_INTERVAL); @@ -288,30 +276,25 @@ public class LocationController extends BaseController implements NotificationCe wasConnectedToPlayServices = true; try { if (Build.VERSION.SDK_INT >= 21) { - LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest); - PendingResult result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build()); - result.setResultCallback(locationSettingsResult -> { - final Status status = locationSettingsResult.getStatus(); - switch (status.getStatusCode()) { - case LocationSettingsStatusCodes.SUCCESS: + ApplicationLoader.getLocationServiceProvider().checkLocationSettings(locationRequest, status -> { + switch (status) { + case ILocationServiceProvider.STATUS_SUCCESS: startFusedLocationRequest(true); break; - case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: + case ILocationServiceProvider.STATUS_RESOLUTION_REQUIRED: Utilities.stageQueue.postRunnable(() -> { if (lookingForPeopleNearby || !sharingLocations.isEmpty()) { AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.needShowPlayServicesAlert, status)); } }); break; - case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: + case ILocationServiceProvider.STATUS_SETTINGS_CHANGE_UNAVAILABLE: Utilities.stageQueue.postRunnable(() -> { - playServicesAvailable = false; + servicesAvailable = false; try { - googleApiClient.disconnect(); + apiClient.disconnect(); start(); - } catch (Throwable ignore) { - - } + } catch (Throwable ignore) {} }); break; } @@ -327,13 +310,13 @@ public class LocationController extends BaseController implements NotificationCe public void startFusedLocationRequest(boolean permissionsGranted) { Utilities.stageQueue.postRunnable(() -> { if (!permissionsGranted) { - playServicesAvailable = false; + servicesAvailable = false; } if (shareMyCurrentLocation || lookingForPeopleNearby || !sharingLocations.isEmpty()) { if (permissionsGranted) { try { - setLastKnownLocation(LocationServices.FusedLocationApi.getLastLocation(googleApiClient)); - LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, fusedLocationListener); + ApplicationLoader.getLocationServiceProvider().getLastLocation(this::setLastKnownLocation); + ApplicationLoader.getLocationServiceProvider().requestLocationUpdates(locationRequest, fusedLocationListener); } catch (Throwable e) { FileLog.e(e); } @@ -350,24 +333,22 @@ public class LocationController extends BaseController implements NotificationCe } @Override - public void onConnectionFailed(ConnectionResult connectionResult) { + public void onConnectionFailed() { if (wasConnectedToPlayServices) { return; } - playServicesAvailable = false; + servicesAvailable = false; if (started) { started = false; start(); } } - private boolean checkPlayServices() { - if (playServicesAvailable == null) { - GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); - int resultCode = apiAvailability.isGooglePlayServicesAvailable(ApplicationLoader.applicationContext); - playServicesAvailable = resultCode == ConnectionResult.SUCCESS; + private boolean checkServices() { + if (servicesAvailable == null) { + servicesAvailable = ApplicationLoader.getLocationServiceProvider().checkServices(); } - return playServicesAvailable; + return servicesAvailable; } private void broadcastLastKnownLocation(boolean cancelCurrent) { @@ -519,9 +500,9 @@ public class LocationController extends BaseController implements NotificationCe } if (started) { long newTime = SystemClock.elapsedRealtime(); - if (lastLocationByGoogleMaps || Math.abs(lastLocationStartTime - newTime) > LOCATION_ACQUIRE_TIME || shouldSendLocationNow()) { - lastLocationByGoogleMaps = false; - locationSentSinceLastGoogleMapUpdate = true; + if (lastLocationByMaps || Math.abs(lastLocationStartTime - newTime) > LOCATION_ACQUIRE_TIME || shouldSendLocationNow()) { + lastLocationByMaps = false; + locationSentSinceLastMapUpdate = true; boolean cancelAll = (SystemClock.elapsedRealtime() - lastLocationSendTime) > 2 * 1000; lastLocationStartTime = newTime; lastLocationSendTime = SystemClock.elapsedRealtime(); @@ -678,7 +659,7 @@ public class LocationController extends BaseController implements NotificationCe NativeByteBuffer data = cursor.byteBufferValue(4); if (data != null) { info.messageObject = new MessageObject(currentAccount, TLRPC.Message.TLdeserialize(data, data.readInt32(false), false), false, false); - MessagesStorage.addUsersAndChatsFromMessage(info.messageObject.messageOwner, usersToLoad, chatsToLoad); + MessagesStorage.addUsersAndChatsFromMessage(info.messageObject.messageOwner, usersToLoad, chatsToLoad, null); data.reuse(); } result.add(info); @@ -846,17 +827,17 @@ public class LocationController extends BaseController implements NotificationCe }); } - public void setGoogleMapLocation(Location location, boolean first) { + public void setMapLocation(Location location, boolean first) { if (location == null) { return; } - lastLocationByGoogleMaps = true; + lastLocationByMaps = true; if (first || lastKnownLocation != null && lastKnownLocation.distanceTo(location) >= 20) { lastLocationSendTime = SystemClock.elapsedRealtime() - BACKGROUD_UPDATE_TIME; - locationSentSinceLastGoogleMapUpdate = false; - } else if (locationSentSinceLastGoogleMapUpdate) { + locationSentSinceLastMapUpdate = false; + } else if (locationSentSinceLastMapUpdate) { lastLocationSendTime = SystemClock.elapsedRealtime() - BACKGROUD_UPDATE_TIME + FOREGROUND_UPDATE_TIME; - locationSentSinceLastGoogleMapUpdate = false; + locationSentSinceLastMapUpdate = false; } setLastKnownLocation(location); } @@ -868,9 +849,9 @@ public class LocationController extends BaseController implements NotificationCe lastLocationStartTime = SystemClock.elapsedRealtime(); started = true; boolean ok = false; - if (checkPlayServices()) { + if (checkServices()) { try { - googleApiClient.connect(); + apiClient.connect(); ok = true; } catch (Throwable e) { FileLog.e(e); @@ -910,10 +891,10 @@ public class LocationController extends BaseController implements NotificationCe return; } started = false; - if (checkPlayServices()) { + if (checkServices()) { try { - LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, fusedLocationListener); - googleApiClient.disconnect(); + ApplicationLoader.getLocationServiceProvider().removeLocationUpdates(fusedLocationListener); + apiClient.disconnect(); } catch (Throwable e) { FileLog.e(e, false); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LruCache.java b/TMessagesProj/src/main/java/org/telegram/messenger/LruCache.java index 9c761cc5b..c2b85ef98 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LruCache.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LruCache.java @@ -12,6 +12,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; /** * Static library version of {@link android.util.LruCache}. Used to write apps @@ -255,4 +257,8 @@ public class LruCache { public synchronized final int maxSize() { return maxSize; } + + public synchronized final Set> entrySet() { + return map.entrySet(); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index 751d9cfda..6e1285a94 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -3348,7 +3348,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, stopProgressTimer(); try { if (audioPlayer != null) { - if (!playingMessageObject.isVoice() && (playingMessageObject.getDuration() * (1f - playingMessageObject.audioProgress) > 1000)) { + if (!playingMessageObject.isVoice() && (playingMessageObject.getDuration() * (1f - playingMessageObject.audioProgress) > 1)) { if (audioVolumeAnimator != null) { audioVolumeAnimator.removeAllUpdateListeners(); audioVolumeAnimator.cancel(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java index 0d605ead8..739332266 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java @@ -57,6 +57,8 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.EmojiThemes; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.ChatThemeBottomSheet; @@ -77,6 +79,7 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; @@ -108,6 +111,7 @@ public class MediaDataController extends BaseController { } } + public static MediaDataController getInstance(int num) { MediaDataController localInstance = Instance[num]; if (localInstance == null) { @@ -177,6 +181,9 @@ public class MediaDataController extends BaseController { public static final int TYPE_FAVE = 2; public static final int TYPE_FEATURED = 3; public static final int TYPE_EMOJI = 4; + public static final int TYPE_EMOJIPACKS = 5; + public static final int TYPE_FEATURED_EMOJIPACKS = 6; + public static final int TYPE_PREMIUM_STICKERS = 7; public static final int TYPE_GREETINGS = 3; @@ -197,48 +204,61 @@ public class MediaDataController extends BaseController { private boolean isLoadingPremiumPromo; private int premiumPromoUpdateDate; - private ArrayList[] stickerSets = new ArrayList[]{new ArrayList<>(), new ArrayList<>(), new ArrayList<>(0), new ArrayList<>(), new ArrayList<>()}; - private LongSparseArray[] stickersByIds = new LongSparseArray[]{new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>()}; + private ArrayList[] stickerSets = new ArrayList[]{new ArrayList<>(), new ArrayList<>(), new ArrayList<>(0), new ArrayList<>(), new ArrayList<>(), new ArrayList<>()}; + private LongSparseArray[] stickersByIds = new LongSparseArray[]{new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>(), new LongSparseArray<>()}; private LongSparseArray stickerSetsById = new LongSparseArray<>(); private LongSparseArray installedStickerSetsById = new LongSparseArray<>(); + private ArrayList installedForceStickerSetsById = new ArrayList<>(); + private ArrayList uninstalledForceStickerSetsById = new ArrayList<>(); private LongSparseArray groupStickerSets = new LongSparseArray<>(); private ConcurrentHashMap stickerSetsByName = new ConcurrentHashMap<>(100, 1.0f, 1); private HashMap diceStickerSetsByEmoji = new HashMap<>(); private LongSparseArray diceEmojiStickerSetsById = new LongSparseArray<>(); private HashSet loadingDiceStickerSets = new HashSet<>(); private LongSparseArray removingStickerSetsUndos = new LongSparseArray<>(); - private Runnable[] scheduledLoadStickers = new Runnable[5]; - private boolean[] loadingStickers = new boolean[5]; - private boolean[] stickersLoaded = new boolean[5]; - private long[] loadHash = new long[5]; - private int[] loadDate = new int[5]; + private Runnable[] scheduledLoadStickers = new Runnable[7]; + private boolean[] loadingStickers = new boolean[7]; + private boolean[] stickersLoaded = new boolean[7]; + private long[] loadHash = new long[7]; + private int[] loadDate = new int[7]; public HashMap ringtoneUploaderHashMap = new HashMap<>(); private HashMap> verifyingMessages = new HashMap<>(); - private int[] archivedStickersCount = new int[2]; + private int[] archivedStickersCount = new int[7]; private LongSparseArray stickersByEmoji = new LongSparseArray<>(); private HashMap> allStickers = new HashMap<>(); private HashMap> allStickersFeatured = new HashMap<>(); - private ArrayList[] recentStickers = new ArrayList[]{new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>()}; - private boolean[] loadingRecentStickers = new boolean[4]; - private boolean[] recentStickersLoaded = new boolean[4]; + private ArrayList[] recentStickers = new ArrayList[]{ + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>() + }; + private boolean[] loadingRecentStickers = new boolean[8]; + private boolean[] recentStickersLoaded = new boolean[8]; private ArrayList recentGifs = new ArrayList<>(); private boolean loadingRecentGifs; private boolean recentGifsLoaded; - private long loadFeaturedHash; - private int loadFeaturedDate; + private boolean loadingPremiumGiftStickers; + + private long loadFeaturedHash[] = new long[2]; + private int loadFeaturedDate[] = new int[2]; public boolean loadFeaturedPremium; - private ArrayList featuredStickerSets = new ArrayList<>(); - private LongSparseArray featuredStickerSetsById = new LongSparseArray<>(); - private ArrayList unreadStickerSets = new ArrayList<>(); - private ArrayList readingStickerSets = new ArrayList<>(); - private boolean loadingFeaturedStickers; - private boolean featuredStickersLoaded; + private ArrayList[] featuredStickerSets = new ArrayList[] { new ArrayList<>(), new ArrayList<>() }; + private LongSparseArray[] featuredStickerSetsById = new LongSparseArray[] { new LongSparseArray<>(), new LongSparseArray<>() }; + private ArrayList unreadStickerSets[] = new ArrayList[] { new ArrayList(), new ArrayList() }; + private ArrayList readingStickerSets[] = new ArrayList[] { new ArrayList(), new ArrayList() }; + private boolean loadingFeaturedStickers[] = new boolean[2]; + private boolean featuredStickersLoaded[] = new boolean[2]; private TLRPC.Document greetingsSticker; public final RingtoneDataStore ringtoneDataStore; @@ -249,7 +269,9 @@ public class MediaDataController extends BaseController { public void cleanup() { for (int a = 0; a < recentStickers.length; a++) { - recentStickers[a].clear(); + if (recentStickers[a] != null) { + recentStickers[a].clear(); + } loadingRecentStickers[a] = false; recentStickersLoaded[a] = false; } @@ -261,14 +283,19 @@ public class MediaDataController extends BaseController { stickersLoaded[a] = false; } loadingPinnedMessages.clear(); - loadFeaturedDate = 0; - loadFeaturedHash = 0; + loadFeaturedDate[0] = 0; + loadFeaturedHash[0] = 0; + loadFeaturedDate[1] = 0; + loadFeaturedHash[1] = 0; allStickers.clear(); allStickersFeatured.clear(); stickersByEmoji.clear(); - featuredStickerSetsById.clear(); - featuredStickerSets.clear(); - unreadStickerSets.clear(); + featuredStickerSetsById[0].clear(); + featuredStickerSets[0].clear(); + featuredStickerSetsById[1].clear(); + featuredStickerSets[1].clear(); + unreadStickerSets[0].clear(); + unreadStickerSets[1].clear(); recentGifs.clear(); stickerSetsById.clear(); installedStickerSetsById.clear(); @@ -276,8 +303,10 @@ public class MediaDataController extends BaseController { diceStickerSetsByEmoji.clear(); diceEmojiStickerSetsById.clear(); loadingDiceStickerSets.clear(); - loadingFeaturedStickers = false; - featuredStickersLoaded = false; + loadingFeaturedStickers[0] = false; + featuredStickersLoaded[0] = false; + loadingFeaturedStickers[1] = false; + featuredStickersLoaded[1] = false; loadingRecentGifs = false; recentGifsLoaded = false; @@ -311,6 +340,10 @@ public class MediaDataController extends BaseController { botKeyboardsByMids.clear(); } + public boolean areStickersLoaded(int type) { + return stickersLoaded[type]; + } + public void checkStickers(int type) { if (!loadingStickers[type] && (!stickersLoaded[type] || Math.abs(System.currentTimeMillis() / 1000 - loadDate[type]) >= 60 * 60)) { loadStickers(type, true, false); @@ -585,25 +618,7 @@ public class MediaDataController extends BaseController { reactionsUpdateDate = date; if (reactions != null) { AndroidUtilities.runOnUIThread(() -> { - for (int i = 0; i < reactions.size(); i++) { - ImageReceiver imageReceiver = new ImageReceiver(); - TLRPC.TL_availableReaction reaction = reactions.get(i); - imageReceiver.setImage(ImageLocation.getForDocument(reaction.activate_animation), null, null, null, 0, FileLoader.PRELOAD_CACHE_TYPE); - ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver); - - imageReceiver = new ImageReceiver(); - imageReceiver.setImage(ImageLocation.getForDocument(reaction.appear_animation), "60_60_nolimit", null, null, 0, FileLoader.PRELOAD_CACHE_TYPE); - ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver); - - int size = ReactionsEffectOverlay.sizeForBigReaction(); - imageReceiver = new ImageReceiver(); - imageReceiver.setImage(ImageLocation.getForDocument(reaction.around_animation), size + "_" + size, null, null, 0, FileLoader.PRELOAD_CACHE_TYPE); - ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver); - - imageReceiver = new ImageReceiver(); - imageReceiver.setImage(ImageLocation.getForDocument(reaction.center_icon), null, null, null, 0, FileLoader.PRELOAD_CACHE_TYPE); - ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver); - } + preloadReactions(); NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.reactionsDidLoad); }); } @@ -616,6 +631,32 @@ public class MediaDataController extends BaseController { } } + public void preloadReactions() { + if (reactionsList == null) { + return; + } + for (int i = 0; i < reactionsList.size(); i++) { + TLRPC.TL_availableReaction reaction = reactionsList.get(i); + int size = ReactionsEffectOverlay.sizeForBigReaction(); + preloadImage(ImageLocation.getForDocument(reaction.effect_animation), size + "_" + size + "_pcache"); + preloadImage(ImageLocation.getForDocument(reaction.activate_animation), null); + preloadImage(ImageLocation.getForDocument(reaction.appear_animation), "60_60_nolimit"); + + size = ReactionsEffectOverlay.sizeForAroundReaction(); + preloadImage(ImageLocation.getForDocument(reaction.around_animation), size + "_" + size + "_pcache"); + preloadImage(ImageLocation.getForDocument(reaction.center_icon), null); + } + } + + private void preloadImage(ImageLocation location, String filter) { + ImageReceiver imageReceiver = new ImageReceiver(); + imageReceiver.setDelegate((imageReceiver1, set, thumb, memCache) -> imageReceiver1.clearImage()); + //imageReceiver.setFileLoadingPriority(FileLoader.PRIORITY_LOW); + + imageReceiver.setImage(location, filter, null, null, 0, FileLoader.PRELOAD_CACHE_TYPE); + ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver); + } + private void putReactionsToCache(List reactions, int hash, int date) { ArrayList reactionsFinal = reactions != null ? new ArrayList<>(reactions) : null; getMessagesStorage().getStorageQueue().postRunnable(() -> { @@ -653,13 +694,22 @@ public class MediaDataController extends BaseController { } public void checkFeaturedStickers() { - if (!loadingFeaturedStickers && (!featuredStickersLoaded || Math.abs(System.currentTimeMillis() / 1000 - loadFeaturedDate) >= 60 * 60)) { - loadFeaturedStickers(true, false); + if (!loadingFeaturedStickers[0] && (!featuredStickersLoaded[0] || Math.abs(System.currentTimeMillis() / 1000 - loadFeaturedDate[0]) >= 60 * 60)) { + loadFeaturedStickers(false,true, false); + } + } + + public void checkFeaturedEmoji() { + if (!loadingFeaturedStickers[1] && (!featuredStickersLoaded[1] || Math.abs(System.currentTimeMillis() / 1000 - loadFeaturedDate[1]) >= 60 * 60)) { + loadFeaturedStickers(true,true, false); } } public ArrayList getRecentStickers(int type) { 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))); } @@ -770,6 +820,8 @@ public class MediaDataController extends BaseController { cacheType = 3; } else if (type == TYPE_MASK) { cacheType = 4; + } else if (type == TYPE_EMOJIPACKS) { + cacheType = 7; } else { cacheType = 5; } @@ -929,7 +981,12 @@ public class MediaDataController extends BaseController { if (isGroupSet) { putSetToCache(existingSet); } else { - int type = set.set.masks ? TYPE_MASK : TYPE_IMAGE; + int type = TYPE_IMAGE; + if (set.set.masks) { + type = TYPE_MASK; + } else if (set.set.emojis) { + type = TYPE_EMOJIPACKS; + } putStickersToCache(type, stickerSets[type], loadDate[type], loadHash[type]); if ("AnimatedEmojies".equals(set.set.short_name)) { type = TYPE_EMOJI; @@ -968,6 +1025,43 @@ public class MediaDataController extends BaseController { groupStickerSets.put(stickerSet.set.id, stickerSet); } + public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputStickerSet, boolean cacheOnly) { + return getStickerSet(inputStickerSet, cacheOnly, null); + } + public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputStickerSet, boolean cacheOnly, Runnable onNotFound) { + if (inputStickerSet == null) { + return null; + } + if (inputStickerSet instanceof TLRPC.TL_inputStickerSetID && stickerSetsById.containsKey(inputStickerSet.id)) { + return stickerSetsById.get(inputStickerSet.id); + } else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetShortName && inputStickerSet.short_name != null && stickerSetsByName.containsKey(inputStickerSet.short_name.toLowerCase())) { + return stickerSetsByName.get(inputStickerSet.short_name.toLowerCase()); + } + if (cacheOnly) { + return null; + } + TLRPC.TL_messages_getStickerSet req = new TLRPC.TL_messages_getStickerSet(); + req.stickerset = inputStickerSet; + getConnectionsManager().sendRequest(req, (response, error) -> { + if (response != null) { + TLRPC.TL_messages_stickerSet set = (TLRPC.TL_messages_stickerSet) response; + AndroidUtilities.runOnUIThread(() -> { + if (set == null || set.set == null) { + return; + } + stickerSetsById.put(set.set.id, set); + stickerSetsByName.put(set.set.short_name.toLowerCase(), set); + getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set); + }); + } else { + if (onNotFound != null) { + onNotFound.run(); + } + } + }); + return null; + } + private void loadGroupStickerSet(TLRPC.StickerSet stickerSet, boolean cache) { if (cache) { getMessagesStorage().getStorageQueue().postRunnable(() -> { @@ -992,7 +1086,7 @@ public class MediaDataController extends BaseController { if (set != null && set.set != null) { AndroidUtilities.runOnUIThread(() -> { groupStickerSets.put(set.set.id, set); - getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id); + getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set); }); } } catch (Throwable e) { @@ -1009,7 +1103,7 @@ public class MediaDataController extends BaseController { TLRPC.TL_messages_stickerSet set = (TLRPC.TL_messages_stickerSet) response; AndroidUtilities.runOnUIThread(() -> { groupStickerSets.put(set.set.id, set); - getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id); + getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set); }); } }); @@ -1087,20 +1181,28 @@ public class MediaDataController extends BaseController { } public ArrayList getFeaturedStickerSets() { - return featuredStickerSets; + return featuredStickerSets[0]; + } + + public ArrayList getFeaturedEmojiSets() { + return featuredStickerSets[1]; } public ArrayList getUnreadStickerSets() { - return unreadStickerSets; + return unreadStickerSets[0]; } - public boolean areAllTrendingStickerSetsUnread() { - for (int a = 0, N = featuredStickerSets.size(); a < N; a++) { - TLRPC.StickerSetCovered pack = featuredStickerSets.get(a); + public ArrayList getUnreadEmojiSets() { + return unreadStickerSets[1]; + } + + public boolean areAllTrendingStickerSetsUnread(boolean emoji) { + for (int a = 0, N = featuredStickerSets[emoji ? 1 : 0].size(); a < N; a++) { + TLRPC.StickerSetCovered pack = featuredStickerSets[emoji ? 1 : 0].get(a); if (isStickerPackInstalled(pack.set.id) || pack.covers.isEmpty() && pack.cover == null) { continue; } - if (!unreadStickerSets.contains(pack.set.id)) { + if (!unreadStickerSets[emoji ? 1 : 0].contains(pack.set.id)) { return false; } } @@ -1108,11 +1210,15 @@ public class MediaDataController extends BaseController { } public boolean isStickerPackInstalled(long id) { - return installedStickerSetsById.indexOfKey(id) >= 0; + return isStickerPackInstalled(id, true); } - public boolean isStickerPackUnread(long id) { - return unreadStickerSets.contains(id); + public boolean isStickerPackInstalled(long id, boolean countForced) { + return (installedStickerSetsById.indexOfKey(id) >= 0 || countForced && installedForceStickerSetsById.contains(id)) && (!countForced || !uninstalledForceStickerSetsById.contains(id)); + } + + public boolean isStickerPackUnread(boolean emoji, long id) { + return unreadStickerSets[emoji ? 1 : 0].contains(id); } public boolean isStickerPackInstalled(String name) { @@ -1231,6 +1337,10 @@ public class MediaDataController extends BaseController { cacheType = 4; } else if (type == TYPE_GREETINGS) { cacheType = 6; + } else if (type == TYPE_EMOJIPACKS) { + cacheType = 7; + } else if (type == TYPE_PREMIUM_STICKERS) { + cacheType = 8; } else { cacheType = 5; } @@ -1281,6 +1391,10 @@ public class MediaDataController extends BaseController { lastLoadTime = preferences.getLong("lastStickersLoadTimeMask", 0); } else if (type == TYPE_GREETINGS) { lastLoadTime = preferences.getLong("lastStickersLoadTimeGreet", 0); + } else if (type == TYPE_EMOJIPACKS) { + lastLoadTime = preferences.getLong("lastStickersLoadTimeEmojiPacks", 0); + } else if (type == TYPE_PREMIUM_STICKERS) { + lastLoadTime = preferences.getLong("lastStickersLoadTimePremiumStickers", 0); } else { lastLoadTime = preferences.getLong("lastStickersLoadTimeFavs", 0); } @@ -1315,6 +1429,11 @@ public class MediaDataController extends BaseController { req.emoticon = "\uD83D\uDC4B" + Emoji.fixEmoji("⭐"); req.hash = calcDocumentsHash(recentStickers[type]); request = req; + } else if (type == TYPE_PREMIUM_STICKERS) { + TLRPC.TL_messages_getStickers req = new TLRPC.TL_messages_getStickers(); + req.emoticon = "\uD83D\uDCC2" + Emoji.fixEmoji("⭐"); + req.hash = calcDocumentsHash(recentStickers[type]); + request = req; } else { TLRPC.TL_messages_getRecentStickers req = new TLRPC.TL_messages_getRecentStickers(); req.hash = calcDocumentsHash(recentStickers[type]); @@ -1323,7 +1442,7 @@ public class MediaDataController extends BaseController { } getConnectionsManager().sendRequest(request, (response, error) -> { ArrayList arrayList = null; - if (type == TYPE_GREETINGS) { + if (type == TYPE_GREETINGS || type == TYPE_PREMIUM_STICKERS) { if (response instanceof TLRPC.TL_messages_stickers) { TLRPC.TL_messages_stickers res = (TLRPC.TL_messages_stickers) response; arrayList = res.stickers; @@ -1368,7 +1487,7 @@ public class MediaDataController extends BaseController { if (gif) { maxCount = getMessagesController().maxRecentGifsCount; } else { - if (type == TYPE_GREETINGS) { + if (type == TYPE_GREETINGS || type == TYPE_PREMIUM_STICKERS) { maxCount = 200; } else if (type == TYPE_FAVE) { maxCount = getMessagesController().maxFaveStickersCount; @@ -1389,6 +1508,10 @@ public class MediaDataController extends BaseController { cacheType = 4; } else if (type == TYPE_GREETINGS) { cacheType = 6; + } else if (type == TYPE_EMOJIPACKS) { + cacheType = 7; + } else if (type == TYPE_PREMIUM_STICKERS) { + cacheType = 8; } else { cacheType = 5; } @@ -1446,9 +1569,14 @@ public class MediaDataController extends BaseController { editor.putLong("lastStickersLoadTimeMask", System.currentTimeMillis()).commit(); } else if (type == TYPE_GREETINGS) { editor.putLong("lastStickersLoadTimeGreet", System.currentTimeMillis()).commit(); + } else if (type == TYPE_EMOJIPACKS){ + editor.putLong("lastStickersLoadTimeEmojiPacks", System.currentTimeMillis()).commit(); + } else if (type == TYPE_PREMIUM_STICKERS){ + editor.putLong("lastStickersLoadTimePremiumStickers", System.currentTimeMillis()).commit(); } else { editor.putLong("lastStickersLoadTimeFavs", System.currentTimeMillis()).commit(); } + } if (documents != null) { if (gif) { @@ -1496,7 +1624,12 @@ public class MediaDataController extends BaseController { if (stickerSetsById.indexOfKey(set.set.id) >= 0 || stickerSetsByName.containsKey(set.set.short_name)) { return; } - int type = set.set.masks ? TYPE_MASK : TYPE_IMAGE; + int type = TYPE_IMAGE; + if (set.set.masks) { + type = TYPE_MASK; + } else if (set.set.emojis) { + type = TYPE_EMOJIPACKS; + } stickerSets[type].add(0, set); stickerSetsById.put(set.set.id, set); installedStickerSetsById.put(set.set.id, set); @@ -1530,11 +1663,11 @@ public class MediaDataController extends BaseController { loadStickers(type, false, true); } - public void loadFeaturedStickers(boolean cache, boolean force) { - if (loadingFeaturedStickers) { + public void loadFeaturedStickers(boolean emoji, boolean cache, boolean force) { + if (loadingFeaturedStickers[emoji ? 1 : 0]) { return; } - loadingFeaturedStickers = true; + loadingFeaturedStickers[emoji ? 1 : 0] = true; if (cache) { getMessagesStorage().getStorageQueue().postRunnable(() -> { ArrayList newStickerArray = null; @@ -1544,7 +1677,7 @@ public class MediaDataController extends BaseController { boolean premium = false; SQLiteCursor cursor = null; try { - cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, unread, date, hash, premium FROM stickers_featured WHERE 1"); + cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, unread, date, hash, premium FROM stickers_featured WHERE emoji = " + (emoji ? 1 : 0)); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -1565,7 +1698,7 @@ public class MediaDataController extends BaseController { data.reuse(); } date = cursor.intValue(2); - hash = calcFeaturedStickersHash(newStickerArray); + hash = calcFeaturedStickersHash(emoji, newStickerArray); premium = cursor.intValue(4) == 1; } } catch (Throwable e) { @@ -1575,34 +1708,43 @@ public class MediaDataController extends BaseController { cursor.dispose(); } } - processLoadedFeaturedStickers(newStickerArray, unread, premium, true, date, hash); + processLoadedFeaturedStickers(emoji, newStickerArray, unread, premium, true, date, hash); }); } else { - TLRPC.TL_messages_getFeaturedStickers req = new TLRPC.TL_messages_getFeaturedStickers(); - req.hash = force ? 0 : loadFeaturedHash; + final long hash; + TLObject req; + if (emoji) { + TLRPC.TL_messages_getFeaturedEmojiStickers request = new TLRPC.TL_messages_getFeaturedEmojiStickers(); + request.hash = hash = force ? 0 : loadFeaturedHash[1]; + req = request; + } else { + TLRPC.TL_messages_getFeaturedStickers request = new TLRPC.TL_messages_getFeaturedStickers(); + request.hash = hash = force ? 0 : loadFeaturedHash[0]; + req = request; + } getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (response instanceof TLRPC.TL_messages_featuredStickers) { TLRPC.TL_messages_featuredStickers res = (TLRPC.TL_messages_featuredStickers) response; - processLoadedFeaturedStickers(res.sets, res.unread, res.premium,false, (int) (System.currentTimeMillis() / 1000), res.hash); + processLoadedFeaturedStickers(emoji, res.sets, res.unread, res.premium,false, (int) (System.currentTimeMillis() / 1000), res.hash); } else { - processLoadedFeaturedStickers(null, null, false, false, (int) (System.currentTimeMillis() / 1000), req.hash); + processLoadedFeaturedStickers(emoji, null, null, false, false, (int) (System.currentTimeMillis() / 1000), hash); } })); } } - private void processLoadedFeaturedStickers(ArrayList res, ArrayList unreadStickers, boolean premium, boolean cache, int date, long hash) { + private void processLoadedFeaturedStickers(boolean emoji, ArrayList res, ArrayList unreadStickers, boolean premium, boolean cache, int date, long hash) { AndroidUtilities.runOnUIThread(() -> { - loadingFeaturedStickers = false; - featuredStickersLoaded = true; + loadingFeaturedStickers[emoji ? 1 : 0] = false; + featuredStickersLoaded[emoji ? 1 : 0] = true; }); Utilities.stageQueue.postRunnable(() -> { if (cache && (res == null || Math.abs(System.currentTimeMillis() / 1000 - date) >= 60 * 60) || !cache && res == null && hash == 0) { AndroidUtilities.runOnUIThread(() -> { if (res != null && hash != 0) { - loadFeaturedHash = hash; + loadFeaturedHash[emoji ? 1 : 0] = hash; } - loadFeaturedStickers(false, false); + loadFeaturedStickers(emoji, false, false); }, res == null && !cache ? 1000 : 0); if (res == null) { return; @@ -1620,34 +1762,34 @@ public class MediaDataController extends BaseController { } if (!cache) { - putFeaturedStickersToCache(stickerSetsNew, unreadStickers, date, hash, premium); + putFeaturedStickersToCache(emoji, stickerSetsNew, unreadStickers, date, hash, premium); } AndroidUtilities.runOnUIThread(() -> { - unreadStickerSets = unreadStickers; - featuredStickerSetsById = stickerSetsByIdNew; - featuredStickerSets = stickerSetsNew; - loadFeaturedHash = hash; - loadFeaturedDate = date; + unreadStickerSets[emoji ? 1 : 0] = unreadStickers; + featuredStickerSetsById[emoji ? 1 : 0] = stickerSetsByIdNew; + featuredStickerSets[emoji ? 1 : 0] = stickerSetsNew; + loadFeaturedHash[emoji ? 1 : 0] = hash; + loadFeaturedDate[emoji ? 1 : 0] = date; loadFeaturedPremium = premium; - loadStickers(TYPE_FEATURED, true, false); - getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad); + loadStickers(emoji ? TYPE_FEATURED_EMOJIPACKS : TYPE_FEATURED, true, false); + getNotificationCenter().postNotificationName(emoji ? NotificationCenter.featuredEmojiDidLoad : NotificationCenter.featuredStickersDidLoad); }); } catch (Throwable e) { FileLog.e(e); } } else { - AndroidUtilities.runOnUIThread(() -> loadFeaturedDate = date); - putFeaturedStickersToCache(null, null, date, 0, premium); + AndroidUtilities.runOnUIThread(() -> loadFeaturedDate[emoji ? 1 : 0] = date); + putFeaturedStickersToCache(emoji, null, null, date, 0, premium); } }); } - private void putFeaturedStickersToCache(ArrayList stickers, ArrayList unreadStickers, int date, long hash, boolean premium) { + private void putFeaturedStickersToCache(boolean emoji, ArrayList stickers, ArrayList unreadStickers, int date, long hash, boolean premium) { ArrayList stickersFinal = stickers != null ? new ArrayList<>(stickers) : null; getMessagesStorage().getStorageQueue().postRunnable(() -> { try { if (stickersFinal != null) { - SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("REPLACE INTO stickers_featured VALUES(?, ?, ?, ?, ?, ?)"); + SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("REPLACE INTO stickers_featured VALUES(?, ?, ?, ?, ?, ?, ?)"); state.requery(); int size = 4; for (int a = 0; a < stickersFinal.size(); a++) { @@ -1669,6 +1811,7 @@ public class MediaDataController extends BaseController { state.bindInteger(4, date); state.bindLong(5, hash); state.bindInteger(6, premium ? 1 : 0); + state.bindInteger(7, emoji ? 1 : 0); state.step(); data.reuse(); data2.reuse(); @@ -1686,7 +1829,7 @@ public class MediaDataController extends BaseController { }); } - private long calcFeaturedStickersHash(ArrayList sets) { + private long calcFeaturedStickersHash(boolean emoji, ArrayList sets) { if (sets == null || sets.isEmpty()) { return 0; } @@ -1697,7 +1840,7 @@ public class MediaDataController extends BaseController { continue; } acc = calcHash(acc, set.id); - if (unreadStickerSets.contains(set.id)) { + if (unreadStickerSets[emoji ? 1 : 0].contains(set.id)) { acc = calcHash(acc, 1); } } @@ -1711,14 +1854,14 @@ public class MediaDataController extends BaseController { return hash + id; } - public void markFaturedStickersAsRead(boolean query) { - if (unreadStickerSets.isEmpty()) { + public void markFeaturedStickersAsRead(boolean emoji, boolean query) { + if (unreadStickerSets[emoji ? 1 : 0].isEmpty()) { return; } - unreadStickerSets.clear(); - loadFeaturedHash = calcFeaturedStickersHash(featuredStickerSets); - getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad); - putFeaturedStickersToCache(featuredStickerSets, unreadStickerSets, loadFeaturedDate, loadFeaturedHash, loadFeaturedPremium); + unreadStickerSets[emoji ? 1 : 0].clear(); + loadFeaturedHash[emoji ? 1 : 0] = calcFeaturedStickersHash(emoji, featuredStickerSets[emoji ? 1 : 0]); + getNotificationCenter().postNotificationName(emoji ? NotificationCenter.featuredEmojiDidLoad : NotificationCenter.featuredStickersDidLoad); + putFeaturedStickersToCache(emoji, featuredStickerSets[emoji ? 1 : 0], unreadStickerSets[emoji ? 1 : 0], loadFeaturedDate[emoji ? 1 : 0], loadFeaturedHash[emoji ? 1 : 0], loadFeaturedPremium); if (query) { TLRPC.TL_messages_readFeaturedStickers req = new TLRPC.TL_messages_readFeaturedStickers(); getConnectionsManager().sendRequest(req, (response, error) -> { @@ -1727,10 +1870,10 @@ public class MediaDataController extends BaseController { } } - public long getFeaturesStickersHashWithoutUnread() { + public long getFeaturedStickersHashWithoutUnread(boolean emoji) { long acc = 0; - for (int a = 0; a < featuredStickerSets.size(); a++) { - TLRPC.StickerSet set = featuredStickerSets.get(a).set; + for (int a = 0; a < featuredStickerSets[emoji ? 1 : 0].size(); a++) { + TLRPC.StickerSet set = featuredStickerSets[emoji ? 1 : 0].get(a).set; if (set.archived) { continue; } @@ -1739,22 +1882,22 @@ public class MediaDataController extends BaseController { return acc; } - public void markFaturedStickersByIdAsRead(long id) { - if (!unreadStickerSets.contains(id) || readingStickerSets.contains(id)) { + public void markFeaturedStickersByIdAsRead(boolean emoji, long id) { + if (!unreadStickerSets[emoji ? 1 : 0].contains(id) || readingStickerSets[emoji ? 1 : 0].contains(id)) { return; } - readingStickerSets.add(id); + readingStickerSets[emoji ? 1 : 0].add(id); TLRPC.TL_messages_readFeaturedStickers req = new TLRPC.TL_messages_readFeaturedStickers(); req.id.add(id); getConnectionsManager().sendRequest(req, (response, error) -> { }); AndroidUtilities.runOnUIThread(() -> { - unreadStickerSets.remove(id); - readingStickerSets.remove(id); - loadFeaturedHash = calcFeaturedStickersHash(featuredStickerSets); - getNotificationCenter().postNotificationName(NotificationCenter.featuredStickersDidLoad); - putFeaturedStickersToCache(featuredStickerSets, unreadStickerSets, loadFeaturedDate, loadFeaturedHash, loadFeaturedPremium); + unreadStickerSets[emoji ? 1 : 0].remove(id); + readingStickerSets[emoji ? 1 : 0].remove(id); + loadFeaturedHash[emoji ? 1 : 0] = calcFeaturedStickersHash(emoji, featuredStickerSets[emoji ? 1 : 0]); + getNotificationCenter().postNotificationName(emoji ? NotificationCenter.featuredEmojiDidLoad : NotificationCenter.featuredStickersDidLoad); + putFeaturedStickersToCache(emoji, featuredStickerSets[emoji ? 1 : 0], unreadStickerSets[emoji ? 1 : 0], loadFeaturedDate[emoji ? 1 : 0], loadFeaturedHash[emoji ? 1 : 0], loadFeaturedPremium); }, 1000); } @@ -1846,6 +1989,7 @@ public class MediaDataController extends BaseController { TLRPC.TL_messages_getArchivedStickers req = new TLRPC.TL_messages_getArchivedStickers(); req.limit = 0; req.masks = type == TYPE_MASK; + req.emojis = type == TYPE_EMOJIPACKS; int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { TLRPC.TL_messages_archivedStickers res = (TLRPC.TL_messages_archivedStickers) response; @@ -1859,9 +2003,13 @@ public class MediaDataController extends BaseController { } private void processLoadStickersResponse(int type, TLRPC.TL_messages_allStickers res) { + processLoadStickersResponse(type, res, null); + } + + private void processLoadStickersResponse(int type, TLRPC.TL_messages_allStickers res, Runnable onDone) { ArrayList newStickerArray = new ArrayList<>(); if (res.sets.isEmpty()) { - processLoadedStickers(type, newStickerArray, false, (int) (System.currentTimeMillis() / 1000), res.hash); + processLoadedStickers(type, newStickerArray, false, (int) (System.currentTimeMillis() / 1000), res.hash, onDone); } else { LongSparseArray newStickerSets = new LongSparseArray<>(); for (int a = 0; a < res.sets.size(); a++) { @@ -1904,9 +2052,44 @@ public class MediaDataController extends BaseController { } })); } + if (onDone != null) { + onDone.run(); + } } } + public void checkPremiumGiftStickers() { + if (getUserConfig().premiumGiftsStickerPack != null) { + String packName = getUserConfig().premiumGiftsStickerPack; + TLRPC.TL_messages_stickerSet set = getStickerSetByName(packName); + if (set == null) { + set = getStickerSetByEmojiOrName(packName); + } + if (set == null) { + MediaDataController.getInstance(currentAccount).loadStickersByEmojiOrName(packName, false, true); + } + } + if (loadingPremiumGiftStickers || System.currentTimeMillis() - getUserConfig().lastUpdatedPremiumGiftsStickerPack < 86400000) { + return; + } + loadingPremiumGiftStickers = true; + + TLRPC.TL_messages_getStickerSet req = new TLRPC.TL_messages_getStickerSet(); + req.stickerset = new TLRPC.TL_inputStickerSetPremiumGifts(); + getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + TLRPC.TL_messages_stickerSet stickerSet = (TLRPC.TL_messages_stickerSet) response; + getUserConfig().premiumGiftsStickerPack = stickerSet.set.short_name; + getUserConfig().lastUpdatedPremiumGiftsStickerPack = System.currentTimeMillis(); + getUserConfig().saveConfig(false); + + processLoadedDiceStickers(getUserConfig().premiumGiftsStickerPack, false, stickerSet, false, (int)(System.currentTimeMillis() / 1000)); + + getNotificationCenter().postNotificationName(NotificationCenter.didUpdatePremiumGiftStickers); + } + })); + } + public void loadStickersByEmojiOrName(String name, boolean isEmoji, boolean cache) { if (loadingDiceStickerSets.contains(name) || isEmoji && diceStickerSetsByEmoji.get(name) != null) { return; @@ -1938,7 +2121,9 @@ public class MediaDataController extends BaseController { }); } else { TLRPC.TL_messages_getStickerSet req = new TLRPC.TL_messages_getStickerSet(); - if (isEmoji) { + if (Objects.equals(getUserConfig().premiumGiftsStickerPack, name)) { + req.stickerset = new TLRPC.TL_inputStickerSetPremiumGifts(); + } else if (isEmoji) { TLRPC.TL_inputStickerSetDice inputStickerSetDice = new TLRPC.TL_inputStickerSetDice(); inputStickerSetDice.emoticon = name; req.stickerset = inputStickerSetDice; @@ -2014,19 +2199,57 @@ public class MediaDataController extends BaseController { }); } + public void markSetInstalling(long id, boolean installing) { + uninstalledForceStickerSetsById.remove(id); + if (installing && !installedForceStickerSetsById.contains(id)) { + installedForceStickerSetsById.add(id); + } + if (!installing) { + installedForceStickerSetsById.remove(id); + } + } + + public void markSetUninstalling(long id, boolean uninstalling) { + installedForceStickerSetsById.remove(id); + if (uninstalling && !uninstalledForceStickerSetsById.contains(id)) { + uninstalledForceStickerSetsById.add(id); + } + if (!uninstalling) { + uninstalledForceStickerSetsById.remove(id); + } + } + public void loadStickers(int type, boolean cache, boolean useHash) { - loadStickers(type, cache, useHash, false); + loadStickers(type, cache, useHash, false, null); } public void loadStickers(int type, boolean cache, boolean force, boolean scheduleIfLoading) { + loadStickers(type, cache, force, scheduleIfLoading, null); + } + + public void loadStickers(int type, boolean cache, boolean force, boolean scheduleIfLoading, Utilities.Callback> onFinish) { if (loadingStickers[type]) { if (scheduleIfLoading) { - scheduledLoadStickers[type] = () -> loadStickers(type, false, force, false); + scheduledLoadStickers[type] = () -> loadStickers(type, false, force, false, onFinish); + } else { + if (onFinish != null) { + onFinish.run(null); + } } return; } if (type == TYPE_FEATURED) { - if (featuredStickerSets.isEmpty() || !getMessagesController().preloadFeaturedStickers) { + if (featuredStickerSets[0].isEmpty() || !getMessagesController().preloadFeaturedStickers) { + if (onFinish != null) { + onFinish.run(null); + } + return; + } + } else if (type == TYPE_FEATURED_EMOJIPACKS) { + if (featuredStickerSets[1].isEmpty() || !getMessagesController().preloadFeaturedStickers) { + if (onFinish != null) { + onFinish.run(null); + } return; } } else if (type != TYPE_EMOJI) { @@ -2035,7 +2258,7 @@ public class MediaDataController extends BaseController { loadingStickers[type] = true; if (cache) { getMessagesStorage().getStorageQueue().postRunnable(() -> { - ArrayList newStickerArray = null; + ArrayList newStickerArray = new ArrayList<>(); int date = 0; long hash = 0; SQLiteCursor cursor = null; @@ -2044,7 +2267,6 @@ public class MediaDataController extends BaseController { if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { - newStickerArray = new ArrayList<>(); int count = data.readInt32(false); for (int a = 0; a < count; a++) { TLRPC.TL_messages_stickerSet stickerSet = TLRPC.TL_messages_stickerSet.TLdeserialize(data, data.readInt32(false), false); @@ -2062,16 +2284,25 @@ public class MediaDataController extends BaseController { cursor.dispose(); } } - processLoadedStickers(type, newStickerArray, true, date, hash); + processLoadedStickers(type, newStickerArray, true, date, hash, () -> { + if (onFinish != null) { + onFinish.run(newStickerArray); + } + }); }); } else { - if (type == TYPE_FEATURED) { + if (type == TYPE_FEATURED || type == TYPE_FEATURED_EMOJIPACKS) { + final boolean emoji = type == TYPE_FEATURED_EMOJIPACKS; TLRPC.TL_messages_allStickers response = new TLRPC.TL_messages_allStickers(); - response.hash = loadFeaturedHash; - for (int a = 0, size = featuredStickerSets.size(); a < size; a++) { - response.sets.add(featuredStickerSets.get(a).set); + response.hash = loadFeaturedHash[emoji ? 1 : 0]; + for (int a = 0, size = featuredStickerSets[emoji ? 1 : 0].size(); a < size; a++) { + response.sets.add(featuredStickerSets[emoji ? 1 : 0].get(a).set); } - processLoadStickersResponse(type, response); + processLoadStickersResponse(type, response, () -> { + if (onFinish != null) { + onFinish.run(null); + } + }); } else if (type == TYPE_EMOJI) { TLRPC.TL_messages_getStickerSet req = new TLRPC.TL_messages_getStickerSet(); req.stickerset = new TLRPC.TL_inputStickerSetAnimatedEmoji(); @@ -2079,9 +2310,17 @@ public class MediaDataController extends BaseController { if (response instanceof TLRPC.TL_messages_stickerSet) { ArrayList newStickerArray = new ArrayList<>(); newStickerArray.add((TLRPC.TL_messages_stickerSet) response); - processLoadedStickers(type, newStickerArray, false, (int) (System.currentTimeMillis() / 1000), calcStickersHash(newStickerArray)); + processLoadedStickers(type, newStickerArray, false, (int) (System.currentTimeMillis() / 1000), calcStickersHash(newStickerArray), () -> { + if (onFinish != null) { + onFinish.run(null); + } + }); } else { - processLoadedStickers(type, null, false, (int) (System.currentTimeMillis() / 1000), 0); + processLoadedStickers(type, null, false, (int) (System.currentTimeMillis() / 1000), 0, () -> { + if (onFinish != null) { + onFinish.run(null); + } + }); } }); } else { @@ -2090,15 +2329,26 @@ public class MediaDataController extends BaseController { if (type == TYPE_IMAGE) { req = new TLRPC.TL_messages_getAllStickers(); hash = ((TLRPC.TL_messages_getAllStickers) req).hash = force ? 0 : loadHash[type]; + } else if (type == TYPE_EMOJIPACKS) { + req = new TLRPC.TL_messages_getEmojiStickers(); + hash = ((TLRPC.TL_messages_getEmojiStickers) req).hash = force ? 0 : loadHash[type]; } else { req = new TLRPC.TL_messages_getMaskStickers(); hash = ((TLRPC.TL_messages_getMaskStickers) req).hash = force ? 0 : loadHash[type]; } getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (response instanceof TLRPC.TL_messages_allStickers) { - processLoadStickersResponse(type, (TLRPC.TL_messages_allStickers) response); + processLoadStickersResponse(type, (TLRPC.TL_messages_allStickers) response, () -> { + if (onFinish != null) { + onFinish.run(null); + } + }); } else { - processLoadedStickers(type, null, false, (int) (System.currentTimeMillis() / 1000), hash); + processLoadedStickers(type, null, false, (int) (System.currentTimeMillis() / 1000), hash, () -> { + if (onFinish != null) { + onFinish.run(null); + } + }); } })); } @@ -2146,7 +2396,12 @@ public class MediaDataController extends BaseController { if (stickerSet != null) { return stickerSet.set.short_name; } - TLRPC.StickerSetCovered stickerSetCovered = featuredStickerSetsById.get(setId); + TLRPC.StickerSetCovered stickerSetCovered; + stickerSetCovered = featuredStickerSetsById[0].get(setId); + if (stickerSetCovered != null) { + return stickerSetCovered.set.short_name; + } + stickerSetCovered = featuredStickerSetsById[1].get(setId); if (stickerSetCovered != null) { return stickerSetCovered.set.short_name; } @@ -2192,6 +2447,10 @@ public class MediaDataController extends BaseController { } private void processLoadedStickers(int type, ArrayList res, boolean cache, int date, long hash) { + processLoadedStickers(type, res, cache, date, hash, null); + } + + private void processLoadedStickers(int type, ArrayList res, boolean cache, int date, long hash, Runnable onFinish) { AndroidUtilities.runOnUIThread(() -> { loadingStickers[type] = false; stickersLoaded[type] = true; @@ -2209,6 +2468,9 @@ public class MediaDataController extends BaseController { loadStickers(type, false, false); }, res == null && !cache ? 1000 : 0); if (res == null) { + if (onFinish != null) { + onFinish.run(); + } return; } } @@ -2271,13 +2533,13 @@ public class MediaDataController extends BaseController { TLRPC.StickerSet set = stickerSets[type].get(a).set; stickerSetsById.remove(set.id); stickerSetsByName.remove(set.short_name); - if (type != TYPE_FEATURED && type != TYPE_EMOJI) { + if (type != TYPE_FEATURED && type != TYPE_FEATURED_EMOJIPACKS && type != TYPE_EMOJI) { installedStickerSetsById.remove(set.id); } } for (int a = 0; a < stickerSetsByIdNew.size(); a++) { stickerSetsById.put(stickerSetsByIdNew.keyAt(a), stickerSetsByIdNew.valueAt(a)); - if (type != TYPE_FEATURED && type != TYPE_EMOJI) { + if (type != TYPE_FEATURED && type != TYPE_FEATURED_EMOJIPACKS && type != TYPE_EMOJI) { installedStickerSetsById.put(stickerSetsByIdNew.keyAt(a), stickerSetsByIdNew.valueAt(a)); } } @@ -2293,13 +2555,27 @@ public class MediaDataController extends BaseController { allStickersFeatured = allStickersNew; } getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type); + if (onFinish != null) { + onFinish.run(); + } }); } catch (Throwable e) { FileLog.e(e); + if (onFinish != null) { + onFinish.run(); + } } } else if (!cache) { AndroidUtilities.runOnUIThread(() -> loadDate[type] = date); putStickersToCache(type, null, date, 0); + + if (onFinish != null) { + onFinish.run(); + } + } else { + if (onFinish != null) { + onFinish.run(); + } } }); } @@ -2351,6 +2627,9 @@ public class MediaDataController extends BaseController { * @param toggle 0 - remove, 1 - archive, 2 - add */ public void toggleStickerSet(Context context, TLObject stickerSetObject, int toggle, BaseFragment baseFragment, boolean showSettings, boolean showTooltip) { + toggleStickerSet(context, stickerSetObject, toggle, baseFragment, showSettings, showTooltip, null); + } + public void toggleStickerSet(Context context, TLObject stickerSetObject, int toggle, BaseFragment baseFragment, boolean showSettings, boolean showTooltip, Runnable onUndo) { TLRPC.StickerSet stickerSet; TLRPC.TL_messages_stickerSet messages_stickerSet; @@ -2371,7 +2650,13 @@ public class MediaDataController extends BaseController { throw new IllegalArgumentException("Invalid type of the given stickerSetObject: " + stickerSetObject.getClass()); } - int type = stickerSet.masks ? TYPE_MASK : TYPE_IMAGE; + int type1 = TYPE_IMAGE; + if (stickerSet.masks) { + type1 = TYPE_MASK; + } else if (stickerSet.emojis) { + type1 = TYPE_EMOJIPACKS; + } + final int type = type1; stickerSet.archived = toggle == 1; @@ -2394,7 +2679,6 @@ public class MediaDataController extends BaseController { loadHash[type] = calcStickersHash(stickerSets[type]); putStickersToCache(type, stickerSets[type], loadDate[type], loadHash[type]); - getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type); if (toggle == 2) { if (!cancelRemovingStickerSet(stickerSet.id)) { @@ -2405,7 +2689,14 @@ public class MediaDataController extends BaseController { } else { StickerSetBulletinLayout bulletinLayout = new StickerSetBulletinLayout(context, stickerSetObject, toggle); int finalCurrentIndex = currentIndex; + boolean[] undoDone = new boolean[1]; + markSetUninstalling(stickerSet.id, true); Bulletin.UndoButton undoButton = new Bulletin.UndoButton(context, false).setUndoAction(() -> { + if (undoDone[0]) { + return; + } + undoDone[0] = true; + markSetUninstalling(stickerSet.id, false); stickerSet.archived = false; stickerSets[type].add(finalCurrentIndex, messages_stickerSet); @@ -2416,12 +2707,104 @@ public class MediaDataController extends BaseController { loadHash[type] = calcStickersHash(stickerSets[type]); putStickersToCache(type, stickerSets[type], loadDate[type], loadHash[type]); + if (onUndo != null) { + onUndo.run(); + } + getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type); - }).setDelayedAction(() -> toggleStickerSetInternal(context, toggle, baseFragment, showSettings, stickerSetObject, stickerSet, type, false)); + }).setDelayedAction(() -> { + if (undoDone[0]) { + return; + } + undoDone[0] = true; + toggleStickerSetInternal(context, toggle, baseFragment, showSettings, stickerSetObject, stickerSet, type, false); + }); bulletinLayout.setButton(undoButton); removingStickerSetsUndos.put(stickerSet.id, undoButton::undo); Bulletin.make(baseFragment, bulletinLayout, Bulletin.DURATION_LONG).show(); } + + getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type); + } + + public void removeMultipleStickerSets(Context context, BaseFragment fragment, ArrayList sets) { + if (sets == null || sets.isEmpty()) { + return; + } + TLRPC.TL_messages_stickerSet messages_stickerSet = sets.get(sets.size() - 1); + if (messages_stickerSet == null) { + return; + } +// TLRPC.StickerSet stickerSet = messages_stickerSet.set; + + int type1 = TYPE_IMAGE; + if (messages_stickerSet.set.masks) { + type1 = TYPE_MASK; + } else if (messages_stickerSet.set.emojis) { + type1 = TYPE_EMOJIPACKS; + } + final int type = type1; + + for (int i = 0; i < sets.size(); ++i) { + sets.get(i).set.archived = false; + } + + final int[] currentIndexes = new int[sets.size()]; + for (int a = 0; a < stickerSets[type].size(); a++) { + TLRPC.TL_messages_stickerSet set = stickerSets[type].get(a); + for (int b = 0; b < sets.size(); ++b) { + if (set.set.id == sets.get(b).set.id) { + currentIndexes[b] = a; + stickerSets[type].remove(a); + stickerSetsById.remove(set.set.id); + installedStickerSetsById.remove(set.set.id); + stickerSetsByName.remove(set.set.short_name); + break; + } + } + } + + putStickersToCache(type, stickerSets[type], loadDate[type], loadHash[type] = calcStickersHash(stickerSets[type])); + getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type); + + for (int i = 0; i < sets.size(); ++i) { + markSetUninstalling(sets.get(i).set.id, true); + } + StickerSetBulletinLayout bulletinLayout = new StickerSetBulletinLayout(context, messages_stickerSet, sets.size(), StickerSetBulletinLayout.TYPE_REMOVED, null, fragment.getResourceProvider()); + boolean[] undoDone = new boolean[1]; + Bulletin.UndoButton undoButton = new Bulletin.UndoButton(context, false).setUndoAction(() -> { + if (undoDone[0]) { + return; + } + undoDone[0] = true; + + for (int i = 0; i < sets.size(); ++i) { + markSetUninstalling(sets.get(i).set.id, false); + sets.get(i).set.archived = false; + + stickerSets[type].add(currentIndexes[i], sets.get(i)); + stickerSetsById.put(sets.get(i).set.id, sets.get(i)); + installedStickerSetsById.put(sets.get(i).set.id, sets.get(i)); + stickerSetsByName.put(sets.get(i).set.short_name, sets.get(i)); + removingStickerSetsUndos.remove(sets.get(i).set.id); + } + + putStickersToCache(type, stickerSets[type], loadDate[type], loadHash[type] = calcStickersHash(stickerSets[type])); + getNotificationCenter().postNotificationName(NotificationCenter.stickersDidLoad, type); + }).setDelayedAction(() -> { + if (undoDone[0]) { + return; + } + undoDone[0] = true; + for (int i = 0; i < sets.size(); ++i) { + toggleStickerSetInternal(context, 0, fragment, true, sets.get(i), sets.get(i).set, type, false); + } + }); + bulletinLayout.setButton(undoButton); + for (int i = 0; i < sets.size(); ++i) { + removingStickerSetsUndos.put(sets.get(i).set.id, undoButton::undo); + } + Bulletin.make(fragment, bulletinLayout, Bulletin.DURATION_LONG).show(); } private void toggleStickerSetInternal(Context context, int toggle, BaseFragment baseFragment, boolean showSettings, TLObject stickerSetObject, TLRPC.StickerSet stickerSet, int type, boolean showTooltip) { @@ -2433,22 +2816,28 @@ public class MediaDataController extends BaseController { TLRPC.TL_messages_installStickerSet req = new TLRPC.TL_messages_installStickerSet(); req.stickerset = stickerSetID; req.archived = toggle == 1; + markSetInstalling(stickerSet.id, true); getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { removingStickerSetsUndos.remove(stickerSet.id); if (response instanceof TLRPC.TL_messages_stickerSetInstallResultArchive) { processStickerSetInstallResultArchive(baseFragment, showSettings, type, (TLRPC.TL_messages_stickerSetInstallResultArchive) response); } - loadStickers(type, false, false, true); + loadStickers(type, false, false, true, p -> { + markSetInstalling(stickerSet.id, false); + }); if (error == null && showTooltip && baseFragment != null) { Bulletin.make(baseFragment, new StickerSetBulletinLayout(context, stickerSetObject, StickerSetBulletinLayout.TYPE_ADDED), Bulletin.DURATION_SHORT).show(); } })); } else { + markSetUninstalling(stickerSet.id, true); TLRPC.TL_messages_uninstallStickerSet req = new TLRPC.TL_messages_uninstallStickerSet(); req.stickerset = stickerSetID; getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { removingStickerSetsUndos.remove(stickerSet.id); - loadStickers(type, false, true); + loadStickers(type, false, true, false, p -> { + markSetUninstalling(stickerSet.id, false); + }); })); } } @@ -3299,7 +3688,7 @@ public class MediaDataController extends BaseController { res.messages.add(message); } - MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); } } cursor.dispose(); @@ -4289,7 +4678,7 @@ public class MediaDataController extends BaseController { result.id = cursor.intValue(1); result.date = cursor.intValue(2); result.dialog_id = dialogId; - MessagesStorage.addUsersAndChatsFromMessage(result, usersToLoad, chatsToLoad); + MessagesStorage.addUsersAndChatsFromMessage(result, usersToLoad, chatsToLoad, null); results.add(result); midsCopy.remove((Integer) result.id); } @@ -4307,7 +4696,7 @@ public class MediaDataController extends BaseController { if (!(result.action instanceof TLRPC.TL_messageActionHistoryClear)) { result.readAttachPath(data, selfUserId); result.dialog_id = dialogId; - MessagesStorage.addUsersAndChatsFromMessage(result, usersToLoad, chatsToLoad); + MessagesStorage.addUsersAndChatsFromMessage(result, usersToLoad, chatsToLoad, null); results.add(result); midsCopy.remove((Integer) result.id); } @@ -4630,7 +5019,7 @@ public class MediaDataController extends BaseController { message.id = cursor.intValue(1); message.date = cursor.intValue(2); message.dialog_id = dialogId; - MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); result.add(message); long channelId = message.peer_id != null ? message.peer_id.channel_id : 0; @@ -4978,6 +5367,38 @@ public class MediaDataController extends BaseController { } } + public static void addAnimatedEmojiSpans(ArrayList entities, CharSequence messageText, Paint.FontMetricsInt fontMetricsInt) { + if (!(messageText instanceof Spannable) || entities == null) { + return; + } + Spannable spannable = (Spannable) messageText; + AnimatedEmojiSpan[] emojiSpans = spannable.getSpans(0, spannable.length(), AnimatedEmojiSpan.class); + for (int j = 0; j < emojiSpans.length; ++j) { + AnimatedEmojiSpan span = emojiSpans[j]; + if (span != null) { + spannable.removeSpan(span); + } + } + for (int i = 0; i < entities.size(); ++i) { + TLRPC.MessageEntity messageEntity = entities.get(i); + if (messageEntity instanceof TLRPC.TL_messageEntityCustomEmoji) { + TLRPC.TL_messageEntityCustomEmoji entity = (TLRPC.TL_messageEntityCustomEmoji) messageEntity; + + int start = messageEntity.offset; + int end = messageEntity.offset + messageEntity.length; + if (start < end && end <= spannable.length()) { + AnimatedEmojiSpan span; + if (entity.document != null) { + span = new AnimatedEmojiSpan(entity.document, fontMetricsInt); + } else { + span = new AnimatedEmojiSpan(entity.document_id, fontMetricsInt); + } + spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + } + public static ArrayList getTextStyleRuns(ArrayList entities, CharSequence text, int allowedFlags) { ArrayList runs = new ArrayList<>(); ArrayList entitiesCopy = new ArrayList<>(entities); @@ -4998,6 +5419,10 @@ public class MediaDataController extends BaseController { entity.length = text.length() - entity.offset; } + if (entity instanceof TLRPC.TL_messageEntityCustomEmoji) { + continue; + } + TextStyleSpan.TextStyleRun newRun = new TextStyleSpan.TextStyleRun(); newRun.start = entity.offset; newRun.end = newRun.start + entity.length; @@ -5251,6 +5676,28 @@ public class MediaDataController extends BaseController { } } + AnimatedEmojiSpan[] animatedEmojiSpans = spannable.getSpans(0, message[0].length(), AnimatedEmojiSpan.class); + if (animatedEmojiSpans != null && animatedEmojiSpans.length > 0) { + if (entities == null) { + entities = new ArrayList<>(); + } + for (int b = 0; b < animatedEmojiSpans.length; ++b) { + AnimatedEmojiSpan span = animatedEmojiSpans[b]; + if (span != null) { + try { + TLRPC.TL_messageEntityCustomEmoji entity = new TLRPC.TL_messageEntityCustomEmoji(); + entity.offset = spannable.getSpanStart(span); + entity.length = Math.min(spannable.getSpanEnd(span), message[0].length()) - entity.offset; + entity.document_id = span.getDocumentId(); + entity.document = span.document; + entities.add(entity); + } catch (Exception e) { + FileLog.e(e); + } + } + } + } + if (spannable instanceof Spannable) { AndroidUtilities.addLinks((Spannable) spannable, Linkify.WEB_URLS); URLSpan[] spansUrl = spannable.getSpans(0, message[0].length(), URLSpan.class); @@ -5952,14 +6399,18 @@ public class MediaDataController extends BaseController { public void chekAllMedia(boolean force) { if (force) { reactionsUpdateDate = 0; - loadFeaturedDate = 0; + loadFeaturedDate[0] = 0; + loadFeaturedDate[1] = 0; } loadRecents(MediaDataController.TYPE_FAVE, false, true, false); loadRecents(MediaDataController.TYPE_GREETINGS, false, true, false); + loadRecents(MediaDataController.TYPE_PREMIUM_STICKERS, false, false, true); checkFeaturedStickers(); + checkFeaturedEmoji(); checkReactions(); checkMenuBots(); checkPremiumPromo(); + checkPremiumGiftStickers(); } //---------------- BOT END ---------------- @@ -5967,6 +6418,11 @@ public class MediaDataController extends BaseController { //---------------- EMOJI START ---------------- public static class KeywordResult { + public KeywordResult() {} + public KeywordResult(String emoji, String keyword) { + this.emoji = emoji; + this.keyword = keyword; + } public String emoji; public String keyword; } @@ -6110,11 +6566,11 @@ public class MediaDataController extends BaseController { }); } - public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback) { - getEmojiSuggestions(langCodes, keyword, fullMatch, callback, null); + public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, boolean allowAnimated) { + getEmojiSuggestions(langCodes, keyword, fullMatch, callback, null, allowAnimated); } - public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, CountDownLatch sync) { + public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, final CountDownLatch sync, boolean allowAnimated) { if (callback == null) { return; } @@ -6225,11 +6681,22 @@ public class MediaDataController extends BaseController { } }); String aliasFinal = alias; - if (sync != null) { - callback.run(result, aliasFinal); - sync.countDown(); + if (allowAnimated) { + fillWithAnimatedEmoji(result, null, () -> { + if (sync != null) { + callback.run(result, aliasFinal); + sync.countDown(); + } else { + AndroidUtilities.runOnUIThread(() -> callback.run(result, aliasFinal)); + } + }); } else { - AndroidUtilities.runOnUIThread(() -> callback.run(result, aliasFinal)); + if (sync != null) { + callback.run(result, aliasFinal); + sync.countDown(); + } else { + AndroidUtilities.runOnUIThread(() -> callback.run(result, aliasFinal)); + } } }); if (sync != null) { @@ -6241,6 +6708,175 @@ public class MediaDataController extends BaseController { } } + private boolean triedLoadingEmojipacks = false; + public void fillWithAnimatedEmoji(ArrayList result, Integer maxAnimatedPerEmojiInput, Runnable onDone) { + if (result == null || result.isEmpty()) { + if (onDone != null) { + onDone.run(); + } + return; + } + final ArrayList[] emojiPacks = new ArrayList[2]; + emojiPacks[0] = getStickerSets(TYPE_EMOJIPACKS); + final Runnable fillRunnable = () -> { + ArrayList featuredSets = getFeaturedEmojiSets(); + ArrayList animatedResult = new ArrayList<>(); + ArrayList animatedEmoji = new ArrayList<>(); + final int maxAnimatedPerEmoji = maxAnimatedPerEmojiInput == null ? (result.size() > 5 ? 1 : (result.size() > 2 ? 2 : 3)) : maxAnimatedPerEmojiInput; + for (int i = 0; i < Math.min(15, result.size()); ++i) { + String emoji = result.get(i).emoji; + if (emoji == null) { + continue; + } + animatedEmoji.clear(); + boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + if (Emoji.recentEmoji != null) { + for (int j = 0; j < Emoji.recentEmoji.size(); ++j) { + if (Emoji.recentEmoji.get(j).startsWith("animated_")) { + try { + long documentId = Long.parseLong(Emoji.recentEmoji.get(j).substring(9)); + TLRPC.Document document = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); + if (document != null && + (isPremium || MessageObject.isFreeEmoji(document)) && + emoji.equals(MessageObject.findAnimatedEmojiEmoticon(document, null))) { + animatedEmoji.add(document); + } + } catch (Exception ignore) { + } + } + if (animatedEmoji.size() >= maxAnimatedPerEmoji) { + break; + } + } + } + if (animatedEmoji.size() < maxAnimatedPerEmoji && emojiPacks[0] != null) { + for (int j = 0; j < emojiPacks[0].size(); ++j) { + TLRPC.TL_messages_stickerSet set = emojiPacks[0].get(j); + if (set != null && set.documents != null) { + for (int d = 0; d < set.documents.size(); ++d) { + TLRPC.Document document = set.documents.get(d); + if (document != null && document.attributes != null && !animatedEmoji.contains(document)) { + boolean duplicate = false; + for (int l = 0; l < animatedEmoji.size(); ++l) { + if (animatedEmoji.get(l).id == document.id) { + duplicate = true; + break; + } + } + if (duplicate) { + continue; + } + + TLRPC.TL_documentAttributeCustomEmoji attribute = null; + for (int k = 0; k < document.attributes.size(); ++k) { + TLRPC.DocumentAttribute attr = document.attributes.get(k); + if (attr instanceof TLRPC.TL_documentAttributeCustomEmoji) { + attribute = (TLRPC.TL_documentAttributeCustomEmoji) attr; + break; + } + } + + if (attribute != null && emoji.equals(attribute.alt) && (isPremium || attribute.free)) { + animatedEmoji.add(document); + if (animatedEmoji.size() >= maxAnimatedPerEmoji) { + break; + } + } + } + } + } + if (animatedEmoji.size() >= maxAnimatedPerEmoji) { + break; + } + } + } + if (animatedEmoji.size() < maxAnimatedPerEmoji && featuredSets != null) { + for (int j = 0; j < featuredSets.size(); ++j) { + TLRPC.StickerSetCovered set = featuredSets.get(j); + if (set == null) { + continue; + } + ArrayList documents = set instanceof TLRPC.TL_stickerSetFullCovered ? ((TLRPC.TL_stickerSetFullCovered) set).documents : set.covers; + if (documents == null) { + continue; + } + for (int d = 0; d < documents.size(); ++d) { + TLRPC.Document document = documents.get(d); + if (document != null && document.attributes != null && !animatedEmoji.contains(document)) { + boolean duplicate = false; + for (int l = 0; l < animatedEmoji.size(); ++l) { + if (animatedEmoji.get(l).id == document.id) { + duplicate = true; + break; + } + } + if (duplicate) { + continue; + } + + TLRPC.TL_documentAttributeCustomEmoji attribute = null; + for (int k = 0; k < document.attributes.size(); ++k) { + TLRPC.DocumentAttribute attr = document.attributes.get(k); + if (attr instanceof TLRPC.TL_documentAttributeCustomEmoji) { + attribute = (TLRPC.TL_documentAttributeCustomEmoji) attr; + break; + } + } + + if (attribute != null && emoji.equals(attribute.alt) && (isPremium || attribute.free)) { + animatedEmoji.add(document); + if (animatedEmoji.size() >= maxAnimatedPerEmoji) { + break; + } + } + } + } + if (animatedEmoji.size() >= maxAnimatedPerEmoji) { + break; + } + } + } + + if (!animatedEmoji.isEmpty()) { + String keyword = result.get(i).keyword; + for (int p = 0; p < animatedEmoji.size(); ++p) { + TLRPC.Document document = animatedEmoji.get(p); + if (document != null) { + KeywordResult keywordResult = new KeywordResult(); + keywordResult.emoji = "animated_" + document.id; + keywordResult.keyword = keyword; + animatedResult.add(keywordResult); + } + } + } + } + result.addAll(0, animatedResult); + if (onDone != null) { + onDone.run(); + } + }; + if ((emojiPacks[0] == null || emojiPacks[0].isEmpty()) && !triedLoadingEmojipacks) { + triedLoadingEmojipacks = true; + final boolean[] done = new boolean[1]; + AndroidUtilities.runOnUIThread(() -> { + loadStickers(TYPE_EMOJIPACKS, true, false, false, packs -> { + if (!done[0]) { + emojiPacks[0] = packs; + fillRunnable.run(); + done[0] = true; + } + }); + }); + AndroidUtilities.runOnUIThread(() -> { + if (!done[0]) { + fillRunnable.run(); + done[0] = true; + } + }, 900); + } else { + fillRunnable.run(); + } + } public void loadEmojiThemes() { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("emojithemes_config_" + currentAccount, Context.MODE_PRIVATE); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index f85ebb263..3a19f918b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -8,17 +8,12 @@ package org.telegram.messenger; -import android.graphics.Canvas; -import android.graphics.ColorFilter; import android.graphics.Paint; -import android.graphics.PixelFormat; -import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; -import android.os.SystemClock; import android.text.Layout; import android.text.Spannable; import android.text.SpannableString; @@ -33,10 +28,7 @@ import android.text.style.ImageSpan; import android.text.style.URLSpan; import android.text.util.Linkify; import android.util.Base64; -import android.view.View; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.collection.LongSparseArray; import org.telegram.PhoneFormat.PhoneFormat; @@ -48,7 +40,8 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.ChatMessageCell; -import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.TextStyleSpan; import org.telegram.ui.Components.TranscribeButton; import org.telegram.ui.Components.TypefaceSpan; @@ -64,7 +57,6 @@ import org.telegram.ui.Components.spoilers.SpoilerEffect; import java.io.BufferedReader; import java.io.File; import java.io.StringReader; -import java.lang.ref.WeakReference; import java.net.URLEncoder; import java.util.AbstractMap; import java.util.ArrayList; @@ -92,6 +84,8 @@ public class MessageObject { public static final int TYPE_STICKER = 13; public static final int TYPE_ANIMATED_STICKER = 15; public static final int TYPE_POLL = 17; + public static final int TYPE_GIFT_PREMIUM = 18; + public static final int TYPE_EMOJIS = 19; public int localType; public String localName; @@ -104,6 +98,8 @@ public class MessageObject { public boolean localEdit; public TLRPC.Message messageOwner; public TLRPC.Document emojiAnimatedSticker; + public Long emojiAnimatedStickerId; + private boolean emojiAnimatedStickerLoading; public String emojiAnimatedStickerColor; public CharSequence messageText; public CharSequence linkDescription; @@ -150,8 +146,6 @@ public class MessageObject { public boolean isRestrictedMessage; public long loadedFileSize; - public AtomicReference> viewRef = new AtomicReference<>(null); - public boolean isSpoilersRevealed; public byte[] sponsoredId; public int sponsoredChannelPost; @@ -167,6 +161,7 @@ public class MessageObject { public int stableId; public boolean wasUnread; + public boolean playedGiftAnimation; public boolean hadAnimationNotReadyLoading; @@ -180,6 +175,7 @@ public class MessageObject { public CharSequence editingMessage; public ArrayList editingMessageEntities; public boolean editingMessageSearchWebPage; + public ArrayList webPageDescriptionEntities; public String previousMessage; public TLRPC.MessageMedia previousMedia; @@ -204,7 +200,9 @@ public class MessageObject { public SendAnimationData sendAnimationData; + private boolean hasUnwrappedEmoji; private int emojiOnlyCount; + private int totalAnimatedEmojiCount; private boolean layoutCreated; private int generatedWithMinSize; private float generatedWithDensity; @@ -330,6 +328,13 @@ public class MessageObject { return null; } + public void copyStableParams(MessageObject old) { + stableId = old.stableId; + messageOwner.premiumEffectWasPlayed = old.messageOwner.premiumEffectWasPlayed; + forcePlayEffect = old.forcePlayEffect; + wasJustSent = old.wasJustSent; + } + public static class SendAnimationData { public float x; public float y; @@ -995,6 +1000,7 @@ public class MessageObject { } private static final int LINES_PER_BLOCK = 10; + private static final int LINES_PER_BLOCK_WITH_EMOJI = 5; public ArrayList textLayoutBlocks; @@ -1078,10 +1084,28 @@ public class MessageObject { paint = Theme.chat_msgTextPaint; } int[] emojiOnly = allowsBigEmoji() ? new int[1] : null; - messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly, contentType == 0, viewRef); + messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly); + messageText = replaceAnimatedEmoji(messageText, messageOwner.entities, paint.getFontMetricsInt()); + if (emojiOnly != null && emojiOnly[0] > 1) { + replaceEmojiToLottieFrame(messageText, emojiOnly); + } checkEmojiOnly(emojiOnly); - emojiAnimatedSticker = null; - if (emojiOnlyCount == 1 && !(message.media instanceof TLRPC.TL_messageMediaWebPage) && !(message.media instanceof TLRPC.TL_messageMediaInvoice) && message.entities.isEmpty() && (message.media instanceof TLRPC.TL_messageMediaEmpty || message.media == null) && messageOwner.grouped_id == 0) { + checkBigAnimatedEmoji(); + setType(); + createPathThumb(); + } + layoutCreated = generateLayout; + generateThumbs(false); + if (checkMediaExists) { + checkMediaExistance(); + } + } + + private void checkBigAnimatedEmoji() { + emojiAnimatedSticker = null; + emojiAnimatedStickerId = null; + if (emojiOnlyCount == 1 && !(messageOwner.media instanceof TLRPC.TL_messageMediaWebPage) && !(messageOwner.media instanceof TLRPC.TL_messageMediaInvoice) && (messageOwner.media instanceof TLRPC.TL_messageMediaEmpty || messageOwner.media == null) && this.messageOwner.grouped_id == 0) { + if (messageOwner.entities.isEmpty()) { CharSequence emoji = messageText; int index; if ((index = TextUtils.indexOf(emoji, "\uD83C\uDFFB")) >= 0) { @@ -1108,23 +1132,28 @@ public class MessageObject { if (TextUtils.isEmpty(emojiAnimatedStickerColor) || EmojiData.emojiColoredMap.contains(emoji.toString())) { emojiAnimatedSticker = MediaDataController.getInstance(currentAccount).getEmojiAnimatedSticker(emoji); } + } else if (messageOwner.entities.size() == 1 && messageOwner.entities.get(0) instanceof TLRPC.TL_messageEntityCustomEmoji) { + try { + emojiAnimatedStickerId = ((TLRPC.TL_messageEntityCustomEmoji) messageOwner.entities.get(0)).document_id; + emojiAnimatedSticker = AnimatedEmojiDrawable.findDocument(currentAccount, emojiAnimatedStickerId); + if (emojiAnimatedSticker == null && messageText instanceof Spanned) { + AnimatedEmojiSpan[] animatedEmojiSpans = ((Spanned) messageText).getSpans(0, messageText.length(), AnimatedEmojiSpan.class); + if (animatedEmojiSpans != null && animatedEmojiSpans.length == 1) { + emojiAnimatedSticker = animatedEmojiSpans[0].document; + } + } + } catch (Exception ignore) {} } - if (emojiAnimatedSticker == null) { - generateLayout(fromUser); - } else { - type = 1000; - if (isSticker()) { - type = TYPE_STICKER; - } else if (isAnimatedSticker()) { - type = TYPE_ANIMATED_STICKER; - } - } - createPathThumb(); } - layoutCreated = generateLayout; - generateThumbs(false); - if (checkMediaExists) { - checkMediaExistance(); + if (emojiAnimatedSticker == null && emojiAnimatedStickerId == null) { + generateLayout(null); + } else { + type = 1000; + if (isSticker()) { + type = TYPE_STICKER; + } else if (isAnimatedSticker()) { + type = TYPE_ANIMATED_STICKER; + } } } @@ -1179,33 +1208,91 @@ public class MessageObject { } private void checkEmojiOnly(int[] emojiOnly) { - if (emojiOnly != null && emojiOnly[0] >= 1 && emojiOnly[0] <= 3) { + checkEmojiOnly(emojiOnly == null ? null : emojiOnly[0]); + } + + private void checkEmojiOnly(Integer emojiOnly) { + if (emojiOnly != null && emojiOnly >= 1) { + Emoji.EmojiSpan[] spans = ((Spannable) messageText).getSpans(0, messageText.length(), Emoji.EmojiSpan.class); + AnimatedEmojiSpan[] aspans = ((Spannable) messageText).getSpans(0, messageText.length(), AnimatedEmojiSpan.class); + emojiOnlyCount = Math.max(emojiOnly, (spans == null ? 0 : spans.length) + (aspans == null ? 0 : aspans.length)); + totalAnimatedEmojiCount = aspans == null ? 0 : aspans.length; + int animatedEmojiCount = 0; + if (aspans != null) { + for (int i = 0; i < aspans.length; ++i) { + if (!aspans[i].standard) { + animatedEmojiCount++; + } + } + } + hasUnwrappedEmoji = emojiOnlyCount - (spans == null ? 0 : spans.length) - (aspans == null ? 0 : aspans.length) > 0; + if (emojiOnlyCount == 0 || hasUnwrappedEmoji) { + if (aspans != null && aspans.length > 0) { + for (int a = 0; a < aspans.length; a++) { + aspans[a].replaceFontMetrics(Theme.chat_msgTextPaint.getFontMetricsInt(), (int) (Theme.chat_msgTextPaint.getTextSize() + AndroidUtilities.dp(4)), -1); + } + } + return; + } + boolean large = emojiOnlyCount == animatedEmojiCount; + int cacheType = -1; TextPaint emojiPaint; - int size; - switch (emojiOnly[0]) { + switch (emojiOnlyCount) { + case 0: case 1: - emojiPaint = Theme.chat_msgTextPaintOneEmoji; - size = AndroidUtilities.dp(32); - emojiOnlyCount = 1; + emojiPaint = large ? Theme.chat_msgTextPaintEmoji[0] : Theme.chat_msgTextPaintEmoji[2]; break; case 2: - emojiPaint = Theme.chat_msgTextPaintTwoEmoji; - size = AndroidUtilities.dp(28); - emojiOnlyCount = 2; + cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES_LARGE; + emojiPaint = large ? Theme.chat_msgTextPaintEmoji[0] : Theme.chat_msgTextPaintEmoji[2]; break; case 3: + cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES_LARGE; + emojiPaint = large ? Theme.chat_msgTextPaintEmoji[1] : Theme.chat_msgTextPaintEmoji[3]; + break; + case 4: + cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES_LARGE; + emojiPaint = large ? Theme.chat_msgTextPaintEmoji[2] : Theme.chat_msgTextPaintEmoji[4]; + break; + case 5: + cacheType = AnimatedEmojiDrawable.CACHE_TYPE_KEYBOARD; + emojiPaint = large ? Theme.chat_msgTextPaintEmoji[3] : Theme.chat_msgTextPaintEmoji[5]; + break; + case 6: + cacheType = AnimatedEmojiDrawable.CACHE_TYPE_KEYBOARD; + emojiPaint = large ? Theme.chat_msgTextPaintEmoji[4] : Theme.chat_msgTextPaintEmoji[5]; + break; + case 7: + case 8: + case 9: default: - emojiPaint = Theme.chat_msgTextPaintThreeEmoji; - size = AndroidUtilities.dp(24); - emojiOnlyCount = 3; + if (emojiOnlyCount > 9) { + cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES; + } + emojiPaint = Theme.chat_msgTextPaintEmoji[5]; break; } - Emoji.EmojiSpan[] spans = ((Spannable) messageText).getSpans(0, messageText.length(), Emoji.EmojiSpan.class); + int size = (int) (emojiPaint.getTextSize() + AndroidUtilities.dp(large ? 4 : 4)); if (spans != null && spans.length > 0) { for (int a = 0; a < spans.length; a++) { spans[a].replaceFontMetrics(emojiPaint.getFontMetricsInt(), size); } } + if (aspans != null && aspans.length > 0) { + for (int a = 0; a < aspans.length; a++) { + aspans[a].replaceFontMetrics(emojiPaint.getFontMetricsInt(), size, cacheType); + } + } + } else { + AnimatedEmojiSpan[] aspans = ((Spannable) messageText).getSpans(0, messageText.length(), AnimatedEmojiSpan.class); + if (aspans != null && aspans.length > 0) { + totalAnimatedEmojiCount = aspans.length; + for (int a = 0; a < aspans.length; a++) { + aspans[a].replaceFontMetrics(Theme.chat_msgTextPaint.getFontMetricsInt(), (int) (Theme.chat_msgTextPaint.getTextSize() + AndroidUtilities.dp(4)), -1); + } + } else { + totalAnimatedEmojiCount = 0; + } } } @@ -1230,6 +1317,7 @@ public class MessageObject { peer_id.channel_id = chat.id; TLRPC.Message message = null; + ArrayList webPageDescriptionEntities = null; if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeTitle) { String title = ((TLRPC.TL_channelAdminLogEventActionChangeTitle) event.action).new_value; if (chat.megagroup) { @@ -1818,6 +1906,7 @@ public class MessageObject { message.media.webpage.description = LocaleController.getString("EventLogOriginalCaptionEmpty", R.string.EventLogOriginalCaptionEmpty); } else { message.media.webpage.description = oldMessage.message; + webPageDescriptionEntities = oldMessage.entities; } } } else { @@ -1827,6 +1916,7 @@ public class MessageObject { message.media = new TLRPC.TL_messageMediaEmpty(); } else { message.message = newMessage.message; + message.entities = newMessage.entities; message.media = new TLRPC.TL_messageMediaWebPage(); message.media.webpage = new TLRPC.TL_webPage(); message.media.webpage.site_name = LocaleController.getString("EventLogOriginalMessages", R.string.EventLogOriginalMessages); @@ -1834,6 +1924,7 @@ public class MessageObject { message.media.webpage.description = LocaleController.getString("EventLogOriginalCaptionEmpty", R.string.EventLogOriginalCaptionEmpty); } else { message.media.webpage.description = oldMessage.message; + webPageDescriptionEntities = oldMessage.entities; } } } @@ -2049,6 +2140,11 @@ public class MessageObject { } else { contentType = -1; } + if (webPageDescriptionEntities != null) { + messageObject.webPageDescriptionEntities = webPageDescriptionEntities; + messageObject.linkDescription = null; + messageObject.generateLinkDescription(); + } } if (contentType >= 0) { createDateArray(currentAccount, event, messageObjects, messagesByDays, addToEnd); @@ -2065,19 +2161,25 @@ public class MessageObject { messageText = ""; } - setType(); - measureInlineBotButtons(); - generateCaption(); - TextPaint paint; if (messageOwner.media instanceof TLRPC.TL_messageMediaGame) { paint = Theme.chat_msgGameTextPaint; } else { paint = Theme.chat_msgTextPaint; } + int[] emojiOnly = allowsBigEmoji() ? new int[1] : null; - messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly, contentType == 0, viewRef); + messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly); + messageText = replaceAnimatedEmoji(messageText, messageOwner.entities, paint.getFontMetricsInt()); + if (emojiOnly != null && emojiOnly[0] > 1) { + replaceEmojiToLottieFrame(messageText, emojiOnly); + } checkEmojiOnly(emojiOnly); + + setType(); + measureInlineBotButtons(); + generateCaption(); + if (mediaController.isPlayingMessage(this)) { MessageObject player = mediaController.getPlayingMessageObject(); audioProgress = player.audioProgress; @@ -2152,9 +2254,14 @@ public class MessageObject { paint = Theme.chat_msgTextPaint; } int[] emojiOnly = allowsBigEmoji() ? new int[1] : null; - messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly, contentType == 0, viewRef); + messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly); + messageText = replaceAnimatedEmoji(messageText, messageOwner.entities, paint.getFontMetricsInt()); + if (emojiOnly != null && emojiOnly[0] > 1) { + replaceEmojiToLottieFrame(messageText, emojiOnly); + } checkEmojiOnly(emojiOnly); generateLayout(fromUser); + setType(); } private boolean allowsBigEmoji() { @@ -2274,14 +2381,26 @@ public class MessageObject { messageText = replaceWithLink(LocaleController.getString("ActionPinnedPhoto", R.string.ActionPinnedPhoto), "un1", fromUser != null ? fromUser : chat); } else if (replyMessageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGame) { messageText = replaceWithLink(LocaleController.formatString("ActionPinnedGame", R.string.ActionPinnedGame, "\uD83C\uDFAE " + replyMessageObject.messageOwner.media.game.title), "un1", fromUser != null ? fromUser : chat); - messageText = Emoji.replaceEmoji(messageText, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false, contentType == 0, viewRef); + messageText = Emoji.replaceEmoji(messageText, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); } else if (replyMessageObject.messageText != null && replyMessageObject.messageText.length() > 0) { - CharSequence mess = replyMessageObject.messageText; + CharSequence mess = AnimatedEmojiSpan.cloneSpans(replyMessageObject.messageText); + boolean ellipsize = false; if (mess.length() > 20) { - mess = mess.subSequence(0, 20) + "..."; + mess = mess.subSequence(0, 20); + ellipsize = true; + } + mess = Emoji.replaceEmoji(mess, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + if (replyMessageObject != null && replyMessageObject.messageOwner != null) { + mess = replaceAnimatedEmoji(mess, replyMessageObject.messageOwner.entities, Theme.chat_msgTextPaint.getFontMetricsInt()); } - mess = Emoji.replaceEmoji(mess, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false, contentType == 0, viewRef); MediaDataController.addTextStyleRuns(replyMessageObject, (Spannable) mess); + if (ellipsize) { + if (mess instanceof SpannableStringBuilder) { + ((SpannableStringBuilder) mess).append("..."); + } else if (mess != null) { + mess = new SpannableStringBuilder(mess).append("..."); + } + } messageText = replaceWithLink(AndroidUtilities.formatSpannable(LocaleController.getString("ActionPinnedText", R.string.ActionPinnedText), mess), "un1", fromUser != null ? fromUser : chat); } else { messageText = replaceWithLink(LocaleController.getString("ActionPinnedNoText", R.string.ActionPinnedNoText), "un1", fromUser != null ? fromUser : chat); @@ -2379,6 +2498,19 @@ public class MessageObject { } } + public void loadAnimatedEmojiDocument() { + if (emojiAnimatedSticker != null || emojiAnimatedStickerId == null || emojiAnimatedStickerLoading) { + return; + } + emojiAnimatedStickerLoading = true; + AnimatedEmojiDrawable.getDocumentFetcher(currentAccount).fetchDocument(emojiAnimatedStickerId, document -> { + AndroidUtilities.runOnUIThread(() -> { + this.emojiAnimatedSticker = document; + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.animatedEmojiDocumentLoaded, this); + }); + }); + } + public boolean isPollClosed() { if (type != TYPE_POLL) { return false; @@ -2618,7 +2750,7 @@ public class MessageObject { if (str == null) { str = ""; } - text = Emoji.replaceEmoji(str, Theme.chat_msgBotButtonPaint.getFontMetricsInt(), AndroidUtilities.dp(15), false, contentType == 0, viewRef); + text = Emoji.replaceEmoji(str, Theme.chat_msgBotButtonPaint.getFontMetricsInt(), AndroidUtilities.dp(15), false); } StaticLayout staticLayout = new StaticLayout(text, Theme.chat_msgBotButtonPaint, AndroidUtilities.dp(2000), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); if (staticLayout.getLineCount() > 0) { @@ -2638,7 +2770,7 @@ public class MessageObject { TLRPC.TL_reactionCount reactionCount = messageOwner.reactions.results.get(a); int maxButtonSize = 0; botButtonsLayout.append(0).append(a); - CharSequence text = Emoji.replaceEmoji(String.format("%d %s", reactionCount.count, reactionCount.reaction), Theme.chat_msgBotButtonPaint.getFontMetricsInt(), AndroidUtilities.dp(15), false, contentType == 0, viewRef); + CharSequence text = Emoji.replaceEmoji(String.format("%d %s", reactionCount.count, reactionCount.reaction), Theme.chat_msgBotButtonPaint.getFontMetricsInt(), AndroidUtilities.dp(15), false); StaticLayout staticLayout = new StaticLayout(text, Theme.chat_msgBotButtonPaint, AndroidUtilities.dp(2000), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); if (staticLayout.getLineCount() > 0) { float width = staticLayout.getLineWidth(0); @@ -2882,6 +3014,18 @@ public class MessageObject { } else { messageText = replaceWithLink(LocaleController.getString("ActionInviteUser", R.string.ActionInviteUser), "un1", fromObject); } + } else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium) { + if (fromObject instanceof TLRPC.User && ((TLRPC.User) fromObject).self) { + TLRPC.User user = getUser(users, sUsers, messageOwner.peer_id.user_id); + messageText = replaceWithLink(AndroidUtilities.replaceTags(LocaleController.getString(R.string.ActionGiftOutbound)), "un1", user); + } else { + messageText = replaceWithLink(AndroidUtilities.replaceTags(LocaleController.getString(R.string.ActionGiftInbound)), "un1", fromObject); + } + int i = messageText.toString().indexOf("un2"); + if (i != -1) { + SpannableStringBuilder sb = SpannableStringBuilder.valueOf(messageText); + messageText = sb.replace(i, i + 3, BillingController.getInstance().formatCurrency(messageOwner.action.amount, messageOwner.action.currency)); + } } else if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto) { TLRPC.Chat chat = messageOwner.peer_id != null && messageOwner.peer_id.channel_id != 0 ? getChat(chats, sChats, messageOwner.peer_id.channel_id) : null; if (ChatObject.isChannel(chat) && !chat.megagroup) { @@ -3267,12 +3411,14 @@ public class MessageObject { if (messageOwner instanceof TLRPC.TL_message || messageOwner instanceof TLRPC.TL_messageForwarded_old2) { if (isRestrictedMessage) { type = 0; - } else if (emojiAnimatedSticker != null) { + } else if (emojiAnimatedSticker != null || emojiAnimatedStickerId != null) { if (isSticker()) { type = TYPE_STICKER; } else { type = TYPE_ANIMATED_STICKER; } + } else if (!isDice() && emojiOnlyCount >= 1 && !hasUnwrappedEmoji) { + type = TYPE_EMOJIS; } else if (isMediaEmpty()) { type = 0; if (TextUtils.isEmpty(messageText) && eventId == 0) { @@ -3336,6 +3482,9 @@ public class MessageObject { } else if (messageOwner instanceof TLRPC.TL_messageService) { if (messageOwner.action instanceof TLRPC.TL_messageActionLoginUnknownLocation) { type = 0; + } else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium) { + contentType = 1; + type = TYPE_GIFT_PREMIUM; } else if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto || messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) { contentType = 1; type = 11; @@ -3357,14 +3506,14 @@ public class MessageObject { type = 10; } } - if (oldType != 1000 && oldType != type) { + if (oldType != 1000 && oldType != type && type != TYPE_EMOJIS) { updateMessageText(MessagesController.getInstance(currentAccount).getUsers(), MessagesController.getInstance(currentAccount).getChats(), null, null); generateThumbs(false); } } public boolean checkLayout() { - if (type != 0 || messageOwner.peer_id == null || messageText == null || messageText.length() == 0) { + if (type != 0 && type != TYPE_EMOJIS || messageOwner.peer_id == null || messageText == null || messageText.length() == 0) { return false; } if (layoutCreated) { @@ -3386,9 +3535,14 @@ public class MessageObject { paint = Theme.chat_msgTextPaint; } int[] emojiOnly = allowsBigEmoji() ? new int[1] : null; - messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly, contentType == 0, viewRef); + messageText = Emoji.replaceEmoji(messageText, paint.getFontMetricsInt(), AndroidUtilities.dp(20), false, emojiOnly); + messageText = replaceAnimatedEmoji(messageText, messageOwner.entities, paint.getFontMetricsInt()); + if (emojiOnly != null && emojiOnly[0] > 1) { + replaceEmojiToLottieFrame(messageText, emojiOnly); + } checkEmojiOnly(emojiOnly); - generateLayout(fromUser); + checkBigAnimatedEmoji(); + setType(); return true; } return false; @@ -3571,7 +3725,7 @@ public class MessageObject { } photoThumbsObject = messageOwner.action.photo; } - } else if (emojiAnimatedSticker != null) { + } else if (emojiAnimatedSticker != null || emojiAnimatedStickerId != null) { if (TextUtils.isEmpty(emojiAnimatedStickerColor) && isDocumentHasThumb(emojiAnimatedSticker)) { if (!update || photoThumbs == null) { photoThumbs = new ArrayList<>(); @@ -3895,7 +4049,11 @@ public class MessageObject { FileLog.e(e); } } - linkDescription = Emoji.replaceEmoji(linkDescription, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false, contentType == 0, viewRef); + linkDescription = Emoji.replaceEmoji(linkDescription, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + if (webPageDescriptionEntities != null) { + addEntitiesToText(linkDescription, webPageDescriptionEntities, isOut(), false, false, true); + replaceAnimatedEmoji(linkDescription, webPageDescriptionEntities, Theme.chat_msgTextPaint.getFontMetricsInt()); + } if (hashtagsType != 0) { if (!(linkDescription instanceof Spannable)) { linkDescription = new SpannableStringBuilder(linkDescription); @@ -3922,7 +4080,7 @@ public class MessageObject { } CharSequence text = messageOwner.voiceTranscription; if (!TextUtils.isEmpty(text)) { - text = Emoji.replaceEmoji(text, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false, contentType == 0, viewRef); + text = Emoji.replaceEmoji(text, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); } return text; } @@ -3955,7 +4113,8 @@ public class MessageObject { return; } if (!isMediaEmpty() && !(messageOwner.media instanceof TLRPC.TL_messageMediaGame) && !TextUtils.isEmpty(messageOwner.message)) { - caption = Emoji.replaceEmoji(messageOwner.message, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false, contentType == 0, viewRef); + caption = Emoji.replaceEmoji(messageOwner.message, Theme.chat_msgTextPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + caption = replaceAnimatedEmoji(caption, messageOwner.entities, Theme.chat_msgTextPaint.getFontMetricsInt()); boolean hasEntities; if (messageOwner.send_state != MESSAGE_SEND_STATE_SENT) { @@ -4223,6 +4382,74 @@ public class MessageObject { } } + public void replaceEmojiToLottieFrame(CharSequence text, int[] emojiOnly) { + if (!(text instanceof Spannable)) { + return; + } + Spannable spannable = (Spannable) text; + Emoji.EmojiSpan[] spans = spannable.getSpans(0, spannable.length(), Emoji.EmojiSpan.class); + AnimatedEmojiSpan[] aspans = spannable.getSpans(0, spannable.length(), AnimatedEmojiSpan.class); + + if (spans == null || (emojiOnly == null ? 0 : emojiOnly[0]) - spans.length - (aspans == null ? 0 : aspans.length) > 0) { + return; + } + for (int i = 0; i < spans.length; ++i) { + TLRPC.Document lottieDocument = MediaDataController.getInstance(currentAccount).getEmojiAnimatedSticker(spans[i].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; + spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + + public static Spannable replaceAnimatedEmoji(CharSequence text, ArrayList entities, Paint.FontMetricsInt fontMetricsInt) { + Spannable spannable = text instanceof Spannable ? (Spannable) text : new SpannableString(text); + if (entities == null) { + return spannable; + } + Emoji.EmojiSpan[] emojiSpans = spannable.getSpans(0, spannable.length(), Emoji.EmojiSpan.class); + for (int i = 0; i < entities.size(); ++i) { + TLRPC.MessageEntity messageEntity = entities.get(i); + if (messageEntity instanceof TLRPC.TL_messageEntityCustomEmoji) { + TLRPC.TL_messageEntityCustomEmoji entity = (TLRPC.TL_messageEntityCustomEmoji) messageEntity; + for (int j = 0; j < emojiSpans.length; ++j) { + Emoji.EmojiSpan span = emojiSpans[j]; + if (span != null) { + int start = spannable.getSpanStart(span); + int end = spannable.getSpanEnd(span); + + if (entity.offset == start && entity.length == (end - start)) { + spannable.removeSpan(span); + emojiSpans[j] = null; + } + } + } + + if (messageEntity.offset + messageEntity.length <= spannable.length()) { + AnimatedEmojiSpan[] animatedSpans = spannable.getSpans(messageEntity.offset, messageEntity.offset + messageEntity.length, AnimatedEmojiSpan.class); + if (animatedSpans != null && animatedSpans.length > 0) { + for (int j = 0; j < animatedSpans.length; ++j) { + spannable.removeSpan(animatedSpans[j]); + } + } + + AnimatedEmojiSpan span; + if (entity.document != null) { + span = new AnimatedEmojiSpan(entity.document, fontMetricsInt); + } else { + span = new AnimatedEmojiSpan(entity.document_id, fontMetricsInt); + } + spannable.setSpan(span, messageEntity.offset, messageEntity.offset + messageEntity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + return spannable; + } + public static boolean addEntitiesToText(CharSequence text, ArrayList entities, boolean out, boolean usernames, boolean photoViewer, boolean useManualParse) { if (!(text instanceof Spannable)) { return false; @@ -4272,7 +4499,8 @@ public class MessageObject { entity instanceof TLRPC.TL_messageEntityMentionName || entity instanceof TLRPC.TL_inputMessageEntityMentionName || entity instanceof TLRPC.TL_messageEntityTextUrl || - entity instanceof TLRPC.TL_messageEntitySpoiler) { + entity instanceof TLRPC.TL_messageEntitySpoiler || + entity instanceof TLRPC.TL_messageEntityCustomEmoji) { if (spans != null && spans.length > 0) { for (int b = 0; b < spans.length; b++) { if (spans[b] == null) { @@ -4288,6 +4516,10 @@ public class MessageObject { } } + if (entity instanceof TLRPC.TL_messageEntityCustomEmoji) { + continue; + } + TextStyleSpan.TextStyleRun newRun = new TextStyleSpan.TextStyleRun(); newRun.start = entity.offset; newRun.end = newRun.start + entity.length; @@ -4460,7 +4692,7 @@ public class MessageObject { return false; } else if (messageOwner.fwd_from != null && !isOutOwner() && messageOwner.fwd_from.saved_from_peer != null && getDialogId() == UserConfig.getInstance(currentAccount).getClientUserId()) { return true; - } else if (type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER) { + } else if (type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER || type == TYPE_EMOJIS) { return false; } else if (messageOwner.fwd_from != null && messageOwner.fwd_from.from_id instanceof TLRPC.TL_peerChannel && !isOutOwner()) { return true; @@ -4528,11 +4760,14 @@ public class MessageObject { maxWidth -= AndroidUtilities.dp(10); } } + if (emojiOnlyCount >= 1 && totalAnimatedEmojiCount <= 100 && (emojiOnlyCount - totalAnimatedEmojiCount) < (SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH ? 100 : 50) && (hasValidReplyMessageObject() || isForwarded())) { + maxWidth = Math.min(maxWidth, (int) (generatedWithMinSize * .65f)); + } return maxWidth; } public void generateLayout(TLRPC.User fromUser) { - if (type != 0 || messageOwner.peer_id == null || TextUtils.isEmpty(messageText)) { + if (type != 0 && type != TYPE_EMOJIS || messageOwner.peer_id == null || TextUtils.isEmpty(messageText)) { return; } @@ -4594,15 +4829,16 @@ public class MessageObject { paint = Theme.chat_msgTextPaint; } + Layout.Alignment align = Layout.Alignment.ALIGN_NORMAL; //type == TYPE_EMOJIS && isOut() ? Layout.Alignment.ALIGN_OPPOSITE : Layout.Alignment.ALIGN_NORMAL; try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { textLayout = StaticLayout.Builder.obtain(messageText, 0, messageText.length(), paint, maxWidth) .setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY) .setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_NONE) - .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setAlignment(align) .build(); } else { - textLayout = new StaticLayout(messageText, paint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + textLayout = new StaticLayout(messageText, paint, maxWidth, align, 1.0f, 0.0f, false); } } catch (Exception e) { FileLog.e(e); @@ -4611,22 +4847,24 @@ public class MessageObject { textHeight = textLayout.getHeight(); linesCount = textLayout.getLineCount(); + int linesPreBlock = totalAnimatedEmojiCount >= 50 ? LINES_PER_BLOCK_WITH_EMOJI : LINES_PER_BLOCK; int blocksCount; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + boolean singleLayout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && totalAnimatedEmojiCount < 50; + if (singleLayout) { blocksCount = 1; } else { - blocksCount = (int) Math.ceil((float) linesCount / LINES_PER_BLOCK); + blocksCount = (int) Math.ceil((float) linesCount / linesPreBlock); } int linesOffset = 0; float prevOffset = 0; for (int a = 0; a < blocksCount; a++) { int currentBlockLinesCount; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if (singleLayout) { currentBlockLinesCount = linesCount; } else { - currentBlockLinesCount = Math.min(LINES_PER_BLOCK, linesCount - linesOffset); + currentBlockLinesCount = Math.min(linesPreBlock, linesCount - linesOffset); } TextLayoutBlock block = new TextLayoutBlock(); @@ -4668,10 +4906,10 @@ public class MessageObject { block.textLayout = StaticLayout.Builder.obtain(sb, 0, sb.length(), paint, maxWidth + AndroidUtilities.dp(2)) .setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY) .setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_NONE) - .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setAlignment(align) .build(); } else { - block.textLayout = new StaticLayout(sb, 0, sb.length(), paint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + block.textLayout = new StaticLayout(sb, 0, sb.length(), paint, maxWidth, align, 1.0f, 0.0f, false); } block.textYOffset = textLayout.getLineTop(linesOffset); @@ -5207,6 +5445,8 @@ public class MessageObject { TLRPC.DocumentAttribute attribute = document.attributes.get(a); if (attribute instanceof TLRPC.TL_documentAttributeSticker) { return attribute.stickerset instanceof TLRPC.TL_inputStickerSetShortName; + } else if (attribute instanceof TLRPC.TL_documentAttributeCustomEmoji) { + return true; } } } @@ -5431,7 +5671,8 @@ public class MessageObject { } for (int a = 0, N = document.attributes.size(); a < N; a++) { TLRPC.DocumentAttribute attribute = document.attributes.get(a); - if (attribute instanceof TLRPC.TL_documentAttributeSticker) { + if (attribute instanceof TLRPC.TL_documentAttributeSticker || + attribute instanceof TLRPC.TL_documentAttributeCustomEmoji) { if (attribute.stickerset instanceof TLRPC.TL_inputStickerSetEmpty) { return null; } @@ -5441,6 +5682,80 @@ public class MessageObject { return null; } + public static String findAnimatedEmojiEmoticon(TLRPC.Document document) { + return findAnimatedEmojiEmoticon(document, "\uD83D\uDE00"); + } + + public static String findAnimatedEmojiEmoticon(TLRPC.Document document, String fallback) { + if (document == null) { + return fallback; + } + for (int a = 0, N = document.attributes.size(); a < N; a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeCustomEmoji || + attribute instanceof TLRPC.TL_documentAttributeSticker) { + return attribute.alt; + } + } + return fallback; + } + + public static boolean isAnimatedEmoji(TLRPC.Document document) { + if (document == null) { + return false; + } + for (int a = 0, N = document.attributes.size(); a < N; a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeCustomEmoji) { + return true; + } + } + return false; + } + + public static boolean isFreeEmoji(TLRPC.Document document) { + if (document == null) { + return false; + } + for (int a = 0, N = document.attributes.size(); a < N; a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeCustomEmoji) { + return ((TLRPC.TL_documentAttributeCustomEmoji) attribute).free; + } + } + return false; + } + + public static boolean isPremiumEmojiPack(TLRPC.TL_messages_stickerSet set) { + if (set != null && set.set != null && !set.set.emojis) { + return false; + } + if (set != null && set.documents != null) { + for (int i = 0; i < set.documents.size(); ++i) { + if (!MessageObject.isFreeEmoji(set.documents.get(i))) { + return true; + } + } + } + return false; + } + + + public static boolean isPremiumEmojiPack(TLRPC.StickerSetCovered covered) { + if (covered != null && covered.set != null && !covered.set.emojis) { + return false; + } + ArrayList documents = covered instanceof TLRPC.TL_stickerSetFullCovered ? ((TLRPC.TL_stickerSetFullCovered) covered).documents : covered.covers; + if (covered != null && documents != null) { + for (int i = 0; i < documents.size(); ++i) { + if (!MessageObject.isFreeEmoji(documents.get(i))) { + return true; + } + } + } + return false; + } + public static long getStickerSetId(TLRPC.Document document) { if (document == null) { return -1; @@ -5504,10 +5819,12 @@ public class MessageObject { return AndroidUtilities.dp(82); } else if (type == 10) { return AndroidUtilities.dp(30); - } else if (type == 11) { + } else if (type == 11 || type == TYPE_GIFT_PREMIUM) { return AndroidUtilities.dp(50); } else if (type == TYPE_ROUND_VIDEO) { return AndroidUtilities.roundMessageSize; + } else if (type == TYPE_EMOJIS) { + return textHeight + AndroidUtilities.dp(30); } else if (type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER) { float maxHeight = AndroidUtilities.displaySize.y * 0.4f; float maxWidth; @@ -5519,12 +5836,14 @@ public class MessageObject { int photoHeight = 0; int photoWidth = 0; TLRPC.Document document = getDocument(); - for (int a = 0, N = document.attributes.size(); a < N; a++) { - TLRPC.DocumentAttribute attribute = document.attributes.get(a); - if (attribute instanceof TLRPC.TL_documentAttributeImageSize) { - photoWidth = attribute.w; - photoHeight = attribute.h; - break; + if (document != null) { + for (int a = 0, N = document.attributes.size(); a < N; a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeImageSize) { + photoWidth = attribute.w; + photoHeight = attribute.h; + break; + } } } if (photoWidth == 0) { @@ -5592,7 +5911,8 @@ public class MessageObject { } for (int a = 0; a < document.attributes.size(); a++) { TLRPC.DocumentAttribute attribute = document.attributes.get(a); - if (attribute instanceof TLRPC.TL_documentAttributeSticker) { + if (attribute instanceof TLRPC.TL_documentAttributeSticker || + attribute instanceof TLRPC.TL_documentAttributeCustomEmoji) { return attribute.alt != null && attribute.alt.length() > 0 ? attribute.alt : null; } } @@ -5604,7 +5924,11 @@ public class MessageObject { } public boolean isAnimatedEmoji() { - return emojiAnimatedSticker != null; + return emojiAnimatedSticker != null || emojiAnimatedStickerId != null; + } + + public boolean isAnimatedAnimatedEmoji() { + return isAnimatedEmoji() && isAnimatedEmoji(getDocument()); } public boolean isDice() { @@ -5644,15 +5968,26 @@ public class MessageObject { if (isSecretChat && messageOwner.stickerVerified != 1) { return false; } + if (emojiAnimatedStickerId != null && emojiAnimatedSticker == null) { + return true; + } return isAnimatedStickerDocument(getDocument(), emojiAnimatedSticker != null || !isSecretChat || isOut()); } public boolean isAnyKindOfSticker() { - return type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER; + return type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER || type == TYPE_EMOJIS; } public boolean shouldDrawWithoutBackground() { - return type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER || type == TYPE_ROUND_VIDEO; + return type == TYPE_STICKER || type == TYPE_ANIMATED_STICKER || type == TYPE_ROUND_VIDEO || type == TYPE_EMOJIS; + } + + public boolean isAnimatedEmojiStickers() { + return type == TYPE_EMOJIS; + } + + public boolean isAnimatedEmojiStickerSingle() { + return emojiAnimatedStickerId != null; } public boolean isLocation() { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index b6d20a927..1c8cd927e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -28,12 +28,12 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.collection.LongSparseArray; import androidx.core.app.NotificationManagerCompat; import androidx.core.util.Consumer; +import com.google.android.exoplayer2.util.Log; + import org.telegram.SQLite.SQLiteCursor; import org.telegram.SQLite.SQLiteException; import org.telegram.SQLite.SQLitePreparedStatement; @@ -52,6 +52,7 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; import org.telegram.ui.ChatRightsEditActivity; import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.JoinCallAlert; import org.telegram.ui.Components.MotionBackgroundDrawable; @@ -373,6 +374,8 @@ public class MessagesController extends BaseController implements NotificationCe public volatile boolean ignoreSetOnline; public boolean premiumLocked; + public NewMessageCallback newMessageCallback; + public void getNextReactionMention(long dialogId, int count, Consumer callback) { final MessagesStorage messagesStorage = getMessagesStorage(); messagesStorage.getStorageQueue().postRunnable(() -> { @@ -1593,7 +1596,11 @@ public class MessagesController extends BaseController implements NotificationCe order = Math.min(order, dialogFilters.get(a).order); } filter.order = order - 1; - dialogFilters.add(0, filter); + if (dialogFilters.get(0).isDefault() && !getUserConfig().isPremium()) { + dialogFilters.add(1, filter); + } else { + dialogFilters.add(0, filter); + } } else { int order = 0; for (int a = 0, N = dialogFilters.size(); a < N; a++) { @@ -2427,7 +2434,7 @@ public class MessagesController extends BaseController implements NotificationCe s = ((TLRPC.TL_jsonString) value.get(i)).value; } if (s != null) { - int type = PremiumPreviewFragment.severStringToFeatureType(s); + int type = PremiumPreviewFragment.serverStringToFeatureType(s); if (type >= 0) { premiumFeaturesTypesToPosition.put(type, i); if (stringBuilder.length() > 0) { @@ -6282,7 +6289,7 @@ public class MessagesController extends BaseController implements NotificationCe lastPasswordCheckTime = currentTime; } if (lastPushRegisterSendTime != 0 && Math.abs(SystemClock.elapsedRealtime() - lastPushRegisterSendTime) >= 3 * 60 * 60 * 1000) { - GcmPushListenerService.sendRegistrationToServer(SharedConfig.pushString); + PushListenerController.sendRegistrationToServer(SharedConfig.pushType, SharedConfig.pushString); } getLocationController().update(); checkPromoInfoInternal(false); @@ -7304,6 +7311,10 @@ public class MessagesController extends BaseController implements NotificationCe AndroidUtilities.runOnUIThread(() -> { putUsers(messagesRes.users, isCache); putChats(messagesRes.chats, isCache); + + if (messagesRes.animatedEmoji != null) { + AnimatedEmojiDrawable.getDocumentFetcher(currentAccount).processDocuments(messagesRes.animatedEmoji); + } int first_unread_final; if (mode == 1) { first_unread_final = 0; @@ -9951,16 +9962,13 @@ public class MessagesController extends BaseController implements NotificationCe if (onSuccess != null) { onSuccess.run(); } - } - if (error != null) { - if (!"CHAT_NOT_MODIFIED".equals(error.text)) { - if (onError != null) { - onError.run(); - } - } else if (response == null) { - if (onSuccess != null) { - onSuccess.run(); - } + } else if (error != null && !"CHAT_NOT_MODIFIED".equals(error.text)) { + if (onError != null) { + onError.run(); + } + } else { + if (onSuccess != null) { + onSuccess.run(); } } }, ConnectionsManager.RequestFlagInvokeAfter); @@ -9977,16 +9985,13 @@ public class MessagesController extends BaseController implements NotificationCe if (onSuccess != null) { onSuccess.run(); } - } - if (error != null) { - if (!"CHAT_NOT_MODIFIED".equals(error.text)) { - if (onError != null) { - onError.run(); - } - } else if (response == null) { - if (onSuccess != null) { - onSuccess.run(); - } + } else if (error != null && !"CHAT_NOT_MODIFIED".equals(error.text)) { + if (onError != null) { + onError.run(); + } + } else { + if (onSuccess != null) { + onSuccess.run(); } } }, ConnectionsManager.RequestFlagInvokeAfter); @@ -10384,7 +10389,7 @@ public class MessagesController extends BaseController implements NotificationCe if (getUserConfig().registeredForPush && SharedConfig.pushString.length() == 0) { TLRPC.TL_account_unregisterDevice req = new TLRPC.TL_account_unregisterDevice(); req.token = SharedConfig.pushString; - req.token_type = 2; + req.token_type = SharedConfig.pushType; for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { UserConfig userConfig = UserConfig.getInstance(a); if (a != currentAccount && userConfig.isClientActivated()) { @@ -10513,7 +10518,7 @@ public class MessagesController extends BaseController implements NotificationCe }); } - public void registerForPush(final String regid) { + public void registerForPush(@PushListenerController.PushType int pushType, String regid) { if (TextUtils.isEmpty(regid) || registeringForPush || getUserConfig().getClientUserId() == 0) { return; } @@ -10528,7 +10533,7 @@ public class MessagesController extends BaseController implements NotificationCe SharedConfig.saveConfig(); } TLRPC.TL_account_registerDevice req = new TLRPC.TL_account_registerDevice(); - req.token_type = 2; + req.token_type = pushType; req.token = regid; req.no_muted = false; req.secret = SharedConfig.pushAuthKey; @@ -10545,10 +10550,11 @@ public class MessagesController extends BaseController implements NotificationCe getConnectionsManager().sendRequest(req, (response, error) -> { if (response instanceof TLRPC.TL_boolTrue) { if (BuildVars.LOGS_ENABLED) { - FileLog.d("account " + currentAccount + " registered for push"); + FileLog.d("account " + currentAccount + " registered for push, push type: " + pushType); } getUserConfig().registeredForPush = true; SharedConfig.pushString = regid; + SharedConfig.pushType = pushType; getUserConfig().saveConfig(false); } AndroidUtilities.runOnUIThread(() -> registeringForPush = false); @@ -11148,7 +11154,7 @@ public class MessagesController extends BaseController implements NotificationCe } public void getDifference(int pts, int date, int qts, boolean slice) { - registerForPush(SharedConfig.pushString); + registerForPush(SharedConfig.pushType, SharedConfig.pushString); if (getMessagesStorage().getLastPtsValue() == 0) { loadCurrentState(); return; @@ -12634,6 +12640,7 @@ public class MessagesController extends BaseController implements NotificationCe LongSparseArray channelForwards = null; LongSparseArray> channelReplies = null; LongSparseIntArray markAsReadMessagesInbox = null; + LongSparseIntArray stillUnreadMessagesCount = null; LongSparseIntArray markAsReadMessagesOutbox = null; LongSparseArray> markContentAsReadMessages = null; SparseIntArray markAsReadEncrypted = null; @@ -12703,6 +12710,9 @@ public class MessagesController extends BaseController implements NotificationCe if (message instanceof TLRPC.TL_messageEmpty) { continue; } + if (newMessageCallback != null && newMessageCallback.onMessageReceived(message)) { + newMessageCallback = null; + } TLRPC.Chat chat = null; long chatId = 0; long userId = 0; @@ -13380,16 +13390,23 @@ public class MessagesController extends BaseController implements NotificationCe } } else if (baseUpdate instanceof TLRPC.TL_updateReadChannelInbox) { TLRPC.TL_updateReadChannelInbox update = (TLRPC.TL_updateReadChannelInbox) baseUpdate; - if (markAsReadMessagesInbox == null) { - markAsReadMessagesInbox = new LongSparseIntArray(); - } + long dialogId = -update.channel_id; - markAsReadMessagesInbox.put(dialogId, update.max_id); Integer value = dialogs_read_inbox_max.get(dialogId); if (value == null) { value = getMessagesStorage().getDialogReadMax(false, dialogId); } - dialogs_read_inbox_max.put(dialogId, Math.max(value, update.max_id)); + if (update.max_id > value || update.still_unread_count != 0) { + if (markAsReadMessagesInbox == null) { + markAsReadMessagesInbox = new LongSparseIntArray(); + } + if (stillUnreadMessagesCount == null) { + stillUnreadMessagesCount = new LongSparseIntArray(); + } + markAsReadMessagesInbox.put(dialogId, update.max_id); + stillUnreadMessagesCount.put(dialogId, update.still_unread_count); + dialogs_read_inbox_max.put(dialogId, Math.max(value, update.max_id)); + } } else if (baseUpdate instanceof TLRPC.TL_updateReadChannelOutbox) { TLRPC.TL_updateReadChannelOutbox update = (TLRPC.TL_updateReadChannelOutbox) baseUpdate; if (BuildVars.LOGS_ENABLED) { @@ -13600,6 +13617,11 @@ public class MessagesController extends BaseController implements NotificationCe updatesOnMainThread = new ArrayList<>(); } updatesOnMainThread.add(baseUpdate); + } else if (baseUpdate instanceof TLRPC.TL_updateReadFeaturedEmojiStickers) { + if (updatesOnMainThread == null) { + updatesOnMainThread = new ArrayList<>(); + } + updatesOnMainThread.add(baseUpdate); } else if (baseUpdate instanceof TLRPC.TL_updatePhoneCall) { if (updatesOnMainThread == null) { updatesOnMainThread = new ArrayList<>(); @@ -13861,6 +13883,8 @@ public class MessagesController extends BaseController implements NotificationCe getContactsController().setPrivacyRules(update.rules, ContactsController.PRIVACY_RULES_TYPE_PHONE); } else if (update.key instanceof TLRPC.TL_privacyKeyAddedByPhone) { getContactsController().setPrivacyRules(update.rules, ContactsController.PRIVACY_RULES_TYPE_ADDED_BY_PHONE); + } else if (update.key instanceof TLRPC.TL_privacyKeyVoiceMessages) { + getContactsController().setPrivacyRules(update.rules, ContactsController.PRIVACY_RULES_TYPE_VOICE_MESSAGES); } } else if (baseUpdate instanceof TLRPC.TL_updateUserStatus) { TLRPC.TL_updateUserStatus update = (TLRPC.TL_updateUserStatus) baseUpdate; @@ -14167,7 +14191,15 @@ public class MessagesController extends BaseController implements NotificationCe getMediaDataController().loadStickers(MediaDataController.TYPE_IMAGE, false, true); } else if (baseUpdate instanceof TLRPC.TL_updateStickerSetsOrder) { TLRPC.TL_updateStickerSetsOrder update = (TLRPC.TL_updateStickerSetsOrder) baseUpdate; - getMediaDataController().reorderStickers(update.masks ? MediaDataController.TYPE_MASK : MediaDataController.TYPE_IMAGE, ((TLRPC.TL_updateStickerSetsOrder) baseUpdate).order); + int type; + if (update.masks) { + type = MediaDataController.TYPE_MASK; + } else if (update.emojis) { + type = MediaDataController.TYPE_EMOJIPACKS; + } else { + type = MediaDataController.TYPE_IMAGE; + } + getMediaDataController().reorderStickers(type, ((TLRPC.TL_updateStickerSetsOrder) baseUpdate).order); } else if (baseUpdate instanceof TLRPC.TL_updateFavedStickers) { getMediaDataController().loadRecents(MediaDataController.TYPE_FAVE, false, false, true); } else if (baseUpdate instanceof TLRPC.TL_updateContactsReset) { @@ -14195,7 +14227,9 @@ public class MessagesController extends BaseController implements NotificationCe } getMediaDataController().saveDraft(did, 0, update.draft, null, true); } else if (baseUpdate instanceof TLRPC.TL_updateReadFeaturedStickers) { - getMediaDataController().markFaturedStickersAsRead(false); + getMediaDataController().markFeaturedStickersAsRead(false, false); + } else if (baseUpdate instanceof TLRPC.TL_updateReadFeaturedEmojiStickers) { + getMediaDataController().markFeaturedStickersAsRead(true, false); } else if (baseUpdate instanceof TLRPC.TL_updatePhoneCallSignalingData) { TLRPC.TL_updatePhoneCallSignalingData data = (TLRPC.TL_updatePhoneCallSignalingData) baseUpdate; VoIPService svc = VoIPService.getSharedInstance(); @@ -14749,9 +14783,9 @@ public class MessagesController extends BaseController implements NotificationCe if (webPages != null) { getMessagesStorage().putWebPages(webPages); } - if (markAsReadMessagesInbox != null || markAsReadMessagesOutbox != null || markAsReadEncrypted != null || markContentAsReadMessages != null) { - if (markAsReadMessagesInbox != null || markAsReadMessagesOutbox != null || markContentAsReadMessages != null) { - getMessagesStorage().updateDialogsWithReadMessages(markAsReadMessagesInbox, markAsReadMessagesOutbox, markContentAsReadMessages, true); + if (markAsReadMessagesInbox != null || markAsReadMessagesOutbox != null || markAsReadEncrypted != null || markContentAsReadMessages != null || stillUnreadMessagesCount != null) { + if (markAsReadMessagesInbox != null || markAsReadMessagesOutbox != null || markContentAsReadMessages != null || stillUnreadMessagesCount != null) { + getMessagesStorage().updateDialogsWithReadMessages(markAsReadMessagesInbox, markAsReadMessagesOutbox, markContentAsReadMessages, stillUnreadMessagesCount, true); } getMessagesStorage().markMessagesAsRead(markAsReadMessagesInbox, markAsReadMessagesOutbox, markAsReadEncrypted, true); } @@ -15416,7 +15450,11 @@ public class MessagesController extends BaseController implements NotificationCe } } - Collections.sort(allDialogs, dialogComparator); + try { + Collections.sort(allDialogs, dialogComparator); + } catch (Exception e) { + + } isLeftPromoChannel = true; if (promoDialog != null && promoDialog.id < 0) { TLRPC.Chat chat = getChat(-promoDialog.id); @@ -16010,4 +16048,8 @@ public class MessagesController extends BaseController implements NotificationCe void onError(); } + + public interface NewMessageCallback { + boolean onMessageReceived(TLRPC.Message message); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index 1e46c1578..efe42924f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -89,7 +89,7 @@ public class MessagesStorage extends BaseController { } } - private final static int LAST_DB_VERSION = 98; + private final static int LAST_DB_VERSION = 100; private boolean databaseMigrationInProgress; public boolean showClearDatabaseAlert; @@ -367,7 +367,7 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE TABLE dialog_settings(did INTEGER PRIMARY KEY, flags INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, document BLOB, PRIMARY KEY (id, type));").stepThis().dispose(); database.executeFast("CREATE TABLE stickers_v2(id INTEGER PRIMARY KEY, data BLOB, date INTEGER, hash INTEGER);").stepThis().dispose(); - database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER, premium INTEGER);").stepThis().dispose(); + database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER, premium INTEGER, emoji INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE stickers_dice(emoji TEXT PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE webpage_pending_v2(id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (id, mid, uid));").stepThis().dispose(); @@ -402,6 +402,7 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_did ON reaction_mentions(dialog_id);").stepThis().dispose(); database.executeFast("CREATE TABLE downloading_documents(data BLOB, hash INTEGER, id INTEGER, state INTEGER, date INTEGER, PRIMARY KEY(hash, id));").stepThis().dispose(); + database.executeFast("CREATE TABLE animated_emoji(document_id INTEGER PRIMARY KEY, data BLOB);").stepThis().dispose(); database.executeFast("CREATE TABLE attach_menu_bots(data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose(); @@ -1599,6 +1600,18 @@ public class MessagesStorage extends BaseController { version = 98; } + if (version == 98) { + database.executeFast("CREATE TABLE animated_emoji(document_id INTEGER PRIMARY KEY, data BLOB);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 99").stepThis().dispose(); + version = 99; + } + + if (version == 99) { + database.executeFast("ALTER TABLE stickers_featured ADD COLUMN emoji INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 100").stepThis().dispose(); + version = 100; + } + FileLog.d("MessagesStorage db migration finished"); AndroidUtilities.runOnUIThread(() -> { databaseMigrationInProgress = false; @@ -2113,17 +2126,19 @@ public class MessagesStorage extends BaseController { } public void clearLocalDatabase() { - MessagesStorage.getInstance(currentAccount).getStorageQueue().postRunnable(() -> { + storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state5 = null; + SQLitePreparedStatement state6 = null; try { - SQLiteDatabase database = MessagesStorage.getInstance(currentAccount).getDatabase(); ArrayList dialogsToCleanup = new ArrayList<>(); database.executeFast("DELETE FROM reaction_mentions").stepThis().dispose(); database.executeFast("DELETE FROM downloading_documents").stepThis().dispose(); database.executeFast("DELETE FROM attach_menu_bots").stepThis().dispose(); + database.executeFast("DELETE FROM animated_emoji").stepThis().dispose(); - SQLiteCursor cursor = database.queryFinalized("SELECT did FROM dialogs WHERE 1"); - StringBuilder ids = new StringBuilder(); + cursor = database.queryFinalized("SELECT did FROM dialogs WHERE 1"); while (cursor.next()) { long did = cursor.longValue(0); if (!DialogObject.isEncryptedDialog(did)) { @@ -2131,9 +2146,10 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; - SQLitePreparedStatement state5 = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); - SQLitePreparedStatement state6 = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); + state5 = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); + state6 = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); database.beginTransaction(); for (int a = 0; a < dialogsToCleanup.size(); a++) { @@ -2183,10 +2199,13 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } state5.dispose(); state6.dispose(); + state5 = null; + state6 = null; database.commitTransaction(); database.executeFast("PRAGMA journal_size_limit = 0").stepThis().dispose(); database.executeFast("VACUUM").stepThis().dispose(); @@ -2194,6 +2213,16 @@ public class MessagesStorage extends BaseController { } catch (Exception e) { FileLog.e(e); } finally { + database.commitTransaction(); + if (state5 != null) { + state5.dispose(); + } + if (state6 != null) { + state6.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } AndroidUtilities.runOnUIThread(() -> { NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.didClearDatabase); getMediaDataController().loadAttachMenuBots(false, true); @@ -2211,13 +2240,13 @@ public class MessagesStorage extends BaseController { public void readAllDialogs(int folderId) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedChatIds = new ArrayList<>(); LongSparseArray dialogs = new LongSparseArray<>(); - SQLiteCursor cursor; if (folderId >= 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT did, last_mid, unread_count, date FROM dialogs WHERE unread_count > 0 AND folder_id = %1$d", folderId)); } else { @@ -2252,6 +2281,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; ArrayList users = new ArrayList<>(); ArrayList chats = new ArrayList<>(); @@ -2277,6 +2307,10 @@ public class MessagesStorage extends BaseController { }); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -2284,126 +2318,135 @@ public class MessagesStorage extends BaseController { private TLRPC.messages_Dialogs loadDialogsByIds(String ids, ArrayList usersToLoad, ArrayList chatsToLoad, ArrayList encryptedToLoad) throws Exception { TLRPC.messages_Dialogs dialogs = new TLRPC.TL_messages_dialogs(); LongSparseArray replyMessageOwners = new LongSparseArray<>(); - - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.did IN (%s) ORDER BY d.pinned DESC, d.date DESC", ids)); - while (cursor.next()) { - long dialogId = cursor.longValue(0); - TLRPC.Dialog dialog = new TLRPC.TL_dialog(); - dialog.id = dialogId; - dialog.top_message = cursor.intValue(1); - dialog.unread_count = cursor.intValue(2); - dialog.last_message_date = cursor.intValue(3); - dialog.pts = cursor.intValue(10); - dialog.flags = dialog.pts == 0 || DialogObject.isUserDialog(dialog.id) ? 0 : 1; - dialog.read_inbox_max_id = cursor.intValue(11); - dialog.read_outbox_max_id = cursor.intValue(12); - dialog.pinnedNum = cursor.intValue(14); - dialog.pinned = dialog.pinnedNum != 0; - dialog.unread_mentions_count = cursor.intValue(15); - int dialog_flags = cursor.intValue(16); - dialog.unread_mark = (dialog_flags & 1) != 0; - long flags = cursor.longValue(8); - int low_flags = (int) flags; - dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); - if ((low_flags & 1) != 0) { - dialog.notify_settings.mute_until = (int) (flags >> 32); - if (dialog.notify_settings.mute_until == 0) { - dialog.notify_settings.mute_until = Integer.MAX_VALUE; - } - } - dialog.folder_id = cursor.intValue(17); - dialog.unread_reactions_count = cursor.intValue(19); - dialogs.dialogs.add(dialog); - - NativeByteBuffer data = cursor.byteBufferValue(4); - if (data != null) { - TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); - if (message != null) { - message.readAttachPath(data, getUserConfig().clientUserId); - data.reuse(); - MessageObject.setUnreadFlags(message, cursor.intValue(5)); - message.id = cursor.intValue(6); - int date = cursor.intValue(9); - if (date != 0) { - dialog.last_message_date = date; + SQLiteCursor cursor = null; + try { + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.did IN (%s) ORDER BY d.pinned DESC, d.date DESC", ids)); + while (cursor.next()) { + long dialogId = cursor.longValue(0); + TLRPC.Dialog dialog = new TLRPC.TL_dialog(); + dialog.id = dialogId; + dialog.top_message = cursor.intValue(1); + dialog.unread_count = cursor.intValue(2); + dialog.last_message_date = cursor.intValue(3); + dialog.pts = cursor.intValue(10); + dialog.flags = dialog.pts == 0 || DialogObject.isUserDialog(dialog.id) ? 0 : 1; + dialog.read_inbox_max_id = cursor.intValue(11); + dialog.read_outbox_max_id = cursor.intValue(12); + dialog.pinnedNum = cursor.intValue(14); + dialog.pinned = dialog.pinnedNum != 0; + dialog.unread_mentions_count = cursor.intValue(15); + int dialog_flags = cursor.intValue(16); + dialog.unread_mark = (dialog_flags & 1) != 0; + long flags = cursor.longValue(8); + int low_flags = (int) flags; + dialog.notify_settings = new TLRPC.TL_peerNotifySettings(); + if ((low_flags & 1) != 0) { + dialog.notify_settings.mute_until = (int) (flags >> 32); + if (dialog.notify_settings.mute_until == 0) { + dialog.notify_settings.mute_until = Integer.MAX_VALUE; } - message.send_state = cursor.intValue(7); - message.dialog_id = dialog.id; - dialogs.messages.add(message); + } + dialog.folder_id = cursor.intValue(17); + dialog.unread_reactions_count = cursor.intValue(19); + dialogs.dialogs.add(dialog); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); - - try { - if (message.reply_to != null && message.reply_to.reply_to_msg_id != 0 && ( - message.action instanceof TLRPC.TL_messageActionPinMessage || - message.action instanceof TLRPC.TL_messageActionPaymentSent || - message.action instanceof TLRPC.TL_messageActionGameScore)) { - if (!cursor.isNull(13)) { - NativeByteBuffer data2 = cursor.byteBufferValue(13); - if (data2 != null) { - message.replyMessage = TLRPC.Message.TLdeserialize(data2, data2.readInt32(false), false); - message.replyMessage.readAttachPath(data2, getUserConfig().clientUserId); - data2.reuse(); - if (message.replyMessage != null) { - addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad); - } - } - } - if (message.replyMessage == null) { - replyMessageOwners.put(dialog.id, message); - } - } - } catch (Exception e) { - FileLog.e(e); - } - } else { - data.reuse(); - } - } - if (!DialogObject.isEncryptedDialog(dialogId)) { - if (dialog.read_inbox_max_id > dialog.top_message) { - dialog.read_inbox_max_id = 0; - } - } - if (DialogObject.isEncryptedDialog(dialogId)) { - int encryptedChatId = DialogObject.getEncryptedChatId(dialogId); - if (!encryptedToLoad.contains(encryptedChatId)) { - encryptedToLoad.add(encryptedChatId); - } - } else if (DialogObject.isUserDialog(dialogId)) { - if (!usersToLoad.contains(dialogId)) { - usersToLoad.add(dialogId); - } - } else { - if (!chatsToLoad.contains(-dialogId)) { - chatsToLoad.add(-dialogId); - } - } - } - cursor.dispose(); - - if (!replyMessageOwners.isEmpty()) { - for (int a = 0, N = replyMessageOwners.size(); a < N; a++) { - long dialogId = replyMessageOwners.keyAt(a); - TLRPC.Message ownerMessage = replyMessageOwners.valueAt(a); - SQLiteCursor replyCursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM messages_v2 WHERE mid = %d and uid = %d", ownerMessage.id, dialogId)); - while (replyCursor.next()) { - NativeByteBuffer data = replyCursor.byteBufferValue(0); - if (data != null) { - TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + NativeByteBuffer data = cursor.byteBufferValue(4); + if (data != null) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + if (message != null) { message.readAttachPath(data, getUserConfig().clientUserId); data.reuse(); - message.id = replyCursor.intValue(1); - message.date = replyCursor.intValue(2); - message.dialog_id = replyCursor.longValue(3); + MessageObject.setUnreadFlags(message, cursor.intValue(5)); + message.id = cursor.intValue(6); + int date = cursor.intValue(9); + if (date != 0) { + dialog.last_message_date = date; + } + message.send_state = cursor.intValue(7); + message.dialog_id = dialog.id; + dialogs.messages.add(message); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); - ownerMessage.replyMessage = message; - message.dialog_id = ownerMessage.dialog_id; + try { + if (message.reply_to != null && message.reply_to.reply_to_msg_id != 0 && ( + message.action instanceof TLRPC.TL_messageActionPinMessage || + message.action instanceof TLRPC.TL_messageActionPaymentSent || + message.action instanceof TLRPC.TL_messageActionGameScore)) { + if (!cursor.isNull(13)) { + NativeByteBuffer data2 = cursor.byteBufferValue(13); + if (data2 != null) { + message.replyMessage = TLRPC.Message.TLdeserialize(data2, data2.readInt32(false), false); + message.replyMessage.readAttachPath(data2, getUserConfig().clientUserId); + data2.reuse(); + if (message.replyMessage != null) { + addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad, null); + } + } + } + if (message.replyMessage == null) { + replyMessageOwners.put(dialog.id, message); + } + } + } catch (Exception e) { + FileLog.e(e); + } + } else { + data.reuse(); } } - replyCursor.dispose(); + if (!DialogObject.isEncryptedDialog(dialogId)) { + if (dialog.read_inbox_max_id > dialog.top_message) { + dialog.read_inbox_max_id = 0; + } + } + if (DialogObject.isEncryptedDialog(dialogId)) { + int encryptedChatId = DialogObject.getEncryptedChatId(dialogId); + if (!encryptedToLoad.contains(encryptedChatId)) { + encryptedToLoad.add(encryptedChatId); + } + } else if (DialogObject.isUserDialog(dialogId)) { + if (!usersToLoad.contains(dialogId)) { + usersToLoad.add(dialogId); + } + } else { + if (!chatsToLoad.contains(-dialogId)) { + chatsToLoad.add(-dialogId); + } + } + } + cursor.dispose(); + cursor = null; + + if (!replyMessageOwners.isEmpty()) { + for (int a = 0, N = replyMessageOwners.size(); a < N; a++) { + long dialogId = replyMessageOwners.keyAt(a); + TLRPC.Message ownerMessage = replyMessageOwners.valueAt(a); + SQLiteCursor replyCursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM messages_v2 WHERE mid = %d and uid = %d", ownerMessage.id, dialogId)); + while (replyCursor.next()) { + NativeByteBuffer data = replyCursor.byteBufferValue(0); + if (data != null) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + message.readAttachPath(data, getUserConfig().clientUserId); + data.reuse(); + message.id = replyCursor.intValue(1); + message.date = replyCursor.intValue(2); + message.dialog_id = replyCursor.longValue(3); + + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); + + ownerMessage.replyMessage = message; + message.dialog_id = ownerMessage.dialog_id; + } + } + replyCursor.dispose(); + } + } + } catch (Exception e) { + throw e; + } finally { + if (cursor != null) { + cursor.dispose(); } } return dialogs; @@ -2411,6 +2454,8 @@ public class MessagesStorage extends BaseController { private void loadDialogFilters() { storageQueue.postRunnable(() -> { + SQLiteCursor filtersCursor = null; + SQLitePreparedStatement state = null; try { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); @@ -2420,7 +2465,7 @@ public class MessagesStorage extends BaseController { usersToLoad.add(getUserConfig().getClientUserId()); - SQLiteCursor filtersCursor = database.queryFinalized("SELECT id, ord, unread_count, flags, title FROM dialog_filter WHERE 1"); + filtersCursor = database.queryFinalized("SELECT id, ord, unread_count, flags, title FROM dialog_filter WHERE 1"); boolean updateCounters = false; boolean hasDefaultFilter = false; @@ -2485,6 +2530,7 @@ public class MessagesStorage extends BaseController { } } filtersCursor.dispose(); + filtersCursor = null; if (!hasDefaultFilter) { MessagesController.DialogFilter filter = new MessagesController.DialogFilter(); @@ -2498,13 +2544,14 @@ public class MessagesStorage extends BaseController { dialogFiltersMap.put(filter.id, filter); filtersById.put(filter.id, filter); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO dialog_filter VALUES(?, ?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO dialog_filter VALUES(?, ?, ?, ?, ?)"); state.bindInteger(1, filter.id); state.bindInteger(2, filter.order); state.bindInteger(3, filter.unreadCount); state.bindInteger(4, filter.flags); state.bindString(5, filter.name); state.stepThis().dispose(); + state = null; } Collections.sort(dialogFilters, (o1, o2) -> { @@ -2544,6 +2591,13 @@ public class MessagesStorage extends BaseController { getMessagesController().processLoadedDialogFilters(new ArrayList<>(dialogFilters), dialogs, null, users, chats, encryptedChats, 0); } catch (Exception e) { FileLog.e(e); + } finally { + if (filtersCursor != null) { + filtersCursor.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } @@ -2559,6 +2613,7 @@ public class MessagesStorage extends BaseController { private LongSparseArray dialogsWithUnread = new LongSparseArray<>(); private void calcUnreadCounters(boolean apply) { + SQLiteCursor cursor = null; try { for (int a = 0; a < 2; a++) { for (int b = 0; b < 2; b++) { @@ -2575,7 +2630,7 @@ public class MessagesStorage extends BaseController { ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedToLoad = new ArrayList<>(); LongSparseIntArray dialogsByFolders = new LongSparseIntArray(); - SQLiteCursor cursor = database.queryFinalized("SELECT did, folder_id, unread_count, unread_count_i FROM dialogs WHERE unread_count > 0 OR flags > 0 UNION ALL " + + cursor = database.queryFinalized("SELECT did, folder_id, unread_count, unread_count_i FROM dialogs WHERE unread_count > 0 OR flags > 0 UNION ALL " + "SELECT did, folder_id, unread_count, unread_count_i FROM dialogs WHERE unread_count_i > 0"); while (cursor.next()) { int folderId = cursor.intValue(1); @@ -2608,6 +2663,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; LongSparseArray usersDict = new LongSparseArray<>(); LongSparseArray chatsDict = new LongSparseArray<>(); LongSparseArray encUsersDict = new LongSparseArray<>(); @@ -2924,10 +2980,15 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } } private void saveDialogFilterInternal(MessagesController.DialogFilter filter, boolean atBegin, boolean peers) { + SQLitePreparedStatement state = null; try { if (!dialogFilters.contains(filter)) { if (atBegin) { @@ -2938,7 +2999,7 @@ public class MessagesStorage extends BaseController { dialogFiltersMap.put(filter.id, filter); } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO dialog_filter VALUES(?, ?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO dialog_filter VALUES(?, ?, ?, ?, ?)"); state.bindInteger(1, filter.id); state.bindInteger(2, filter.order); state.bindInteger(3, filter.unreadCount); @@ -2946,6 +3007,7 @@ public class MessagesStorage extends BaseController { state.bindString(5, filter.id == 0 ? "ALL_CHATS" : filter.name); state.step(); state.dispose(); + state = null; if (peers) { database.executeFast("DELETE FROM dialog_filter_ep WHERE id = " + filter.id).stepThis().dispose(); database.executeFast("DELETE FROM dialog_filter_pin_v2 WHERE id = " + filter.id).stepThis().dispose(); @@ -2971,6 +3033,7 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; state = database.executeFast("REPLACE INTO dialog_filter_ep VALUES(?, ?)"); for (int a = 0, N = filter.neverShow.size(); a < N; a++) { @@ -2980,10 +3043,16 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; database.commitTransaction(); } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } } @@ -3380,8 +3449,9 @@ public class MessagesStorage extends BaseController { } public void saveDialogFiltersOrderInternal() { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE dialog_filter SET ord = ?, flags = ? WHERE id = ?"); + state = database.executeFast("UPDATE dialog_filter SET ord = ?, flags = ? WHERE id = ?"); for (int a = 0, N = dialogFilters.size(); a < N; a++) { MessagesController.DialogFilter filter = dialogFilters.get(a); state.requery(); @@ -3391,8 +3461,13 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } } @@ -3446,47 +3521,56 @@ public class MessagesStorage extends BaseController { if (ids == null) { continue; } - SQLiteCursor cursor; - if (scheduled) { - cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM scheduled_messages_v2 WHERE mid IN(%s) AND uid = %d", TextUtils.join(",", ids), dialogId)); - } else { - cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM messages_v2 WHERE mid IN(%s) AND uid = %d", TextUtils.join(",", ids), dialogId)); - } - while (cursor.next()) { - NativeByteBuffer data = cursor.byteBufferValue(0); - if (data != null) { - TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); - message.readAttachPath(data, getUserConfig().clientUserId); - data.reuse(); - message.id = cursor.intValue(1); - message.date = cursor.intValue(2); - message.dialog_id = cursor.longValue(3); + SQLiteCursor cursor = null; + try { + if (scheduled) { + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM scheduled_messages_v2 WHERE mid IN(%s) AND uid = %d", TextUtils.join(",", ids), dialogId)); + } else { + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid FROM messages_v2 WHERE mid IN(%s) AND uid = %d", TextUtils.join(",", ids), dialogId)); + } + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(0); + if (data != null) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + message.readAttachPath(data, getUserConfig().clientUserId); + data.reuse(); + message.id = cursor.intValue(1); + message.date = cursor.intValue(2); + message.dialog_id = cursor.longValue(3); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); - ArrayList arrayList = owners.get(message.id); - if (arrayList != null) { - for (int a = 0, N = arrayList.size(); a < N; a++) { - TLRPC.Message m = arrayList.get(a); - m.replyMessage = message; - MessageObject.getDialogId(message); + ArrayList arrayList = owners.get(message.id); + if (arrayList != null) { + for (int a = 0, N = arrayList.size(); a < N; a++) { + TLRPC.Message m = arrayList.get(a); + m.replyMessage = message; + MessageObject.getDialogId(message); + } } } } + cursor.dispose(); + } catch (Exception e) { + throw e; + } finally { + if (cursor != null) { + cursor.dispose(); + } } - cursor.dispose(); } } public void loadUnreadMessages() { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedChatIds = new ArrayList<>(); LongSparseArray pushDialogs = new LongSparseArray<>(); - SQLiteCursor cursor = database.queryFinalized("SELECT d.did, d.unread_count, s.flags FROM dialogs as d LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.unread_count > 0"); + cursor = database.queryFinalized("SELECT d.did, d.unread_count, s.flags FROM dialogs as d LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.unread_count > 0"); StringBuilder ids = new StringBuilder(); int currentTime = getConnectionsManager().getCurrentTime(); while (cursor.next()) { @@ -3521,6 +3605,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; LongSparseArray>> replyMessageOwners = new LongSparseArray<>(); LongSparseArray> dialogReplyMessagesIds = new LongSparseArray<>(); @@ -3545,7 +3630,7 @@ public class MessagesStorage extends BaseController { messages.add(message); maxDate = Math.max(maxDate, message.date); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); message.send_state = cursor.intValue(2); if (message.peer_id.channel_id == 0 && !MessageObject.isUnread(message) && !DialogObject.isEncryptedDialog(message.dialog_id) || message.id > 0) { message.send_state = 0; @@ -3566,7 +3651,7 @@ public class MessagesStorage extends BaseController { message.replyMessage.readAttachPath(data, getUserConfig().clientUserId); data.reuse(); if (message.replyMessage != null) { - addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad, null); } } } @@ -3580,6 +3665,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; database.executeFast("DELETE FROM unread_push_messages WHERE date <= " + maxDate).stepThis().dispose(); cursor = database.queryFinalized("SELECT data, mid, date, uid, random, fm, name, uname, flags FROM unread_push_messages WHERE 1 ORDER BY date DESC LIMIT 50"); @@ -3613,10 +3699,11 @@ public class MessagesStorage extends BaseController { } pushMessages.add(new MessageObject(currentAccount, message, messageText, name, userName, (flags & 1) != 0, (flags & 2) != 0, (message.flags & 0x80000000) != 0, false)); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); } } cursor.dispose(); + cursor = null; loadReplyMessages(replyMessageOwners, dialogReplyMessagesIds, usersToLoad, chatsToLoad, false); @@ -3654,18 +3741,23 @@ public class MessagesStorage extends BaseController { AndroidUtilities.runOnUIThread(() -> getNotificationsController().processLoadedUnreadMessages(pushDialogs, messages, pushMessages, users, chats, encryptedChats)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void putWallpapers(ArrayList wallPapers, int action) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { if (action == 1) { database.executeFast("DELETE FROM wallpapers2 WHERE num >= -1").stepThis().dispose(); } database.beginTransaction(); - SQLitePreparedStatement state; + if (action != 0) { state = database.executeFast("REPLACE INTO wallpapers2 VALUES(?, ?, ?)"); } else { @@ -3692,9 +3784,15 @@ public class MessagesStorage extends BaseController { data.reuse(); } state.dispose(); + state = null; database.commitTransaction(); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } @@ -3741,9 +3839,10 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { if (document != null) { - SQLitePreparedStatement state = database.executeFast("UPDATE web_recent_v3 SET document = ? WHERE image_url = ?"); + state = database.executeFast("UPDATE web_recent_v3 SET document = ? WHERE image_url = ?"); state.requery(); NativeByteBuffer data = new NativeByteBuffer(document.getObjectSize()); document.serializeToStream(data); @@ -3753,7 +3852,7 @@ public class MessagesStorage extends BaseController { state.dispose(); data.reuse(); } else { - SQLitePreparedStatement state = database.executeFast("UPDATE web_recent_v3 SET local_url = ? WHERE image_url = ?"); + state = database.executeFast("UPDATE web_recent_v3 SET local_url = ? WHERE image_url = ?"); state.requery(); state.bindString(1, localUrl); state.bindString(2, imageUrl); @@ -3762,15 +3861,20 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void deleteUserChatHistory(long dialogId, long fromId) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { ArrayList mids = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + dialogId); + cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + dialogId); ArrayList filesToDelete = new ArrayList<>(); ArrayList namesToDelete = new ArrayList<>(); ArrayList> idsToDelete = new ArrayList<>(); @@ -3793,6 +3897,7 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } cursor.dispose(); + cursor = null; deleteFromDownloadQueue(idsToDelete, true); AndroidUtilities.runOnUIThread(() -> { getFileLoader().cancelLoadFiles(namesToDelete); @@ -3806,6 +3911,10 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -3891,20 +4000,25 @@ public class MessagesStorage extends BaseController { public void deleteDialog(long did, int messagesOnly) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLiteCursor cursor2 = null; + SQLitePreparedStatement state5 = null; + SQLitePreparedStatement state6 = null; try { if (messagesOnly == 3) { int lastMid = -1; - SQLiteCursor cursor = database.queryFinalized("SELECT last_mid FROM dialogs WHERE did = " + did); + cursor = database.queryFinalized("SELECT last_mid FROM dialogs WHERE did = " + did); if (cursor.next()) { lastMid = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (lastMid != 0) { return; } } if (DialogObject.isEncryptedDialog(did) || messagesOnly == 2) { - SQLiteCursor cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + did); + cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + did); ArrayList filesToDelete = new ArrayList<>(); ArrayList namesToDelete = new ArrayList<>(); ArrayList> idsToDelete = new ArrayList<>(); @@ -3922,6 +4036,7 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } cursor.dispose(); + cursor = null; deleteFromDownloadQueue(idsToDelete, true); AndroidUtilities.runOnUIThread(() -> getFileLoader().cancelLoadFiles(namesToDelete)); getFileLoader().deleteFiles(filesToDelete, messagesOnly); @@ -3941,12 +4056,12 @@ public class MessagesStorage extends BaseController { database.executeFast("DELETE FROM enc_chats WHERE uid = " + DialogObject.getEncryptedChatId(did)).stepThis().dispose(); } } else if (messagesOnly == 2) { - SQLiteCursor cursor = database.queryFinalized("SELECT last_mid_i, last_mid FROM dialogs WHERE did = " + did); + cursor = database.queryFinalized("SELECT last_mid_i, last_mid FROM dialogs WHERE did = " + did); int messageId = -1; if (cursor.next()) { long last_mid_i = cursor.longValue(0); long last_mid = cursor.longValue(1); - SQLiteCursor cursor2 = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + did + " AND mid IN (" + last_mid_i + "," + last_mid + ")"); + cursor2 = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + did + " AND mid IN (" + last_mid_i + "," + last_mid + ")"); try { while (cursor2.next()) { NativeByteBuffer data = cursor2.byteBufferValue(0); @@ -3965,6 +4080,7 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } cursor2.dispose(); + cursor2 = null; database.executeFast("DELETE FROM messages_v2 WHERE uid = " + did + " AND mid != " + last_mid_i + " AND mid != " + last_mid).stepThis().dispose(); database.executeFast("DELETE FROM messages_holes WHERE uid = " + did).stepThis().dispose(); @@ -3974,16 +4090,19 @@ public class MessagesStorage extends BaseController { database.executeFast("DELETE FROM media_holes_v2 WHERE uid = " + did).stepThis().dispose(); getMediaDataController().clearBotKeyboard(did, null); - SQLitePreparedStatement state5 = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); - SQLitePreparedStatement state6 = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); + state5 = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); + state6 = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); if (messageId != -1) { createFirstHoles(did, state5, state6, messageId); } state5.dispose(); + state5 = null; state6.dispose(); + state6 = null; updateWidgets(did); } cursor.dispose(); + cursor = null; return; } @@ -4000,6 +4119,19 @@ public class MessagesStorage extends BaseController { updateWidgets(did); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (cursor2 != null) { + cursor2.dispose(); + } + if (state5 != null) { + state5.dispose(); + } + if (state6 != null) { + state6.dispose(); + } } }); } @@ -4016,8 +4148,8 @@ public class MessagesStorage extends BaseController { public void getDialogPhotos(long did, int count, int maxId, int classGuid) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor; if (maxId != 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM user_photos WHERE uid = %d AND id < %d ORDER BY rowid ASC LIMIT %d", did, maxId, count)); @@ -4042,10 +4174,15 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; Utilities.stageQueue.postRunnable(() -> getMessagesController().processLoadedUserPhotos(res, messages, did, count, maxId, true, classGuid)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -4072,6 +4209,7 @@ public class MessagesStorage extends BaseController { public void resetDialogs(TLRPC.messages_Dialogs dialogsRes, int messagesCount, int seq, int newPts, int date, int qts, LongSparseArray new_dialogs_dict, LongSparseArray new_dialogMessage, TLRPC.Message lastMessage, int dialogsCount) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { int maxPinnedNum = 0; @@ -4087,7 +4225,7 @@ public class MessagesStorage extends BaseController { orderArrayList.add(dialog.id); } - SQLiteCursor cursor = database.queryFinalized("SELECT did, pinned FROM dialogs WHERE 1"); + cursor = database.queryFinalized("SELECT did, pinned FROM dialogs WHERE 1"); while (cursor.next()) { long did = cursor.longValue(0); int pinnedNum = cursor.intValue(1); @@ -4114,6 +4252,7 @@ public class MessagesStorage extends BaseController { oldPinnedOrder.add(0, 0L); } cursor.dispose(); + cursor = null; String ids = "(" + TextUtils.join(",", dids) + ")"; database.beginTransaction(); @@ -4217,6 +4356,11 @@ public class MessagesStorage extends BaseController { getMessagesController().completeDialogsReset(dialogsRes, messagesCount, seq, newPts, date, qts, new_dialogs_dict, new_dialogMessage, lastMessage); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -4226,9 +4370,10 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.executeFast("DELETE FROM user_photos WHERE uid = " + did).stepThis().dispose(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO user_photos VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO user_photos VALUES(?, ?, ?)"); for (int a = 0, N = photos.photos.size(); a < N; a++) { TLRPC.Photo photo = photos.photos.get(a); if (photo instanceof TLRPC.TL_photoEmpty) { @@ -4251,20 +4396,27 @@ public class MessagesStorage extends BaseController { data.reuse(); } state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void emptyMessagesMedia(long dialogId, ArrayList mids) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { ArrayList filesToDelete = new ArrayList<>(); ArrayList namesToDelete = new ArrayList<>(); ArrayList> idsToDelete = new ArrayList<>(); ArrayList messages = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid, custom_params FROM messages_v2 WHERE mid IN (%s) AND uid = %d", TextUtils.join(",", mids), dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid, date, uid, custom_params FROM messages_v2 WHERE mid IN (%s) AND uid = %d", TextUtils.join(",", mids), dialogId)); while (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -4295,9 +4447,10 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; deleteFromDownloadQueue(idsToDelete, true); if (!messages.isEmpty()) { - SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); + state = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); for (int a = 0; a < messages.size(); a++) { TLRPC.Message message = messages.get(a); @@ -4358,6 +4511,7 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; AndroidUtilities.runOnUIThread(() -> { for (int a = 0; a < messages.size(); a++) { getNotificationCenter().postNotificationName(NotificationCenter.updateMessageMedia, messages.get(a)); @@ -4368,15 +4522,23 @@ public class MessagesStorage extends BaseController { getFileLoader().deleteFiles(filesToDelete, 0); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } public void updateMessagePollResults(long pollId, TLRPC.Poll poll, TLRPC.PollResults results) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { LongSparseArray> dialogs = null; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, mid FROM polls_v2 WHERE id = %d", pollId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, mid FROM polls_v2 WHERE id = %d", pollId)); while (cursor.next()) { long dialogId = cursor.longValue(0); if (dialogs == null) { @@ -4390,6 +4552,7 @@ public class MessagesStorage extends BaseController { mids.add(cursor.intValue(1)); } cursor.dispose(); + cursor = null; if (dialogs != null) { database.beginTransaction(); SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET data = ? WHERE mid = ? AND uid = ?"); @@ -4435,15 +4598,20 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void updateMessageReactions(long dialogId, int msgId, TLRPC.TL_messageReactions reactions) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { database.beginTransaction(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM messages_v2 WHERE mid = %d AND uid = %d", msgId, dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM messages_v2 WHERE mid = %d AND uid = %d", msgId, dialogId)); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -4468,15 +4636,22 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; database.commitTransaction(); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (cursor != null) { + cursor.dispose(); + } } }); } public void updateMessageVoiceTranscriptionOpen(long dialogId, int msgId, TLRPC.Message saveFromMessage) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.beginTransaction(); TLRPC.Message message = getMessageWithCustomParamsOnly(msgId, dialogId); @@ -4485,7 +4660,7 @@ public class MessagesStorage extends BaseController { message.voiceTranscriptionFinal = saveFromMessage.voiceTranscriptionFinal; message.voiceTranscriptionId = saveFromMessage.voiceTranscriptionId; - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); state.requery(); NativeByteBuffer nativeByteBuffer = MessageCustomParamsHelper.writeLocalParams(message); if (nativeByteBuffer != null) { @@ -4497,18 +4672,25 @@ public class MessagesStorage extends BaseController { state.bindLong(3, dialogId); state.step(); state.dispose(); + state = null; if (nativeByteBuffer != null) { nativeByteBuffer.reuse(); } database.commitTransaction(); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } public void updateMessageVoiceTranscription(long dialogId, int messageId, String text, long transcriptionId, boolean isFinal) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.beginTransaction(); TLRPC.Message message = getMessageWithCustomParamsOnly(messageId, dialogId); @@ -4516,7 +4698,7 @@ public class MessagesStorage extends BaseController { message.voiceTranscriptionId = transcriptionId; message.voiceTranscription = text; - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); state.requery(); NativeByteBuffer nativeByteBuffer = MessageCustomParamsHelper.writeLocalParams(message); if (nativeByteBuffer != null) { @@ -4528,18 +4710,25 @@ public class MessagesStorage extends BaseController { state.bindLong(3, dialogId); state.step(); state.dispose(); + state = null; database.commitTransaction(); if (nativeByteBuffer != null) { nativeByteBuffer.reuse(); } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } public void updateMessageVoiceTranscription(long dialogId, int messageId, String text, TLRPC.Message saveFromMessage) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.beginTransaction(); TLRPC.Message message = getMessageWithCustomParamsOnly(messageId, dialogId); @@ -4549,7 +4738,7 @@ public class MessagesStorage extends BaseController { message.voiceTranscriptionId = saveFromMessage.voiceTranscriptionId; message.voiceTranscription = text; - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); state.requery(); NativeByteBuffer nativeByteBuffer = MessageCustomParamsHelper.writeLocalParams(message); if (nativeByteBuffer != null) { @@ -4561,24 +4750,31 @@ public class MessagesStorage extends BaseController { state.bindLong(3, dialogId); state.step(); state.dispose(); + state = null; database.commitTransaction(); if (nativeByteBuffer != null) { nativeByteBuffer.reuse(); } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } public void updateMessageCustomParams(long dialogId, TLRPC.Message saveFromMessage) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.beginTransaction(); TLRPC.Message message = getMessageWithCustomParamsOnly(saveFromMessage.id, dialogId); MessageCustomParamsHelper.copyParams(saveFromMessage, message); - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET custom_params = ? WHERE mid = ? AND uid = ?"); state.requery(); NativeByteBuffer nativeByteBuffer = MessageCustomParamsHelper.writeLocalParams(message); if (nativeByteBuffer != null) { @@ -4590,32 +4786,45 @@ public class MessagesStorage extends BaseController { state.bindLong(3, dialogId); state.step(); state.dispose(); + state = null; database.commitTransaction(); if (nativeByteBuffer != null) { nativeByteBuffer.reuse(); } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } private TLRPC.Message getMessageWithCustomParamsOnly(int messageId, long dialogId) { TLRPC.Message message = new TLRPC.TL_message(); + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT custom_params FROM messages_v2 WHERE mid = " + messageId + " AND uid = " + dialogId); + cursor = database.queryFinalized("SELECT custom_params FROM messages_v2 WHERE mid = " + messageId + " AND uid = " + dialogId); if (cursor.next()) { MessageCustomParamsHelper.readLocalParams(message, cursor.byteBufferValue(0)); } cursor.dispose(); + cursor = null; } catch (SQLiteException e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } return message; } public void getNewTask(LongSparseArray> oldTask, LongSparseArray> oldTaskMedia) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { if (oldTask != null) { for (int a = 0, N = oldTask.size(); a < N; a++) { @@ -4630,7 +4839,7 @@ public class MessagesStorage extends BaseController { int date = 0; LongSparseArray> newTask = null; LongSparseArray> newTaskMedia = null; - SQLiteCursor cursor = database.queryFinalized("SELECT mid, date, media, uid FROM enc_tasks_v4 WHERE date = (SELECT min(date) FROM enc_tasks_v4)"); + cursor = database.queryFinalized("SELECT mid, date, media, uid FROM enc_tasks_v4 WHERE date = (SELECT min(date) FROM enc_tasks_v4)"); while (cursor.next()) { int mid = cursor.intValue(0); date = cursor.intValue(1); @@ -4662,24 +4871,31 @@ public class MessagesStorage extends BaseController { arr.add(mid); } cursor.dispose(); + cursor = null; getMessagesController().processLoadedDeleteTask(date, newTask, newTaskMedia); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void markMentionMessageAsRead(long dialogId, int messageId, long did) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET read_state = read_state | 2 WHERE mid = %d AND uid = %d", messageId, dialogId)).stepThis().dispose(); - SQLiteCursor cursor = database.queryFinalized("SELECT unread_count_i FROM dialogs WHERE did = " + did); + cursor = database.queryFinalized("SELECT unread_count_i FROM dialogs WHERE did = " + did); int old_mentions_count = 0; if (cursor.next()) { old_mentions_count = Math.max(0, cursor.intValue(0) - 1); } cursor.dispose(); + cursor = null; database.executeFast(String.format(Locale.US, "UPDATE dialogs SET unread_count_i = %d WHERE did = %d", old_mentions_count, did)).stepThis().dispose(); LongSparseIntArray sparseArray = new LongSparseIntArray(1); sparseArray.put(did, old_mentions_count); @@ -4689,6 +4905,10 @@ public class MessagesStorage extends BaseController { getMessagesController().processDialogsUpdateRead(null, sparseArray); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -4705,13 +4925,15 @@ public class MessagesStorage extends BaseController { public void resetMentionsCount(long did, int count) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { int prevUnreadCount = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT unread_count_i FROM dialogs WHERE did = " + did); + cursor = database.queryFinalized("SELECT unread_count_i FROM dialogs WHERE did = " + did); if (cursor.next()) { prevUnreadCount = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (prevUnreadCount != 0 || count != 0) { if (count == 0) { database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET read_state = read_state | 2 WHERE uid = %d AND mention = 1 AND read_state IN(0, 1)", did)).stepThis().dispose(); @@ -4726,12 +4948,17 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void createTaskForMid(long dialogId, int messageId, int time, int readTime, int ttl, boolean inner) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { int minDate = Math.max(time, readTime) + ttl; SparseArray> messages = new SparseArray<>(); @@ -4747,7 +4974,7 @@ public class MessagesStorage extends BaseController { getNotificationCenter().postNotificationName(NotificationCenter.messagesReadContent, dialogId, midsArray); }); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)"); for (int a = 0; a < messages.size(); a++) { int key = messages.keyAt(a); ArrayList arr = messages.get(key); @@ -4761,23 +4988,29 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET ttl = 0 WHERE mid = %d AND uid = %d", messageId, dialogId)).stepThis().dispose(); getMessagesController().didAddedNewTask(minDate, dialogId, messages); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void createTaskForSecretChat(int chatId, int time, int readTime, int isOut, ArrayList random_ids) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { long dialogId = DialogObject.makeEncryptedDialogId(chatId); int minDate = Integer.MAX_VALUE; SparseArray> messages = new SparseArray<>(); ArrayList midsArray = new ArrayList<>(); StringBuilder mids = new StringBuilder(); - SQLiteCursor cursor; if (random_ids == null) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, ttl FROM messages_v2 WHERE uid = %d AND out = %d AND read_state > 0 AND ttl > 0 AND date <= %d AND send_state = 0 AND media != 1", dialogId, isOut, time)); } else { @@ -4807,6 +5040,7 @@ public class MessagesStorage extends BaseController { arr.add(mid); } cursor.dispose(); + cursor = null; if (random_ids != null) { AndroidUtilities.runOnUIThread(() -> { @@ -4817,7 +5051,7 @@ public class MessagesStorage extends BaseController { if (messages.size() != 0) { database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)"); for (int a = 0; a < messages.size(); a++) { int key = messages.keyAt(a); ArrayList arr = messages.get(key); @@ -4831,12 +5065,21 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; database.commitTransaction(); database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET ttl = 0 WHERE mid IN(%s) AND uid = %d", mids.toString(), dialogId)).stepThis().dispose(); getMessagesController().didAddedNewTask(minDate, dialogId, messages); } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -5458,7 +5701,7 @@ public class MessagesStorage extends BaseController { }); } - private void updateDialogsWithReadMessagesInternal(ArrayList messages, LongSparseIntArray inbox, LongSparseIntArray outbox, LongSparseArray> mentions) { + private void updateDialogsWithReadMessagesInternal(ArrayList messages, LongSparseIntArray inbox, LongSparseIntArray outbox, LongSparseArray> mentions, LongSparseIntArray stillUnreadMessagesCount) { try { LongSparseIntArray dialogsToUpdate = new LongSparseIntArray(); LongSparseIntArray dialogsToUpdateMentions = new LongSparseIntArray(); @@ -5486,15 +5729,25 @@ public class MessagesStorage extends BaseController { } cursor.dispose(); } else { + if (!isEmpty(stillUnreadMessagesCount)) { + for (int b = 0; b < stillUnreadMessagesCount.size(); b++) { + long key = stillUnreadMessagesCount.keyAt(b); + int unread = stillUnreadMessagesCount.get(key); + dialogsToUpdate.put(key, unread); + + } + } if (!isEmpty(inbox)) { for (int b = 0; b < inbox.size(); b++) { long key = inbox.keyAt(b); int messageId = inbox.get(key); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM messages_v2 WHERE uid = %d AND mid > %d AND read_state IN(0,2) AND out = 0", key, messageId)); - if (cursor.next()) { - dialogsToUpdate.put(key, cursor.intValue(0)); + if (dialogsToUpdate.get(key, -1) < 0) { + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM messages_v2 WHERE uid = %d AND mid > %d AND read_state IN(0,2) AND out = 0", key, messageId)); + if (cursor.next()) { + dialogsToUpdate.put(key, cursor.intValue(0)); + } + cursor.dispose(); } - cursor.dispose(); SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET inbox_max = max((SELECT inbox_max FROM dialogs WHERE did = ?), ?) WHERE did = ?"); state.requery(); @@ -5626,14 +5879,14 @@ public class MessagesStorage extends BaseController { return array == null || array.size() == 0; } - public void updateDialogsWithReadMessages(LongSparseIntArray inbox, LongSparseIntArray outbox, LongSparseArray> mentions, boolean useQueue) { - if (isEmpty(inbox) && isEmpty(outbox) && isEmpty(mentions)) { + public void updateDialogsWithReadMessages(LongSparseIntArray inbox, LongSparseIntArray outbox, LongSparseArray> mentions, LongSparseIntArray stillUnread, boolean useQueue) { + if (isEmpty(inbox) && isEmpty(outbox) && isEmpty(mentions) && isEmpty(stillUnread)) { return; } if (useQueue) { - storageQueue.postRunnable(() -> updateDialogsWithReadMessagesInternal(null, inbox, outbox, mentions)); + storageQueue.postRunnable(() -> updateDialogsWithReadMessagesInternal(null, inbox, outbox, mentions, stillUnread)); } else { - updateDialogsWithReadMessagesInternal(null, inbox, outbox, mentions); + updateDialogsWithReadMessagesInternal(null, inbox, outbox, mentions, stillUnread); } } @@ -5642,8 +5895,9 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT info, pinned, online, inviter FROM chat_settings_v2 WHERE uid = " + participants.chat_id); + cursor = database.queryFinalized("SELECT info, pinned, online, inviter FROM chat_settings_v2 WHERE uid = " + participants.chat_id); TLRPC.ChatFull info = null; ArrayList loadedUsers = new ArrayList<>(); if (cursor.next()) { @@ -5657,6 +5911,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (info instanceof TLRPC.TL_chatFull) { info.participants = participants; TLRPC.ChatFull finalInfo = info; @@ -5677,14 +5932,19 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void loadChannelAdmins(long chatId) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT uid, data FROM channel_admins_v3 WHERE did = " + chatId); + cursor = database.queryFinalized("SELECT uid, data FROM channel_admins_v3 WHERE did = " + chatId); LongSparseArray ids = new LongSparseArray<>(); while (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(1); @@ -5697,20 +5957,25 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; getMessagesController().processLoadedChannelAdmins(ids, chatId, true); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void putChannelAdmins(long chatId, LongSparseArray ids) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.executeFast("DELETE FROM channel_admins_v3 WHERE did = " + chatId).stepThis().dispose(); database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO channel_admins_v3 VALUES(?, ?, ?)"); - int date = (int) (System.currentTimeMillis() / 1000); + state = database.executeFast("REPLACE INTO channel_admins_v3 VALUES(?, ?, ?)"); NativeByteBuffer data; for (int a = 0; a < ids.size(); a++) { state.requery(); @@ -5724,20 +5989,27 @@ public class MessagesStorage extends BaseController { data.reuse(); } state.dispose(); + state = null; database.commitTransaction(); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } public void updateChannelUsers(long channelId, ArrayList participants) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { long did = -channelId; database.executeFast("DELETE FROM channel_users_v2 WHERE did = " + did).stepThis().dispose(); database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO channel_users_v2 VALUES(?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO channel_users_v2 VALUES(?, ?, ?, ?)"); NativeByteBuffer data; int date = (int) (System.currentTimeMillis() / 1000); for (int a = 0; a < participants.size(); a++) { @@ -5754,10 +6026,16 @@ public class MessagesStorage extends BaseController { date--; } state.dispose(); + state = null; database.commitTransaction(); loadChatInfo(channelId, true, null, false, true); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } @@ -5767,6 +6045,7 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { int currentDate = getConnectionsManager().getCurrentTime(); if (result instanceof TLRPC.TL_messages_botCallbackAnswer) { @@ -5774,7 +6053,7 @@ public class MessagesStorage extends BaseController { } else if (result instanceof TLRPC.TL_messages_botResults) { currentDate += ((TLRPC.TL_messages_botResults) result).cache_time; } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO botcache VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO botcache VALUES(?, ?, ?)"); NativeByteBuffer data = new NativeByteBuffer(result.getObjectSize()); result.serializeToStream(data); state.bindString(1, key); @@ -5782,9 +6061,14 @@ public class MessagesStorage extends BaseController { state.bindByteBuffer(3, data); state.step(); state.dispose(); + state = null; data.reuse(); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } @@ -5796,9 +6080,10 @@ public class MessagesStorage extends BaseController { int currentDate = getConnectionsManager().getCurrentTime(); storageQueue.postRunnable(() -> { TLObject result = null; + SQLiteCursor cursor = null; try { database.executeFast("DELETE FROM botcache WHERE date < " + currentDate).stepThis().dispose(); - SQLiteCursor cursor = database.queryFinalized("SELECT data FROM botcache WHERE id = ?", key); + cursor = database.queryFinalized("SELECT data FROM botcache WHERE id = ?", key); if (cursor.next()) { try { NativeByteBuffer data = cursor.byteBufferValue(0); @@ -5816,10 +6101,14 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } catch (Exception e) { FileLog.e(e); } finally { requestDelegate.run(result, null); + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -5835,8 +6124,9 @@ public class MessagesStorage extends BaseController { boolean pinnedEndReached = false; TLRPC.UserFull info = null; + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT info, pinned FROM user_settings WHERE uid = " + user.id); + cursor = database.queryFinalized("SELECT info, pinned FROM user_settings WHERE uid = " + user.id); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -5846,6 +6136,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; cursor = getMessagesStorage().getDatabase().queryFinalized(String.format(Locale.US, "SELECT mid FROM chat_pinned_v2 WHERE uid = %d ORDER BY mid DESC", user.id)); while (cursor.next()) { @@ -5854,6 +6145,7 @@ public class MessagesStorage extends BaseController { pinnedMessagesMap.put(id, null); } cursor.dispose(); + cursor = null; cursor = database.queryFinalized("SELECT count, end FROM chat_pinned_count WHERE uid = " + user.id); if (cursor.next()) { @@ -5861,6 +6153,7 @@ public class MessagesStorage extends BaseController { pinnedEndReached = cursor.intValue(1) != 0; } cursor.dispose(); + cursor = null; if (info != null && info.pinned_msg_id != 0) { if (pinnedMessages.isEmpty() || info.pinned_msg_id > pinnedMessages.get(0)) { @@ -5882,22 +6175,28 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } finally { getMessagesController().processUserInfo(user, info, true, force, classGuid, pinnedMessages, pinnedMessagesMap, totalPinnedCount, pinnedEndReached); + if (cursor != null) { + cursor.dispose(); + } } }); } public void updateUserInfo(TLRPC.UserFull info, boolean ifExist) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { if (ifExist) { - SQLiteCursor cursor = database.queryFinalized("SELECT uid FROM user_settings WHERE uid = " + info.user.id); + cursor = database.queryFinalized("SELECT uid FROM user_settings WHERE uid = " + info.user.id); boolean exist = cursor.next(); cursor.dispose(); + cursor = null; if (!exist) { return; } } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO user_settings VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO user_settings VALUES(?, ?, ?)"); NativeByteBuffer data = new NativeByteBuffer(info.getObjectSize()); info.serializeToStream(data); state.bindLong(1, info.user.id); @@ -5905,6 +6204,7 @@ public class MessagesStorage extends BaseController { state.bindInteger(3, info.pinned_msg_id); state.step(); state.dispose(); + state = null; data.reuse(); if ((info.flags & 2048) != 0) { state = database.executeFast("UPDATE dialogs SET folder_id = ? WHERE did = ?"); @@ -5912,18 +6212,27 @@ public class MessagesStorage extends BaseController { state.bindLong(2, info.user.id); state.step(); state.dispose(); + state = null; unknownDialogsIds.remove(info.user.id); } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } }); } public void saveChatInviter(long chatId, long inviterId) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE chat_settings_v2 SET inviter = ? WHERE uid = ?"); + state = database.executeFast("UPDATE chat_settings_v2 SET inviter = ? WHERE uid = ?"); state.requery(); state.bindLong(1, inviterId); state.bindLong(2, chatId); @@ -5931,38 +6240,51 @@ public class MessagesStorage extends BaseController { state.dispose(); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void saveChatLinksCount(long chatId, int linksCount) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE chat_settings_v2 SET links = ? WHERE uid = ?"); + state = database.executeFast("UPDATE chat_settings_v2 SET links = ? WHERE uid = ?"); state.requery(); state.bindInteger(1, linksCount); state.bindLong(2, chatId); state.step(); state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void updateChatInfo(TLRPC.ChatFull info, boolean ifExist) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { int currentOnline = -1; int inviter = 0; int links = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT online, inviter, links FROM chat_settings_v2 WHERE uid = " + info.id); + cursor = database.queryFinalized("SELECT online, inviter, links FROM chat_settings_v2 WHERE uid = " + info.id); if (cursor.next()) { currentOnline = cursor.intValue(0); info.inviterId = cursor.longValue(1); links = cursor.intValue(2); } cursor.dispose(); + cursor = null; if (ifExist && currentOnline == -1) { return; } @@ -5975,7 +6297,7 @@ public class MessagesStorage extends BaseController { info.invitesCount = links; } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_settings_v2 VALUES(?, ?, ?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO chat_settings_v2 VALUES(?, ?, ?, ?, ?, ?)"); NativeByteBuffer data = new NativeByteBuffer(info.getObjectSize()); info.serializeToStream(data); state.bindLong(1, info.id); @@ -5986,6 +6308,7 @@ public class MessagesStorage extends BaseController { state.bindInteger(6, info.invitesCount); state.step(); state.dispose(); + state = null; data.reuse(); if (info instanceof TLRPC.TL_channelFull) { @@ -6005,6 +6328,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } if ((info.flags & 2048) != 0) { state = database.executeFast("UPDATE dialogs SET folder_id = ? WHERE did = ?"); @@ -6012,31 +6336,48 @@ public class MessagesStorage extends BaseController { state.bindLong(2, -info.id); state.step(); state.dispose(); + state = null; unknownDialogsIds.remove(-info.id); } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } public void updateChatOnlineCount(long channelId, int onlineCount) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE chat_settings_v2 SET online = ? WHERE uid = ?"); + state = database.executeFast("UPDATE chat_settings_v2 SET online = ? WHERE uid = ?"); state.requery(); state.bindInteger(1, onlineCount); state.bindLong(2, channelId); state.step(); state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void updatePinnedMessages(long dialogId, ArrayList ids, boolean pin, int totalCount, int maxId, boolean end, HashMap messages) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLiteCursor cursor2 = null; + SQLitePreparedStatement state = null; try { if (pin) { database.beginTransaction(); @@ -6047,11 +6388,12 @@ public class MessagesStorage extends BaseController { database.executeFast("DELETE FROM chat_pinned_v2 WHERE uid = " + dialogId).stepThis().dispose(); } } else { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM chat_pinned_v2 WHERE uid = %d AND mid IN (%s)", dialogId, TextUtils.join(",", ids))); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM chat_pinned_v2 WHERE uid = %d AND mid IN (%s)", dialogId, TextUtils.join(",", ids))); alreadyAdded = cursor.next() ? cursor.intValue(0) : 0; cursor.dispose(); + cursor = null; } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_pinned_v2 VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO chat_pinned_v2 VALUES(?, ?, ?)"); for (int a = 0, N = ids.size(); a < N; a++) { Integer id = ids.get(a); state.requery(); @@ -6075,18 +6417,20 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; database.commitTransaction(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM chat_pinned_v2 WHERE uid = %d", dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM chat_pinned_v2 WHERE uid = %d", dialogId)); int newCount1 = cursor.next() ? cursor.intValue(0) : 0; cursor.dispose(); + cursor = null; int newCount; if (messages != null) { newCount = Math.max(totalCount, newCount1); endReached = end; } else { - SQLiteCursor cursor2 = database.queryFinalized(String.format(Locale.US, "SELECT count, end FROM chat_pinned_count WHERE uid = %d", dialogId)); + cursor2 = database.queryFinalized(String.format(Locale.US, "SELECT count, end FROM chat_pinned_count WHERE uid = %d", dialogId)); int newCount2; if (cursor2.next()) { newCount2 = cursor2.intValue(0); @@ -6096,6 +6440,7 @@ public class MessagesStorage extends BaseController { endReached = false; } cursor2.dispose(); + cursor2 = null; newCount = Math.max(newCount2 + (ids.size() - alreadyAdded), newCount1); } @@ -6106,6 +6451,7 @@ public class MessagesStorage extends BaseController { state.bindInteger(3, endReached ? 1 : 0); state.step(); state.dispose(); + state = null; AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.didLoadPinnedMessages, dialogId, ids, true, null, messages, maxId, newCount, endReached)); } else { @@ -6130,13 +6476,15 @@ public class MessagesStorage extends BaseController { database.executeFast(String.format(Locale.US, "DELETE FROM chat_pinned_v2 WHERE uid = %d AND mid IN(%s)", dialogId, idsStr)).stepThis().dispose(); - SQLiteCursor cursor = database.queryFinalized("SELECT changes()"); + cursor = database.queryFinalized("SELECT changes()"); int updatedCount = cursor.next() ? cursor.intValue(0) : 0; cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM chat_pinned_v2 WHERE uid = %d", dialogId)); int newCount1 = cursor.next() ? cursor.intValue(0) : 0; cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT count, end FROM chat_pinned_count WHERE uid = %d", dialogId)); int newCount2; @@ -6148,29 +6496,40 @@ public class MessagesStorage extends BaseController { endReached = false; } cursor.dispose(); + cursor = null; newCount = Math.max(newCount1, newCount2); } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_pinned_count VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO chat_pinned_count VALUES(?, ?, ?)"); state.requery(); state.bindLong(1, dialogId); state.bindInteger(2, newCount); state.bindInteger(3, endReached ? 1 : 0); state.step(); state.dispose(); + state = null; AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.didLoadPinnedMessages, dialogId, ids, false, null, messages, maxId, newCount, endReached)); } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } public void updateChatInfo(long chatId, long userId, int what, long invited_id, int version) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT info, pinned, online, inviter FROM chat_settings_v2 WHERE uid = " + chatId); + cursor = database.queryFinalized("SELECT info, pinned, online, inviter FROM chat_settings_v2 WHERE uid = " + chatId); TLRPC.ChatFull info = null; ArrayList loadedUsers = new ArrayList<>(); if (cursor.next()) { @@ -6184,6 +6543,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (info instanceof TLRPC.TL_chatFull) { if (what == 1) { for (int a = 0; a < info.participants.participants.size(); a++) { @@ -6242,6 +6602,10 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -6250,8 +6614,9 @@ public class MessagesStorage extends BaseController { CountDownLatch countDownLatch = new CountDownLatch(1); boolean[] result = new boolean[1]; storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT info FROM chat_settings_v2 WHERE uid = " + chatId); + cursor = database.queryFinalized("SELECT info FROM chat_settings_v2 WHERE uid = " + chatId); TLRPC.ChatFull info = null; ArrayList loadedUsers = new ArrayList<>(); if (cursor.next()) { @@ -6262,11 +6627,15 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; result[0] = info instanceof TLRPC.TL_channelFull && info.migrated_from_chat_id != 0; countDownLatch.countDown(); } catch (Exception e) { FileLog.e(e); } finally { + if (cursor != null) { + cursor.dispose(); + } countDownLatch.countDown(); } }); @@ -6282,9 +6651,10 @@ public class MessagesStorage extends BaseController { CountDownLatch countDownLatch = new CountDownLatch(1); boolean[] result = new boolean[1]; storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { long selfId = getUserConfig().getClientUserId(); - SQLiteCursor cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + -chatId + " AND out = 0 ORDER BY mid DESC LIMIT 100"); + cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = " + -chatId + " AND out = 0 ORDER BY mid DESC LIMIT 100"); while (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -6297,9 +6667,13 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } catch (Exception e) { FileLog.e(e); } finally { + if (cursor != null) { + cursor.dispose(); + } countDownLatch.countDown(); } }); @@ -6320,8 +6694,9 @@ public class MessagesStorage extends BaseController { int totalPinnedCount = 0; boolean pinnedEndReached = false; + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT info, pinned, online, inviter, links FROM chat_settings_v2 WHERE uid = " + chatId); + cursor = database.queryFinalized("SELECT info, pinned, online, inviter, links FROM chat_settings_v2 WHERE uid = " + chatId); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -6334,6 +6709,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (info instanceof TLRPC.TL_chatFull) { StringBuilder usersToLoad = new StringBuilder(); @@ -6385,6 +6761,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; StringBuilder usersToLoad = new StringBuilder(); for (int a = 0; a < info.bot_info.size(); a++) { TLRPC.BotInfo botInfo = info.bot_info.get(a); @@ -6408,13 +6785,14 @@ public class MessagesStorage extends BaseController { pinnedMessagesMap.put(id, null); } cursor.dispose(); - + cursor = null; cursor = database.queryFinalized("SELECT count, end FROM chat_pinned_count WHERE uid = " + (-chatId)); if (cursor.next()) { totalPinnedCount = cursor.intValue(0); pinnedEndReached = cursor.intValue(1) != 0; } cursor.dispose(); + cursor = null; if (info != null && info.pinned_msg_id != 0) { if (pinnedMessages.isEmpty() || info.pinned_msg_id > pinnedMessages.get(0)) { @@ -6435,6 +6813,9 @@ public class MessagesStorage extends BaseController { } catch (Exception e) { FileLog.e(e); } finally { + if (cursor != null) { + cursor.dispose(); + } getMessagesController().processChatInfo(chatId, info, loadedUsers, true, force, byChannelUsers, pinnedMessages, pinnedMessagesMap, totalPinnedCount, pinnedEndReached); } return info; @@ -6465,21 +6846,23 @@ public class MessagesStorage extends BaseController { public void processPendingRead(long dialogId, int maxPositiveId, int maxNegativeId, int scheduledCount) { int maxDate = lastSavedDate; storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { int currentMaxId = 0; int unreadCount = 0; long last_mid = 0; int prevUnreadCount = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT unread_count, inbox_max, last_mid FROM dialogs WHERE did = " + dialogId); + cursor = database.queryFinalized("SELECT unread_count, inbox_max, last_mid FROM dialogs WHERE did = " + dialogId); if (cursor.next()) { prevUnreadCount = unreadCount = cursor.intValue(0); currentMaxId = cursor.intValue(1); last_mid = cursor.longValue(2); } cursor.dispose(); + cursor = null; database.beginTransaction(); - SQLitePreparedStatement state; if (!DialogObject.isEncryptedDialog(dialogId)) { currentMaxId = Math.max(currentMaxId, maxPositiveId); @@ -6516,6 +6899,7 @@ public class MessagesStorage extends BaseController { state.bindInteger(2, maxDate); state.step(); state.dispose(); + state = null; } else { currentMaxId = maxNegativeId; @@ -6525,6 +6909,7 @@ public class MessagesStorage extends BaseController { state.bindInteger(2, currentMaxId); state.step(); state.dispose(); + state = null; if (currentMaxId <= last_mid) { unreadCount = 0; @@ -6546,6 +6931,7 @@ public class MessagesStorage extends BaseController { state.bindLong(3, dialogId); state.step(); state.dispose(); + state = null; database.commitTransaction(); @@ -6557,6 +6943,14 @@ public class MessagesStorage extends BaseController { updateWidgets(dialogId); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } + database.commitTransaction(); } }); } @@ -6567,12 +6961,13 @@ public class MessagesStorage extends BaseController { } ArrayList contactsCopy = new ArrayList<>(contacts); storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { if (deleteAll) { database.executeFast("DELETE FROM contacts WHERE 1").stepThis().dispose(); } database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO contacts VALUES(?, ?)"); + state = database.executeFast("REPLACE INTO contacts VALUES(?, ?)"); for (int a = 0; a < contactsCopy.size(); a++) { TLRPC.TL_contact contact = contactsCopy.get(a); state.requery(); @@ -6581,9 +6976,15 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; database.commitTransaction(); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + database.commitTransaction(); } }); } @@ -6625,6 +7026,8 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; + SQLitePreparedStatement state2 = null; try { if (BuildVars.LOGS_ENABLED) { FileLog.d(currentAccount + " save contacts to db " + contactHashMap.size()); @@ -6633,8 +7036,8 @@ public class MessagesStorage extends BaseController { database.executeFast("DELETE FROM user_phones_v7 WHERE 1").stepThis().dispose(); database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO user_contacts_v7 VALUES(?, ?, ?, ?, ?)"); - SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO user_phones_v7 VALUES(?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO user_contacts_v7 VALUES(?, ?, ?, ?, ?)"); + state2 = database.executeFast("REPLACE INTO user_phones_v7 VALUES(?, ?, ?, ?)"); for (HashMap.Entry entry : contactHashMap.entrySet()) { ContactsController.Contact contact = entry.getValue(); if (contact.phones.isEmpty() || contact.shortPhones.isEmpty()) { @@ -6657,7 +7060,9 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; state2.dispose(); + state2 = null; database.commitTransaction(); if (migrate) { database.executeFast("DROP TABLE IF EXISTS user_contacts_v6;").stepThis().dispose(); @@ -6666,6 +7071,14 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (state2 != null) { + state2.dispose(); + } + database.commitTransaction(); } }); } @@ -6821,8 +7234,9 @@ public class MessagesStorage extends BaseController { storageQueue.postRunnable(() -> { ArrayList contacts = new ArrayList<>(); ArrayList users = new ArrayList<>(); + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT * FROM contacts WHERE 1"); + cursor = database.queryFinalized("SELECT * FROM contacts WHERE 1"); StringBuilder uids = new StringBuilder(); while (cursor.next()) { long userId = cursor.intValue(0); @@ -6836,6 +7250,7 @@ public class MessagesStorage extends BaseController { uids.append(contact.user_id); } cursor.dispose(); + cursor = null; if (uids.length() != 0) { getUsersInternal(uids.toString(), users); @@ -6844,6 +7259,10 @@ public class MessagesStorage extends BaseController { contacts.clear(); users.clear(); FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } getContactsController().processLoadedContacts(contacts, users, 1); }); @@ -6851,6 +7270,7 @@ public class MessagesStorage extends BaseController { public void getUnsentMessages(int count) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { SparseArray messageHashMap = new SparseArray<>(); ArrayList messages = new ArrayList<>(); @@ -6863,7 +7283,7 @@ public class MessagesStorage extends BaseController { ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedChatIds = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized("SELECT m.read_state, m.data, m.send_state, m.mid, m.date, r.random_id, m.uid, s.seq_in, s.seq_out, m.ttl FROM messages_v2 as m LEFT JOIN randoms_v2 as r ON r.mid = m.mid AND r.uid = m.uid LEFT JOIN messages_seq as s ON m.mid = s.mid WHERE (m.mid < 0 AND m.send_state = 1) OR (m.mid > 0 AND m.send_state = 3) ORDER BY m.mid DESC LIMIT " + count); + cursor = database.queryFinalized("SELECT m.read_state, m.data, m.send_state, m.mid, m.date, r.random_id, m.uid, s.seq_in, s.seq_out, m.ttl FROM messages_v2 as m LEFT JOIN randoms_v2 as r ON r.mid = m.mid AND r.uid = m.uid LEFT JOIN messages_seq as s ON m.mid = s.mid WHERE (m.mid < 0 AND m.send_state = 1) OR (m.mid > 0 AND m.send_state = 3) ORDER BY m.mid DESC LIMIT " + count); while (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(1); if (data != null) { @@ -6900,7 +7320,7 @@ public class MessagesStorage extends BaseController { } } - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); if (message.send_state != 3 && (message.peer_id.channel_id == 0 && !MessageObject.isUnread(message) && !DialogObject.isEncryptedDialog(message.dialog_id) || message.id > 0)) { message.send_state = 0; @@ -6909,6 +7329,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; cursor = database.queryFinalized("SELECT m.data, m.send_state, m.mid, m.date, r.random_id, m.uid, m.ttl FROM scheduled_messages_v2 as m LEFT JOIN randoms_v2 as r ON r.mid = m.mid AND r.uid = m.uid WHERE (m.mid < 0 AND m.send_state = 1) OR (m.mid > 0 AND m.send_state = 3) ORDER BY date ASC"); while (cursor.next()) { @@ -6944,7 +7365,7 @@ public class MessagesStorage extends BaseController { } } - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); if (message.send_state != 3 && (message.peer_id.channel_id == 0 && !MessageObject.isUnread(message) && !DialogObject.isEncryptedDialog(message.dialog_id) || message.id > 0)) { message.send_state = 0; @@ -6953,6 +7374,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (!encryptedChatIds.isEmpty()) { getEncryptedChatsInternal(TextUtils.join(",", encryptedChatIds), encryptedChats, usersToLoad); @@ -6977,6 +7399,10 @@ public class MessagesStorage extends BaseController { getSendMessagesHelper().processUnsentMessages(messages, scheduledMessages, users, chats, encryptedChats); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -7037,9 +7463,10 @@ public class MessagesStorage extends BaseController { public void getUnreadMention(long dialog_id, IntCallback callback) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { int result; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT MIN(mid) FROM messages_v2 WHERE uid = %d AND mention = 1 AND read_state IN(0, 1)", dialog_id)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT MIN(mid) FROM messages_v2 WHERE uid = %d AND mention = 1 AND read_state IN(0, 1)", dialog_id)); if (cursor.next()) { result = cursor.intValue(0); } else { @@ -7049,15 +7476,20 @@ public class MessagesStorage extends BaseController { AndroidUtilities.runOnUIThread(() -> callback.run(result)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } public void getMessagesCount(long dialog_id, IntCallback callback) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { int result; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM messages_v2 WHERE uid = %d", dialog_id)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM messages_v2 WHERE uid = %d", dialog_id)); if (cursor.next()) { result = cursor.intValue(0); } else { @@ -7067,6 +7499,8 @@ public class MessagesStorage extends BaseController { AndroidUtilities.runOnUIThread(() -> callback.run(result)); } catch (Exception e) { FileLog.e(e); + } finally { + cursor.dispose(); } }); } @@ -7089,15 +7523,17 @@ public class MessagesStorage extends BaseController { boolean isEnd = false; int num = dialogId == 777000 ? 10 : 1; int messagesCount = 0; + int serviceUnreadCount = 0; long startLoadTime = SystemClock.elapsedRealtime(); + SQLiteCursor cursor = null; try { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); + ArrayList animatedEmojiToLoad = new ArrayList<>(); LongSparseArray>> replyMessageOwners = new LongSparseArray<>(); LongSparseArray> dialogReplyMessagesIds = new LongSparseArray<>(); LongSparseArray> replyMessageRandomOwners = new LongSparseArray<>(); ArrayList replyMessageRandomIds = new ArrayList<>(); - SQLiteCursor cursor; String messageSelect = "SELECT m.read_state, m.data, m.send_state, m.mid, m.date, r.random_id, m.replydata, m.media, m.ttl, m.mention, m.imp, m.forwards, m.replies_data, m.custom_params FROM messages_v2 as m LEFT JOIN randoms_v2 as r ON r.mid = m.mid AND r.uid = m.uid"; if (scheduled) { @@ -7127,7 +7563,7 @@ public class MessagesStorage extends BaseController { } res.messages.add(message); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, animatedEmojiToLoad); if (message.reply_to != null && (message.reply_to.reply_to_msg_id != 0 || message.reply_to.reply_to_random_id != 0)) { if (!cursor.isNull(5)) { @@ -7137,7 +7573,7 @@ public class MessagesStorage extends BaseController { message.replyMessage.readAttachPath(data, currentUserId); data.reuse(); if (message.replyMessage != null) { - addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad, animatedEmojiToLoad); } } } @@ -7160,6 +7596,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } else { if (!DialogObject.isEncryptedDialog(dialogId)) { if (load_type == 3 && minDate == 0) { @@ -7171,6 +7608,7 @@ public class MessagesStorage extends BaseController { mentions_unread = cursor.intValue(3); } cursor.dispose(); + cursor = null; } else if (load_type != 1 && load_type != 3 && load_type != 4 && minDate == 0) { if (load_type == 2) { cursor = database.queryFinalized("SELECT inbox_max, unread_count, date, unread_count_i FROM dialogs WHERE did = " + dialogId); @@ -7185,6 +7623,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (!queryFromServer) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(mid), max(date) FROM messages_v2 WHERE uid = %d AND out = 0 AND read_state IN(0,2) AND mid > 0", dialogId)); if (cursor.next()) { @@ -7192,12 +7631,14 @@ public class MessagesStorage extends BaseController { max_unread_date = cursor.intValue(1); } cursor.dispose(); + cursor = null; if (min_unread_id != 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(*) FROM messages_v2 WHERE uid = %d AND mid >= %d AND out = 0 AND read_state IN(0,2)", dialogId, min_unread_id)); if (cursor.next()) { count_unread = cursor.intValue(0); } cursor.dispose(); + cursor = null; } } else if (max_id_query == 0) { int existingUnreadCount = 0; @@ -7206,17 +7647,20 @@ public class MessagesStorage extends BaseController { existingUnreadCount = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (existingUnreadCount == count_unread) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(mid) FROM messages_v2 WHERE uid = %d AND out = 0 AND read_state IN(0,2) AND mid > 0", dialogId)); if (cursor.next()) { messageMaxId = max_id_query = min_unread_id = cursor.intValue(0); } cursor.dispose(); + cursor = null; } } else { cursor = database.queryFinalized(String.format(Locale.US, "SELECT start, end FROM messages_holes WHERE uid = %d AND start < %d AND end > %d", dialogId, max_id_query, max_id_query)); boolean containMessage = !cursor.next(); cursor.dispose(); + cursor = null; if (containMessage) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(mid) FROM messages_v2 WHERE uid = %d AND out = 0 AND read_state IN(0,2) AND mid > %d", dialogId, max_id_query)); @@ -7224,6 +7668,7 @@ public class MessagesStorage extends BaseController { messageMaxId = max_id_query = cursor.intValue(0); } cursor.dispose(); + cursor = null; } } } @@ -7231,6 +7676,7 @@ public class MessagesStorage extends BaseController { if (count_query > count_unread || count_unread < num) { count_query = Math.max(count_query, count_unread + 10); if (count_unread < num) { + serviceUnreadCount = count_unread; count_unread = 0; min_unread_id = 0; messageMaxId = 0; @@ -7248,6 +7694,7 @@ public class MessagesStorage extends BaseController { isEnd = cursor.intValue(0) == 1; } else { cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(mid) FROM messages_v2 WHERE uid = %d AND mid > 0", dialogId)); if (cursor.next()) { int mid = cursor.intValue(0); @@ -7263,6 +7710,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (load_type == 3 || load_type == 4 || queryFromServer && load_type == 2) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT max(mid) FROM messages_v2 WHERE uid = %d AND mid > 0", dialogId)); @@ -7270,6 +7718,7 @@ public class MessagesStorage extends BaseController { last_message_id = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (load_type == 4 && offset_date != 0) { int startMid; @@ -7282,6 +7731,7 @@ public class MessagesStorage extends BaseController { startMid = -1; } cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(mid) FROM messages_v2 WHERE uid = %d AND date >= %d AND mid > 0", dialogId, offset_date)); if (cursor.next()) { endMid = cursor.intValue(0); @@ -7289,6 +7739,7 @@ public class MessagesStorage extends BaseController { endMid = -1; } cursor.dispose(); + cursor = null; if (startMid != -1 && endMid != -1) { if (startMid == endMid) { max_id_query = startMid; @@ -7298,12 +7749,14 @@ public class MessagesStorage extends BaseController { startMid = -1; } cursor.dispose(); + cursor = null; if (startMid != -1) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT start FROM messages_holes WHERE uid = %d AND start <= %d AND end > %d", dialogId, endMid, endMid)); if (cursor.next()) { endMid = -1; } cursor.dispose(); + cursor = null; if (endMid != -1) { max_id_override = endMid; messageMaxId = max_id_query = endMid; @@ -7320,6 +7773,7 @@ public class MessagesStorage extends BaseController { containMessage = false; } cursor.dispose(); + cursor = null; } if (containMessage) { @@ -7330,11 +7784,13 @@ public class MessagesStorage extends BaseController { holeMessageMaxId = cursor.intValue(0); } cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT end FROM messages_holes WHERE uid = %d AND end <= %d ORDER BY end DESC LIMIT 1", dialogId, max_id_query)); if (cursor.next()) { holeMessageMinId = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (holeMessageMaxId != 0 || holeMessageMinId != 1) { if (holeMessageMaxId == 0) { holeMessageMaxId = 1000000000; @@ -7353,15 +7809,12 @@ public class MessagesStorage extends BaseController { existingUnreadCount = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (existingUnreadCount == count_unread) { unreadCountIsLocal = true; cursor = database.queryFinalized(String.format(Locale.US, "SELECT * FROM (" + messageSelect + " WHERE m.uid = %d AND m.mid <= %d ORDER BY m.date DESC, m.mid DESC LIMIT %d) UNION " + "SELECT * FROM (" + messageSelect + " WHERE m.uid = %d AND m.mid > %d ORDER BY m.date ASC, m.mid ASC LIMIT %d)", dialogId, messageMaxId, count_query / 2, dialogId, messageMaxId, count_query / 2)); - } else { - cursor = null; } - } else { - cursor = null; } } } else if (load_type == 1) { @@ -7371,6 +7824,7 @@ public class MessagesStorage extends BaseController { holeMessageId = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (holeMessageId != 0) { cursor = database.queryFinalized(String.format(Locale.US, "" + messageSelect + " WHERE m.uid = %d AND m.date >= %d AND m.mid > %d AND m.mid <= %d ORDER BY m.date ASC, m.mid ASC LIMIT %d", dialogId, minDate, messageMaxId, holeMessageId, count_query)); } else { @@ -7384,6 +7838,7 @@ public class MessagesStorage extends BaseController { holeMessageId = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (holeMessageId != 0) { cursor = database.queryFinalized(String.format(Locale.US, "" + messageSelect + " WHERE m.uid = %d AND m.date <= %d AND m.mid < %d AND (m.mid >= %d OR m.mid < 0) ORDER BY m.date DESC, m.mid DESC LIMIT %d", dialogId, minDate, messageMaxId, holeMessageId, count_query)); } else { @@ -7398,6 +7853,7 @@ public class MessagesStorage extends BaseController { last_message_id = cursor.intValue(0); } cursor.dispose(); + cursor = null; int holeMessageId = 0; cursor = database.queryFinalized(String.format(Locale.US, "SELECT max(end) FROM messages_holes WHERE uid = %d", dialogId)); @@ -7405,6 +7861,7 @@ public class MessagesStorage extends BaseController { holeMessageId = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (holeMessageId != 0) { cursor = database.queryFinalized(String.format(Locale.US, "" + messageSelect + " WHERE m.uid = %d AND (m.mid >= %d OR m.mid < 0) ORDER BY m.date DESC, m.mid DESC LIMIT %d,%d", dialogId, holeMessageId, offset_query, count_query)); } else { @@ -7420,6 +7877,7 @@ public class MessagesStorage extends BaseController { min_unread_id = cursor.intValue(0); } cursor.dispose(); + cursor = null; int min_unread_id2 = 0; cursor = database.queryFinalized(String.format(Locale.US, "SELECT max(mid), max(date) FROM messages_v2 WHERE uid = %d AND out = 0 AND read_state IN(0,2) AND mid < 0", dialogId)); @@ -7428,6 +7886,7 @@ public class MessagesStorage extends BaseController { max_unread_date = cursor.intValue(1); } cursor.dispose(); + cursor = null; if (min_unread_id2 != 0) { min_unread_id = min_unread_id2; cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(*) FROM messages_v2 WHERE uid = %d AND mid <= %d AND out = 0 AND read_state IN(0,2)", dialogId, min_unread_id2)); @@ -7435,6 +7894,7 @@ public class MessagesStorage extends BaseController { count_unread = cursor.intValue(0); } cursor.dispose(); + cursor = null; } } @@ -7444,6 +7904,7 @@ public class MessagesStorage extends BaseController { last_message_id = cursor.intValue(0); } cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT * FROM (" + messageSelect + " WHERE m.uid = %d AND m.mid <= %d ORDER BY m.mid DESC LIMIT %d) UNION " + "SELECT * FROM (" + messageSelect + " WHERE m.uid = %d AND m.mid > %d ORDER BY m.mid ASC LIMIT %d)", dialogId, messageMaxId, count_query / 2, dialogId, messageMaxId, count_query / 2)); @@ -7462,6 +7923,7 @@ public class MessagesStorage extends BaseController { last_message_id = cursor.intValue(0); } cursor.dispose(); + cursor = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT max(mid), max(date) FROM messages_v2 WHERE uid = %d AND out = 0 AND read_state IN(0,2) AND mid < 0", dialogId)); if (cursor.next()) { @@ -7469,12 +7931,14 @@ public class MessagesStorage extends BaseController { max_unread_date = cursor.intValue(1); } cursor.dispose(); + cursor = null; if (min_unread_id != 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(*) FROM messages_v2 WHERE uid = %d AND mid <= %d AND out = 0 AND read_state IN(0,2)", dialogId, min_unread_id)); if (cursor.next()) { count_unread = cursor.intValue(0); } cursor.dispose(); + cursor = null; } } @@ -7559,7 +8023,7 @@ public class MessagesStorage extends BaseController { } res.messages.add(message); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, animatedEmojiToLoad); if (message.reply_to != null && (message.reply_to.reply_to_msg_id != 0 || message.reply_to.reply_to_random_id != 0)) { if (!cursor.isNull(6)) { @@ -7569,7 +8033,7 @@ public class MessagesStorage extends BaseController { message.replyMessage.readAttachPath(data, currentUserId); data.reuse(); if (message.replyMessage != null) { - addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad, animatedEmojiToLoad); } } } @@ -7606,6 +8070,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } Collections.sort(res.messages, (lhs, rhs) -> { @@ -7653,6 +8118,7 @@ public class MessagesStorage extends BaseController { mentions_unread *= -1; } cursor.dispose(); + cursor = null; } } if (!replyMessageRandomOwners.isEmpty()) { @@ -7667,7 +8133,7 @@ public class MessagesStorage extends BaseController { message.date = cursor.intValue(2); message.dialog_id = dialogId; - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, animatedEmojiToLoad); long value = cursor.longValue(3); ArrayList arrayList = replyMessageRandomOwners.get(value); @@ -7685,6 +8151,7 @@ public class MessagesStorage extends BaseController { } cursor.dispose(); + cursor = null; for (int b = 0, N = replyMessageRandomOwners.size(); b < N; b++) { ArrayList arrayList = replyMessageRandomOwners.valueAt(b); for (int a = 0, N2 = arrayList.size(); a < N2; a++) { @@ -7703,15 +8170,27 @@ public class MessagesStorage extends BaseController { if (!chatsToLoad.isEmpty()) { getChatsInternal(TextUtils.join(",", chatsToLoad), res.chats); } + if (!animatedEmojiToLoad.isEmpty()) { + res.animatedEmoji = new ArrayList<>(); + getAnimatedEmoji(TextUtils.join(",", animatedEmojiToLoad), res.animatedEmoji); + } } catch (Exception e) { res.messages.clear(); res.chats.clear(); res.users.clear(); + res.animatedEmoji = null; FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } if (BuildVars.LOGS_ENABLED) { FileLog.d("messages load time = " + (SystemClock.elapsedRealtime() - startLoadTime) + " for dialog = " + dialogId); } + if (dialogId == 777000 && serviceUnreadCount != 0) { + count_unread = serviceUnreadCount; + } int countQueryFinal = count_query; int maxIdOverrideFinal = max_id_override; int minUnreadIdFinal = min_unread_id; @@ -7733,6 +8212,33 @@ public class MessagesStorage extends BaseController { //} } + private void getAnimatedEmoji(String join, ArrayList documents) { + SQLiteCursor cursor = null; + try { + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM animated_emoji WHERE document_id IN (%s)", join)); + while (cursor.next()) { + NativeByteBuffer byteBuffer = cursor.byteBufferValue(0); + try { + TLRPC.Document document = TLRPC.Document.TLdeserialize(byteBuffer, byteBuffer.readInt32(true), true); + if (document != null && document.id != 0) { + documents.add(document); + } + } catch (Exception e) { + FileLog.e(e); + } + if (byteBuffer != null) { + byteBuffer.reuse(); + } + } + } catch (SQLiteException e) { + e.printStackTrace(); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + } + public void getMessages(long dialogId, long mergeDialogId, boolean loadInfo, int count, int max_id, int offset_date, int minDate, int classGuid, int load_type, boolean scheduled, int replyMessageId, int loadIndex, boolean processMessages) { storageQueue.postRunnable(() -> { /*if (loadInfo) { @@ -7868,10 +8374,11 @@ public class MessagesStorage extends BaseController { public void getWidgetDialogIds(int widgetId, int type, ArrayList dids, ArrayList users, ArrayList chats, boolean edit) { CountDownLatch countDownLatch = new CountDownLatch(1); storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM shortcut_widget WHERE id = %d ORDER BY ord ASC", widgetId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM shortcut_widget WHERE id = %d ORDER BY ord ASC", widgetId)); while (cursor.next()) { long id = cursor.longValue(0); if (id == -1) { @@ -7887,6 +8394,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (!edit && dids.isEmpty()) { if (type == EditWidgetActivity.TYPE_CHATS) { cursor = database.queryFinalized("SELECT did FROM dialogs WHERE folder_id = 0 ORDER BY pinned DESC, date DESC LIMIT 0,10"); @@ -7905,6 +8413,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } else { cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT did FROM chat_hints WHERE type = 0 ORDER BY rating DESC LIMIT 4"); while (cursor.next()) { @@ -7919,6 +8428,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } } if (users != null && chats != null) { @@ -7932,6 +8442,9 @@ public class MessagesStorage extends BaseController { } catch (Exception e) { FileLog.e(e); } finally { + if (cursor != null) { + cursor.dispose(); + } countDownLatch.countDown(); } }); @@ -7945,11 +8458,12 @@ public class MessagesStorage extends BaseController { public void getWidgetDialogs(int widgetId, int type, ArrayList dids, LongSparseArray dialogs, LongSparseArray messages, ArrayList users, ArrayList chats) { CountDownLatch countDownLatch = new CountDownLatch(1); storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { boolean add = false; ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM shortcut_widget WHERE id = %d ORDER BY ord ASC", widgetId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM shortcut_widget WHERE id = %d ORDER BY ord ASC", widgetId)); while (cursor.next()) { long id = cursor.longValue(0); if (id == -1) { @@ -7963,6 +8477,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (dids.isEmpty() && type == EditWidgetActivity.TYPE_CONTACTS) { cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT did FROM chat_hints WHERE type = 0 ORDER BY rating DESC LIMIT 4"); while (cursor.next()) { @@ -7975,6 +8490,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } if (dids.isEmpty()) { add = true; @@ -8012,10 +8528,11 @@ public class MessagesStorage extends BaseController { } message.dialog_id = dialog.id; messages.put(dialog.id, message); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); } } cursor.dispose(); + cursor = null; if (!add) { if (dids.size() > dialogs.size()) { for (int a = 0, N = dids.size(); a < N; a++) { @@ -8046,6 +8563,9 @@ public class MessagesStorage extends BaseController { } catch (Exception e) { FileLog.e(e); } finally { + if (cursor != null) { + cursor.dispose(); + } countDownLatch.countDown(); } }); @@ -8237,14 +8757,19 @@ public class MessagesStorage extends BaseController { public void isDialogHasTopMessage(long did, Runnable onDontExist) { storageQueue.postRunnable(() -> { boolean exists = false; + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT last_mid FROM dialogs WHERE did = %d", did)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT last_mid FROM dialogs WHERE did = %d", did)); if (cursor.next()) { exists = cursor.intValue(0) != 0; } - cursor.dispose(); + } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } if (!exists) { AndroidUtilities.runOnUIThread(onDontExist); @@ -8256,13 +8781,16 @@ public class MessagesStorage extends BaseController { CountDownLatch countDownLatch = new CountDownLatch(1); boolean[] result = new boolean[1]; storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE uid = 777000 AND date = %d AND mid < 0 LIMIT 1", date)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE uid = 777000 AND date = %d AND mid < 0 LIMIT 1", date)); result[0] = cursor.next(); - cursor.dispose(); } catch (Exception e) { FileLog.e(e); } finally { + if (cursor != null) { + cursor.dispose(); + } countDownLatch.countDown(); } }); @@ -8304,11 +8832,12 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { if ((chat.key_hash == null || chat.key_hash.length < 16) && chat.auth_key != null) { chat.key_hash = AndroidUtilities.calcAuthKeyHash(chat.auth_key); } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_chats VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO enc_chats VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); NativeByteBuffer data = new NativeByteBuffer(chat.getObjectSize()); NativeByteBuffer data2 = new NativeByteBuffer(chat.a_or_b != null ? chat.a_or_b.length : 1); NativeByteBuffer data3 = new NativeByteBuffer(chat.auth_key != null ? chat.auth_key.length : 1); @@ -8350,6 +8879,7 @@ public class MessagesStorage extends BaseController { state.step(); state.dispose(); + state = null; data.reuse(); data2.reuse(); data3.reuse(); @@ -8374,9 +8904,14 @@ public class MessagesStorage extends BaseController { state.bindInteger(15, dialog.unread_reactions_count); state.step(); state.dispose(); + state = null; } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } @@ -8469,9 +9004,11 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { TLRPC.Chat chat = null; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM chats WHERE uid = %d", chatId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM chats WHERE uid = %d", chatId)); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -8480,6 +9017,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (chat == null || chat.default_banned_rights != null && version < chat.version) { return; } @@ -8487,7 +9025,7 @@ public class MessagesStorage extends BaseController { chat.flags |= 262144; chat.version = version; - SQLitePreparedStatement state = database.executeFast("UPDATE chats SET data = ? WHERE uid = ?"); + state = database.executeFast("UPDATE chats SET data = ? WHERE uid = ?"); NativeByteBuffer data = new NativeByteBuffer(chat.getObjectSize()); chat.serializeToStream(data); state.bindByteBuffer(1, data); @@ -8495,8 +9033,16 @@ public class MessagesStorage extends BaseController { state.step(); data.reuse(); state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } @@ -8670,11 +9216,10 @@ public class MessagesStorage extends BaseController { } putUsersInternal(users); putChatsInternal(chats); - if (withTransaction) { - database.commitTransaction(); - } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); } } @@ -8691,14 +9236,16 @@ public class MessagesStorage extends BaseController { public void removeFromDownloadQueue(long id, int type, boolean move) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { if (move) { int minDate = -1; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(date) FROM download_queue WHERE type = %d", type)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT min(date) FROM download_queue WHERE type = %d", type)); if (cursor.next()) { minDate = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (minDate != -1) { database.executeFast(String.format(Locale.US, "UPDATE download_queue SET date = %d WHERE uid = %d AND type = %d", minDate - 1, id, type)).stepThis().dispose(); } @@ -8707,6 +9254,10 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -8715,11 +9266,12 @@ public class MessagesStorage extends BaseController { if (ids == null || ids.isEmpty()) { return; } + SQLitePreparedStatement state = null; try { if (transaction) { database.beginTransaction(); } - SQLitePreparedStatement state = database.executeFast("DELETE FROM download_queue WHERE uid = ? AND type = ?"); + state = database.executeFast("DELETE FROM download_queue WHERE uid = ? AND type = ?"); for (int a = 0, N = ids.size(); a < N; a++) { Pair pair = ids.get(a); state.requery(); @@ -8728,12 +9280,20 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; if (transaction) { database.commitTransaction(); } AndroidUtilities.runOnUIThread(() -> getDownloadController().cancelDownloading(ids)); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (transaction) { + database.commitTransaction(); + } } } @@ -8753,9 +9313,10 @@ public class MessagesStorage extends BaseController { public void getDownloadQueue(int type) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { ArrayList objects = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, type, data, parent FROM download_queue WHERE type = %d ORDER BY date DESC LIMIT 3", type)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, type, data, parent FROM download_queue WHERE type = %d ORDER BY date DESC LIMIT 3", type)); while (cursor.next()) { DownloadObject downloadObject = new DownloadObject(); downloadObject.type = cursor.intValue(1); @@ -8777,10 +9338,15 @@ public class MessagesStorage extends BaseController { objects.add(downloadObject); } cursor.dispose(); + cursor = null; AndroidUtilities.runOnUIThread(() -> getDownloadController().processDownloadObjects(type, objects)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -8810,10 +9376,13 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; + SQLitePreparedStatement state2 = null; try { ArrayList messages = new ArrayList<>(); for (int a = 0, N = webPages.size(); a < N; a++) { - SQLiteCursor cursor = database.queryFinalized("SELECT mid, uid FROM webpage_pending_v2 WHERE id = " + webPages.keyAt(a)); + cursor = database.queryFinalized("SELECT mid, uid FROM webpage_pending_v2 WHERE id = " + webPages.keyAt(a)); LongSparseArray> dialogs = new LongSparseArray<>(); while (cursor.next()) { long dialogId = cursor.longValue(1); @@ -8825,6 +9394,7 @@ public class MessagesStorage extends BaseController { mids.add(cursor.intValue(0)); } cursor.dispose(); + cursor = null; if (dialogs.isEmpty()) { continue; @@ -8848,6 +9418,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } } @@ -8857,8 +9428,8 @@ public class MessagesStorage extends BaseController { database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET data = ? WHERE mid = ? AND uid = ?"); - SQLitePreparedStatement state2 = database.executeFast("UPDATE media_v4 SET data = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET data = ? WHERE mid = ? AND uid = ?"); + state2 = database.executeFast("UPDATE media_v4 SET data = ? WHERE mid = ? AND uid = ?"); for (int a = 0; a < messages.size(); a++) { TLRPC.Message message = messages.get(a); NativeByteBuffer data = new NativeByteBuffer(message.getObjectSize()); @@ -8879,25 +9450,39 @@ public class MessagesStorage extends BaseController { data.reuse(); } state.dispose(); + state = null; state2.dispose(); + state2 = null; database.commitTransaction(); AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.didReceivedWebpages, messages)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } + if (state2 != null) { + state2.dispose(); + } + database.commitTransaction(); } }); } public void overwriteChannel(long channelId, TLRPC.TL_updates_channelDifferenceTooLong difference, int newDialogType) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { boolean checkInvite = false; long did = -channelId; int pinned = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT pinned FROM dialogs WHERE did = " + did); + cursor = database.queryFinalized("SELECT pinned FROM dialogs WHERE did = " + did); if (!cursor.next()) { if (newDialogType != 0) { checkInvite = true; @@ -8906,6 +9491,7 @@ public class MessagesStorage extends BaseController { pinned = cursor.intValue(0); } cursor.dispose(); + cursor = null; database.executeFast("DELETE FROM chat_pinned_count WHERE uid = " + did).stepThis().dispose(); database.executeFast("DELETE FROM chat_pinned_v2 WHERE uid = " + did).stepThis().dispose(); @@ -8941,6 +9527,10 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -8950,10 +9540,13 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + boolean inTransaction = false; + SQLitePreparedStatement state = null; try { database.beginTransaction(); + inTransaction = true; if (!isEmpty(channelViews)) { - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET media = max((SELECT media FROM messages_v2 WHERE mid = ? AND uid = ?), ?) WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET media = max((SELECT media FROM messages_v2 WHERE mid = ? AND uid = ?), ?) WHERE mid = ? AND uid = ?"); for (int a = 0; a < channelViews.size(); a++) { long peer = channelViews.keyAt(a); SparseIntArray messages = channelViews.valueAt(a); @@ -8970,10 +9563,11 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; } if (!isEmpty(channelForwards)) { - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET forwards = max((SELECT forwards FROM messages_v2 WHERE mid = ? AND uid = ?), ?) WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET forwards = max((SELECT forwards FROM messages_v2 WHERE mid = ? AND uid = ?), ?) WHERE mid = ? AND uid = ?"); for (int a = 0; a < channelForwards.size(); a++) { long peer = channelForwards.keyAt(a); SparseIntArray messages = channelForwards.valueAt(a); @@ -8990,10 +9584,11 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; } if (!isEmpty(channelReplies)) { - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET replies_data = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET replies_data = ? WHERE mid = ? AND uid = ?"); for (int a = 0; a < channelReplies.size(); a++) { long peer = channelReplies.keyAt(a); SparseArray messages = channelReplies.valueAt(a); @@ -9054,20 +9649,31 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; } database.commitTransaction(); + inTransaction = false; } catch (Exception e) { FileLog.e(e); + } finally { + if (inTransaction) { + database.commitTransaction(); + } + if (state != null) { + state.dispose(); + } } }); } private void updateRepliesMaxReadIdInternal(long chatId, int mid, int readMaxId) { + SQLitePreparedStatement state = null; + SQLiteCursor cursor = null; try { long dialogId = -chatId; - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET replies_data = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET replies_data = ? WHERE mid = ? AND uid = ?"); TLRPC.MessageReplies currentReplies = null; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT replies_data FROM messages_v2 WHERE mid = %d AND uid = %d", mid, dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT replies_data FROM messages_v2 WHERE mid = %d AND uid = %d", mid, dialogId)); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -9076,6 +9682,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (currentReplies != null) { currentReplies.read_max_id = readMaxId; state.requery(); @@ -9088,8 +9695,16 @@ public class MessagesStorage extends BaseController { data.reuse(); } state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } } @@ -9103,10 +9718,12 @@ public class MessagesStorage extends BaseController { public void updateRepliesCount(long chatId, int mid, ArrayList repliers, int maxId, int count) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; + SQLiteCursor cursor = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET replies_data = ? WHERE mid = ? AND uid = ?"); + state = database.executeFast("UPDATE messages_v2 SET replies_data = ? WHERE mid = ? AND uid = ?"); TLRPC.MessageReplies currentReplies = null; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.ENGLISH, "SELECT replies_data FROM messages_v2 WHERE mid = %d AND uid = %d", mid, -chatId)); + cursor = database.queryFinalized(String.format(Locale.ENGLISH, "SELECT replies_data FROM messages_v2 WHERE mid = %d AND uid = %d", mid, -chatId)); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -9115,6 +9732,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (currentReplies != null) { currentReplies.replies += count; if (currentReplies.replies < 0) { @@ -9137,8 +9755,16 @@ public class MessagesStorage extends BaseController { data.reuse(); } state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -9149,9 +9775,12 @@ public class MessagesStorage extends BaseController { public void updateMessageVerifyFlags(ArrayList messages) { Utilities.stageQueue.postRunnable(() -> { + boolean databaseInTransaction = false; + SQLitePreparedStatement state = null; try { database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET imp = ? WHERE mid = ? AND uid = ?"); + databaseInTransaction = true; + state = database.executeFast("UPDATE messages_v2 SET imp = ? WHERE mid = ? AND uid = ?"); for (int a = 0, N = messages.size(); a < N; a++) { TLRPC.Message message = messages.get(a); state.requery(); @@ -9167,23 +9796,44 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; database.commitTransaction(); + databaseInTransaction = false; } catch (Exception e) { FileLog.e(e); + } finally { + if (databaseInTransaction) { + database.commitTransaction(); + } + if (state != null) { + state.dispose(); + } } }); } private void putMessagesInternal(ArrayList messages, boolean withTransaction, boolean doNotUpdateDialogDate, int downloadMask, boolean ifNoLastMessage, boolean scheduled) { + boolean databaseInTransaction = false; + SQLitePreparedStatement state_messages = null; + SQLitePreparedStatement state_randoms = null; + SQLitePreparedStatement state_download = null; + SQLitePreparedStatement state_webpage = null; + SQLitePreparedStatement state_media = null; + SQLitePreparedStatement state_polls = null; + SQLitePreparedStatement state_tasks = null; + SQLitePreparedStatement state_dialogs_replace = null; + SQLitePreparedStatement state_dialogs_update = null; + SQLiteCursor cursor = null; try { if (scheduled) { if (withTransaction) { database.beginTransaction(); + databaseInTransaction = true; } - SQLitePreparedStatement state_messages = database.executeFast("REPLACE INTO scheduled_messages_v2 VALUES(?, ?, ?, ?, ?, ?, NULL, 0)"); - SQLitePreparedStatement state_randoms = database.executeFast("REPLACE INTO randoms_v2 VALUES(?, ?, ?)"); + state_messages = database.executeFast("REPLACE INTO scheduled_messages_v2 VALUES(?, ?, ?, ?, ?, ?, NULL, 0)"); + state_randoms = database.executeFast("REPLACE INTO randoms_v2 VALUES(?, ?, ?)"); ArrayList dialogsToUpdate = new ArrayList<>(); for (int a = 0; a < messages.size(); a++) { @@ -9226,10 +9876,13 @@ public class MessagesStorage extends BaseController { } } state_messages.dispose(); + state_messages = null; state_randoms.dispose(); + state_randoms = null; if (withTransaction) { database.commitTransaction(); + databaseInTransaction = false; } for (int a = 0, N = dialogsToUpdate.size(); a < N; a++) { broadcastScheduledMessagesChange(dialogsToUpdate.get(a)); @@ -9241,17 +9894,19 @@ public class MessagesStorage extends BaseController { MessageObject.getDialogId(lastMessage); } int lastMid = -1; - SQLiteCursor cursor = database.queryFinalized("SELECT last_mid FROM dialogs WHERE did = " + lastMessage.dialog_id); + cursor = database.queryFinalized("SELECT last_mid FROM dialogs WHERE did = " + lastMessage.dialog_id); if (cursor.next()) { lastMid = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (lastMid != 0) { return; } } if (withTransaction) { database.beginTransaction(); + databaseInTransaction = false; } LongSparseArray messagesMap = new LongSparseArray<>(); LongSparseIntArray messagesCounts = new LongSparseIntArray(); @@ -9270,13 +9925,13 @@ public class MessagesStorage extends BaseController { LongSparseArray> dialogMessagesIdsMap = new LongSparseArray<>(); LongSparseArray> dialogMentionsIdsMap = new LongSparseArray<>(); - SQLitePreparedStatement state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); - SQLitePreparedStatement state_media = null; - SQLitePreparedStatement state_randoms = database.executeFast("REPLACE INTO randoms_v2 VALUES(?, ?, ?)"); - SQLitePreparedStatement state_download = database.executeFast("REPLACE INTO download_queue VALUES(?, ?, ?, ?, ?)"); - SQLitePreparedStatement state_webpage = database.executeFast("REPLACE INTO webpage_pending_v2 VALUES(?, ?, ?)"); - SQLitePreparedStatement state_polls = null; - SQLitePreparedStatement state_tasks = null; + state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); + state_media = null; + state_randoms = database.executeFast("REPLACE INTO randoms_v2 VALUES(?, ?, ?)"); + state_download = database.executeFast("REPLACE INTO download_queue VALUES(?, ?, ?, ?, ?)"); + state_webpage = database.executeFast("REPLACE INTO webpage_pending_v2 VALUES(?, ?, ?)"); + state_polls = null; + state_tasks = null; int minDeleteTime = Integer.MAX_VALUE; for (int a = 0; a < messages.size(); a++) { @@ -9296,7 +9951,7 @@ public class MessagesStorage extends BaseController { if (!(message.action instanceof TLRPC.TL_messageActionHistoryClear) && (!MessageObject.isOut(message) || message.from_scheduled) && (message.id > 0 || MessageObject.isUnread(message))) { int currentMaxId = dialogsReadMax.get(message.dialog_id, -1); if (currentMaxId == -1) { - SQLiteCursor cursor = database.queryFinalized("SELECT last_mid, inbox_max FROM dialogs WHERE did = " + message.dialog_id); + cursor = database.queryFinalized("SELECT last_mid, inbox_max FROM dialogs WHERE did = " + message.dialog_id); if (cursor.next()) { int lastMessageId = cursor.intValue(0); int inboxMax = cursor.intValue(1); @@ -9309,6 +9964,7 @@ public class MessagesStorage extends BaseController { currentMaxId = 0; } cursor.dispose(); + cursor = null; dialogsReadMax.put(message.dialog_id, currentMaxId); } FileLog.d("update messageRead currentMaxId = " + currentMaxId); @@ -9381,7 +10037,7 @@ public class MessagesStorage extends BaseController { SparseIntArray mediaTypes = dialogMediaTypes.get(dialogId); ArrayList messagesMediaIdsMap = dialogMessagesMediaIdsMap.get(dialogId); SparseIntArray mediaTypesChange = null; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, type FROM media_v4 WHERE mid IN(%s) AND uid = %d", messageMediaIds.toString(), dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, type FROM media_v4 WHERE mid IN(%s) AND uid = %d", messageMediaIds.toString(), dialogId)); while (cursor.next()) { int mid = cursor.intValue(0); int type = cursor.intValue(1); @@ -9402,6 +10058,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (mediaCounts == null) { mediaCounts = new SparseArray<>(); } @@ -9451,7 +10108,7 @@ public class MessagesStorage extends BaseController { StringBuilder messageIds = messageIdsMap.valueAt(b); ArrayList messagesIdsMap = dialogMessagesIdsMap.get(dialogId); ArrayList mentionsIdsMap = dialogMentionsIdsMap.get(dialogId); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE mid IN(%s) AND uid = %d", messageIds.toString(), dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE mid IN(%s) AND uid = %d", messageIds.toString(), dialogId)); while (cursor.next()) { Integer mid = cursor.intValue(0); if (messagesIdsMap != null) { @@ -9462,6 +10119,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (messagesCounts != null) { int count = messagesCounts.get(dialogId, -1); @@ -9501,11 +10159,12 @@ public class MessagesStorage extends BaseController { if (message.action instanceof TLRPC.TL_messageEncryptedAction && !(message.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL || message.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages)) { updateDialog = false; } else if (message.out) { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE mid = %d AND uid = %d", messageId, message.dialog_id)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE mid = %d AND uid = %d", messageId, message.dialog_id)); if (cursor.next()) { updateDialog = false; } cursor.dispose(); + cursor = null; } if (updateDialog) { @@ -9686,20 +10345,26 @@ public class MessagesStorage extends BaseController { state_messages.dispose(); if (state_media != null) { state_media.dispose(); + state_media = null; } if (state_tasks != null) { state_tasks.dispose(); getMessagesController().didAddedNewTask(minDeleteTime, 0, null); + state_tasks = null; } if (state_polls != null) { state_polls.dispose(); + state_polls = null; } state_randoms.dispose(); + state_randoms = null; state_download.dispose(); + state_download = null; state_webpage.dispose(); + state_webpage = null; - SQLitePreparedStatement state_dialogs_replace = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - SQLitePreparedStatement state_dialogs_update = database.executeFast("UPDATE dialogs SET date = ?, unread_count = ?, last_mid = ?, unread_count_i = ? WHERE did = ?"); + state_dialogs_replace = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state_dialogs_update = database.executeFast("UPDATE dialogs SET date = ?, unread_count = ?, last_mid = ?, unread_count_i = ? WHERE did = ?"); ArrayList dids = new ArrayList<>(); for (int a = 0; a < messagesMap.size(); a++) { @@ -9711,7 +10376,7 @@ public class MessagesStorage extends BaseController { long channelId = MessageObject.getChannelId(message); - SQLiteCursor cursor = database.queryFinalized("SELECT date, unread_count, last_mid, unread_count_i FROM dialogs WHERE did = " + key); + cursor = database.queryFinalized("SELECT date, unread_count, last_mid, unread_count_i FROM dialogs WHERE did = " + key); int dialog_date = 0; int last_mid = 0; int old_unread_count = 0; @@ -9726,6 +10391,7 @@ public class MessagesStorage extends BaseController { getMessagesController().checkChatInviter(channelId, true); } cursor.dispose(); + cursor = null; int mentions_count = mentionCounts.get(key, -1); int unread_count = messagesCounts.get(key, -1); @@ -9783,7 +10449,9 @@ public class MessagesStorage extends BaseController { } } state_dialogs_update.dispose(); + state_dialogs_update = null; state_dialogs_replace.dispose(); + state_dialogs_replace = null; if (mediaCounts != null) { state_randoms = database.executeFast("REPLACE INTO media_counts_v2 VALUES(?, ?, ?, ?)"); @@ -9794,12 +10462,13 @@ public class MessagesStorage extends BaseController { long uid = value.keyAt(b); int count = -1; int old = 0; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT count, old FROM media_counts_v2 WHERE uid = %d AND type = %d LIMIT 1", uid, type)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT count, old FROM media_counts_v2 WHERE uid = %d AND type = %d LIMIT 1", uid, type)); if (cursor.next()) { count = cursor.intValue(0); old = cursor.intValue(1); } cursor.dispose(); + cursor = null; if (count != -1) { state_randoms.requery(); count += value.valueAt(b); @@ -9812,9 +10481,11 @@ public class MessagesStorage extends BaseController { } } state_randoms.dispose(); + state_randoms = null; } if (withTransaction) { database.commitTransaction(); + databaseInTransaction = false; } updateFiltersReadCounter(newMessagesCounts, newMentionsCounts, false); getMessagesController().processDialogsUpdateRead(messagesCounts, mentionCounts); @@ -9827,6 +10498,40 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (databaseInTransaction) { + database.commitTransaction(); + } + if (state_messages != null) { + state_messages.dispose(); + } + if (state_randoms != null) { + state_randoms.dispose(); + } + if (state_download != null) { + state_download.dispose(); + } + if (state_webpage != null) { + state_webpage.dispose(); + } + if (state_media != null) { + state_media.dispose(); + } + if (state_polls != null) { + state_polls.dispose(); + } + if (state_tasks != null) { + state_tasks.dispose(); + } + if (state_dialogs_replace != null) { + state_dialogs_replace.dispose(); + } + if (state_dialogs_update != null) { + state_dialogs_update.dispose(); + } + if (cursor != null) { + cursor = null; + } } } @@ -9862,16 +10567,20 @@ public class MessagesStorage extends BaseController { public void setMessageSeq(int mid, int seq_in, int seq_out) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages_seq VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO messages_seq VALUES(?, ?, ?)"); state.requery(); state.bindInteger(1, mid); state.bindInteger(2, seq_in); state.bindInteger(3, seq_out); state.step(); - state.dispose(); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } @@ -10078,12 +10787,13 @@ public class MessagesStorage extends BaseController { } private void updateUsersInternal(ArrayList users, boolean onlyStatus, boolean withTransaction) { + SQLitePreparedStatement state = null; try { if (onlyStatus) { if (withTransaction) { database.beginTransaction(); } - SQLitePreparedStatement state = database.executeFast("UPDATE users SET status = ? WHERE uid = ?"); + state = database.executeFast("UPDATE users SET status = ? WHERE uid = ?"); for (int a = 0, N = users.size(); a < N; a++) { TLRPC.User user = users.get(a); state.requery(); @@ -10096,6 +10806,7 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; if (withTransaction) { database.commitTransaction(); } @@ -10142,6 +10853,11 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } } @@ -10157,9 +10873,10 @@ public class MessagesStorage extends BaseController { } private void markMessagesAsReadInternal(LongSparseIntArray inbox, LongSparseIntArray outbox, SparseIntArray encryptedMessages) { + SQLitePreparedStatement state = null; try { if (!isEmpty(inbox)) { - SQLitePreparedStatement state = database.executeFast("DELETE FROM unread_push_messages WHERE uid = ? AND mid <= ?"); + state = database.executeFast("DELETE FROM unread_push_messages WHERE uid = ? AND mid <= ?"); for (int b = 0; b < inbox.size(); b++) { long key = inbox.keyAt(b); int messageId = inbox.get(key); @@ -10171,6 +10888,7 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; } if (!isEmpty(outbox)) { for (int b = 0; b < outbox.size(); b++) { @@ -10183,25 +10901,31 @@ public class MessagesStorage extends BaseController { for (int a = 0; a < encryptedMessages.size(); a++) { long dialogId = DialogObject.makeEncryptedDialogId(encryptedMessages.keyAt(a)); int max_date = encryptedMessages.valueAt(a); - SQLitePreparedStatement state = database.executeFast("UPDATE messages_v2 SET read_state = read_state | 1 WHERE uid = ? AND date <= ? AND read_state IN(0,2) AND out = 1"); + state = database.executeFast("UPDATE messages_v2 SET read_state = read_state | 1 WHERE uid = ? AND date <= ? AND read_state IN(0,2) AND out = 1"); state.requery(); state.bindLong(1, dialogId); state.bindInteger(2, max_date); state.step(); state.dispose(); + state = null; } } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } } private void markMessagesContentAsReadInternal(long dialogId, ArrayList mids, int date) { + SQLiteCursor cursor = null; try { String midsStr = TextUtils.join(",", mids); database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET read_state = read_state | 2 WHERE mid IN (%s) AND uid = %d", midsStr, dialogId)).stepThis().dispose(); if (date != 0) { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, ttl FROM messages_v2 WHERE mid IN (%s) AND uid = %d AND ttl > 0", midsStr, dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, ttl FROM messages_v2 WHERE mid IN (%s) AND uid = %d AND ttl > 0", midsStr, dialogId)); ArrayList arrayList = null; while (cursor.next()) { if (arrayList == null) { @@ -10213,9 +10937,14 @@ public class MessagesStorage extends BaseController { emptyMessagesMedia(dialogId, arrayList); } cursor.dispose(); + cursor = null; } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } } @@ -10223,11 +10952,13 @@ public class MessagesStorage extends BaseController { if (isEmpty(mids)) { return; } + storageQueue.postRunnable(() -> { if (dialogId == 0) { + SQLiteCursor cursor = null; try { LongSparseArray> sparseArray = new LongSparseArray<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, mid FROM messages_v2 WHERE mid IN (%s) AND is_channel = 0", TextUtils.join(",", mids))); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, mid FROM messages_v2 WHERE mid IN (%s) AND is_channel = 0", TextUtils.join(",", mids))); while (cursor.next()) { long did = cursor.longValue(0); ArrayList arrayList = sparseArray.get(did); @@ -10238,11 +10969,16 @@ public class MessagesStorage extends BaseController { arrayList.add(cursor.intValue(1)); } cursor.dispose(); + cursor = null; for (int a = 0, N = sparseArray.size(); a < N; a++) { markMessagesContentAsReadInternal(sparseArray.keyAt(a), sparseArray.valueAt(a), date); } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } } else { markMessagesContentAsReadInternal(dialogId, mids, date); @@ -10263,9 +10999,10 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { String ids = TextUtils.join(",", messages); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, uid FROM randoms_v2 WHERE random_id IN(%s)", ids)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, uid FROM randoms_v2 WHERE random_id IN(%s)", ids)); LongSparseArray> dialogs = new LongSparseArray<>(); while (cursor.next()) { long dialogId = cursor.longValue(1); @@ -10277,18 +11014,23 @@ public class MessagesStorage extends BaseController { mids.add(cursor.intValue(0)); } cursor.dispose(); + cursor = null; if (!dialogs.isEmpty()) { for (int a = 0, N = dialogs.size(); a < N; a++) { long dialogId = dialogs.keyAt(a); ArrayList mids = dialogs.valueAt(a); AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.messagesDeleted, mids, 0L, false)); - updateDialogsWithReadMessagesInternal(mids, null, null, null); + updateDialogsWithReadMessagesInternal(mids, null, null, null, null); markMessagesAsDeletedInternal(dialogId, mids, true, false); updateDialogsWithDeletedMessagesInternal(dialogId, 0, mids, null); } } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -10302,8 +11044,9 @@ public class MessagesStorage extends BaseController { } private void broadcastScheduledMessagesChange(Long did) { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM scheduled_messages_v2 WHERE uid = %d", did)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM scheduled_messages_v2 WHERE uid = %d", did)); int count; if (cursor.next()) { count = cursor.intValue(0); @@ -10311,13 +11054,20 @@ public class MessagesStorage extends BaseController { count = 0; } cursor.dispose(); + cursor = null; AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.scheduledMessagesUpdated, did, count)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } } private ArrayList markMessagesAsDeletedInternal(long dialogId, ArrayList messages, boolean deleteFiles, boolean scheduled) { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { ArrayList dialogsIds = new ArrayList<>(); if (scheduled) { @@ -10325,7 +11075,7 @@ public class MessagesStorage extends BaseController { ArrayList dialogsToUpdate = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid FROM scheduled_messages_v2 WHERE mid IN(%s) AND uid = %d", ids, dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid FROM scheduled_messages_v2 WHERE mid IN(%s) AND uid = %d", ids, dialogId)); try { while (cursor.next()) { long did = cursor.longValue(0); @@ -10337,6 +11087,7 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } cursor.dispose(); + cursor = null; database.executeFast(String.format(Locale.US, "DELETE FROM scheduled_messages_v2 WHERE mid IN(%s) AND uid = %d", ids, dialogId)).stepThis().dispose(); for (int a = 0, N = dialogsToUpdate.size(); a < N; a++) { @@ -10351,7 +11102,6 @@ public class MessagesStorage extends BaseController { ArrayList namesToDelete = new ArrayList<>(); ArrayList> idsToDelete = new ArrayList<>(); long currentUser = getUserConfig().getClientUserId(); - SQLiteCursor cursor; if (dialogId != 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, data, read_state, out, mention, mid FROM messages_v2 WHERE mid IN(%s) AND uid = %d", ids, dialogId)); } else { @@ -10400,9 +11150,9 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } cursor.dispose(); + cursor = null; - getMessagesStorage().getDatabase().beginTransaction(); - SQLitePreparedStatement state; + database.beginTransaction(); for (int i = 0; i < 2; i++) { if (i == 0) { if (dialogId != 0) { @@ -10429,7 +11179,8 @@ public class MessagesStorage extends BaseController { } state.step(); state.dispose(); - getMessagesStorage().getDatabase().commitTransaction(); + state = null; + database.commitTransaction(); data.reuse(); } @@ -10449,6 +11200,7 @@ public class MessagesStorage extends BaseController { old_mentions_count = cursor.intValue(1); } cursor.dispose(); + cursor = null; dialogsIds.add(did); state = database.executeFast("UPDATE dialogs SET unread_count = ?, unread_count_i = ? WHERE did = ?"); @@ -10458,6 +11210,7 @@ public class MessagesStorage extends BaseController { state.bindLong(3, did); state.step(); state.dispose(); + state = null; } for (int a = 0, N = messagesByDialogs.size(); a < N; a++) { @@ -10478,6 +11231,7 @@ public class MessagesStorage extends BaseController { updatedCount = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (updatedCount > 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT count FROM chat_pinned_count WHERE uid = %d", did)); if (cursor.next()) { @@ -10490,6 +11244,7 @@ public class MessagesStorage extends BaseController { state.dispose(); } cursor.dispose(); + cursor = null; } database.executeFast(String.format(Locale.US, "DELETE FROM messages_v2 WHERE mid IN(%s) AND uid = %d", ids, did)).stepThis().dispose(); database.executeFast(String.format(Locale.US, "DELETE FROM polls_v2 WHERE mid IN(%s) AND uid = %d", ids, did)).stepThis().dispose(); @@ -10519,6 +11274,7 @@ public class MessagesStorage extends BaseController { counts.put(uid, count); } cursor.dispose(); + cursor = null; if (mediaCounts != null) { state = database.executeFast("REPLACE INTO media_counts_v2 VALUES(?, ?, ?, ?)"); for (int c = 0, N3 = mediaCounts.size(); c < N3; c++) { @@ -10546,9 +11302,9 @@ public class MessagesStorage extends BaseController { } } state.dispose(); + state = null; } } - long time = System.currentTimeMillis(); database.executeFast(String.format(Locale.US, "DELETE FROM media_v4 WHERE mid IN(%s) AND uid = %d", ids, did)).stepThis().dispose(); } database.executeFast(String.format(Locale.US, "DELETE FROM messages_seq WHERE mid IN(%s)", ids)).stepThis().dispose(); @@ -10569,26 +11325,36 @@ public class MessagesStorage extends BaseController { return dialogsIds; } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } return null; } private void updateDialogsWithDeletedMessagesInternal(long originalDialogId, long channelId, ArrayList messages, ArrayList additionalDialogsToUpdate) { + SQLitePreparedStatement state = null; + SQLiteCursor cursor = null; try { ArrayList dialogsToUpdate = new ArrayList<>(); if (!messages.isEmpty()) { - SQLitePreparedStatement state; if (channelId != 0) { dialogsToUpdate.add(-channelId); state = database.executeFast("UPDATE dialogs SET last_mid = (SELECT mid FROM messages_v2 WHERE uid = ? AND date = (SELECT MAX(date) FROM messages_v2 WHERE uid = ?)) WHERE did = ?"); } else { if (originalDialogId == 0) { String ids = TextUtils.join(",", messages); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM dialogs WHERE last_mid IN(%s) AND flags = 0", ids)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM dialogs WHERE last_mid IN(%s) AND flags = 0", ids)); while (cursor.next()) { dialogsToUpdate.add(cursor.longValue(0)); } cursor.dispose(); + cursor = null; } else { dialogsToUpdate.add(originalDialogId); } @@ -10604,6 +11370,7 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; database.commitTransaction(); } else { dialogsToUpdate.add(-channelId); @@ -10623,7 +11390,7 @@ public class MessagesStorage extends BaseController { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedToLoad = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, m.date, d.pts, d.inbox_max, d.outbox_max, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid WHERE d.did IN(%s)", ids)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, m.date, d.pts, d.inbox_max, d.outbox_max, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid WHERE d.did IN(%s)", ids)); while (cursor.next()) { long dialogId = cursor.longValue(0); TLRPC.Dialog dialog; @@ -10676,7 +11443,7 @@ public class MessagesStorage extends BaseController { message.dialog_id = dialog.id; dialogs.messages.add(message); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); } if (!DialogObject.isEncryptedDialog(dialogId)) { if (dialog.read_inbox_max_id > dialog.top_message) { @@ -10699,6 +11466,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (!encryptedToLoad.isEmpty()) { getEncryptedChatsInternal(TextUtils.join(",", encryptedToLoad), encryptedChats, usersToLoad); @@ -10717,6 +11485,14 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } } @@ -10741,8 +11517,9 @@ public class MessagesStorage extends BaseController { } private ArrayList markMessagesAsDeletedInternal(long channelId, int mid, boolean deleteFiles) { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { - String ids; ArrayList dialogsIds = new ArrayList<>(); LongSparseArray dialogsToUpdate = new LongSparseArray<>(); @@ -10751,7 +11528,7 @@ public class MessagesStorage extends BaseController { ArrayList> idsToDelete = new ArrayList<>(); long currentUser = getUserConfig().getClientUserId(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, data, read_state, out, mention FROM messages_v2 WHERE uid = %d AND mid <= %d", -channelId, mid)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, data, read_state, out, mention FROM messages_v2 WHERE uid = %d AND mid <= %d", -channelId, mid)); try { while (cursor.next()) { @@ -10787,6 +11564,7 @@ public class MessagesStorage extends BaseController { FileLog.e(e); } cursor.dispose(); + cursor = null; deleteFromDownloadQueue(idsToDelete, true); AndroidUtilities.runOnUIThread(() -> getFileLoader().cancelLoadFiles(namesToDelete)); @@ -10804,15 +11582,17 @@ public class MessagesStorage extends BaseController { old_mentions_count = cursor.intValue(1); } cursor.dispose(); + cursor = null; dialogsIds.add(did); - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET unread_count = ?, unread_count_i = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET unread_count = ?, unread_count_i = ? WHERE did = ?"); state.requery(); state.bindInteger(1, Math.max(0, old_unread_count - counts[0])); state.bindInteger(2, Math.max(0, old_mentions_count - counts[1])); state.bindLong(3, did); state.step(); state.dispose(); + state = null; } @@ -10824,18 +11604,21 @@ public class MessagesStorage extends BaseController { updatedCount = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (updatedCount > 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT count FROM chat_pinned_count WHERE uid = %d", -channelId)); if (cursor.next()) { int count = cursor.intValue(0); - SQLitePreparedStatement state = database.executeFast("UPDATE chat_pinned_count SET count = ? WHERE uid = ?"); + state = database.executeFast("UPDATE chat_pinned_count SET count = ? WHERE uid = ?"); state.requery(); state.bindInteger(1, Math.max(0, count - updatedCount)); state.bindLong(2, -channelId); state.step(); state.dispose(); + state = null; } cursor.dispose(); + cursor = null; } database.executeFast(String.format(Locale.US, "DELETE FROM messages_v2 WHERE uid = %d AND mid <= %d", -channelId, mid)).stepThis().dispose(); @@ -10845,6 +11628,13 @@ public class MessagesStorage extends BaseController { return dialogsIds; } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } return null; } @@ -10880,13 +11670,21 @@ public class MessagesStorage extends BaseController { } else { database.executeFast(String.format(Locale.US, "DELETE FROM " + table + " WHERE uid = %d AND start = 0", did)).stepThis().dispose(); } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO " + table + " VALUES(?, ?, ?)"); - state.requery(); - state.bindLong(1, did); - state.bindInteger(2, 1); - state.bindInteger(3, 1); - state.step(); - state.dispose(); + SQLitePreparedStatement state = null; + try { + state = database.executeFast("REPLACE INTO " + table + " VALUES(?, ?, ?)"); + state.requery(); + state.bindLong(1, did); + state.bindInteger(2, 1); + state.bindInteger(3, 1); + state.step(); + } catch (Exception e) { + throw e; + } finally { + if (state != null) { + state.dispose(); + } + } } public void doneHolesInMedia(long did, int max_id, int type) throws Exception { @@ -10896,30 +11694,48 @@ public class MessagesStorage extends BaseController { } else { database.executeFast(String.format(Locale.US, "DELETE FROM media_holes_v2 WHERE uid = %d AND start = 0", did)).stepThis().dispose(); } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); - for (int a = 0; a < MediaDataController.MEDIA_TYPES_COUNT; a++) { - state.requery(); - state.bindLong(1, did); - state.bindInteger(2, a); - state.bindInteger(3, 1); - state.bindInteger(4, 1); - state.step(); + SQLitePreparedStatement state = null; + try { + state = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); + for (int a = 0; a < MediaDataController.MEDIA_TYPES_COUNT; a++) { + state.requery(); + state.bindLong(1, did); + state.bindInteger(2, a); + state.bindInteger(3, 1); + state.bindInteger(4, 1); + state.step(); + } + } catch (Exception e) { + throw e; + } finally { + if (state != null) { + state.dispose(); + } } - state.dispose(); + } else { if (max_id == 0) { database.executeFast(String.format(Locale.US, "DELETE FROM media_holes_v2 WHERE uid = %d AND type = %d", did, type)).stepThis().dispose(); } else { database.executeFast(String.format(Locale.US, "DELETE FROM media_holes_v2 WHERE uid = %d AND type = %d AND start = 0", did, type)).stepThis().dispose(); } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); - state.requery(); - state.bindLong(1, did); - state.bindInteger(2, type); - state.bindInteger(3, 1); - state.bindInteger(4, 1); - state.step(); - state.dispose(); + SQLitePreparedStatement state = null; + try { + state = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); + state.requery(); + state.bindLong(1, did); + state.bindInteger(2, type); + state.bindInteger(3, 1); + state.bindInteger(4, 1); + state.step(); + state.dispose(); + } catch (Exception e) { + throw e; + } finally { + if (state != null) { + state.dispose(); + } + } } } @@ -10942,9 +11758,10 @@ public class MessagesStorage extends BaseController { } public void closeHolesInMedia(long did, int minId, int maxId, int type) { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { boolean ok = false; - SQLiteCursor cursor; if (type < 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT type, start, end FROM media_holes_v2 WHERE uid = %d AND type >= 0 AND ((end >= %d AND end <= %d) OR (start >= %d AND start <= %d) OR (start >= %d AND end <= %d) OR (start <= %d AND end >= %d))", did, minId, maxId, minId, maxId, minId, maxId, minId, maxId)); } else { @@ -10964,6 +11781,7 @@ public class MessagesStorage extends BaseController { holes.add(new Hole(holeType, start, end)); } cursor.dispose(); + cursor = null; if (holes != null) { for (int a = 0; a < holes.size(); a++) { Hole hole = holes.get(a); @@ -10987,7 +11805,7 @@ public class MessagesStorage extends BaseController { } } else { database.executeFast(String.format(Locale.US, "DELETE FROM media_holes_v2 WHERE uid = %d AND type = %d AND start = %d AND end = %d", did, hole.type, hole.start, hole.end)).stepThis().dispose(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); state.requery(); state.bindLong(1, did); state.bindInteger(2, hole.type); @@ -11001,18 +11819,28 @@ public class MessagesStorage extends BaseController { state.bindInteger(4, hole.end); state.step(); state.dispose(); + state = null; } } } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } } private void closeHolesInTable(String table, long did, int minId, int maxId) { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { boolean ok = false; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT start, end FROM " + table + " WHERE uid = %d AND ((end >= %d AND end <= %d) OR (start >= %d AND start <= %d) OR (start >= %d AND end <= %d) OR (start <= %d AND end >= %d))", did, minId, maxId, minId, maxId, minId, maxId, minId, maxId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT start, end FROM " + table + " WHERE uid = %d AND ((end >= %d AND end <= %d) OR (start >= %d AND start <= %d) OR (start >= %d AND end <= %d) OR (start <= %d AND end >= %d))", did, minId, maxId, minId, maxId, minId, maxId, minId, maxId)); ArrayList holes = null; while (cursor.next()) { if (holes == null) { @@ -11026,6 +11854,7 @@ public class MessagesStorage extends BaseController { holes.add(new Hole(start, end)); } cursor.dispose(); + cursor = null; if (holes != null) { for (int a = 0; a < holes.size(); a++) { Hole hole = holes.get(a); @@ -11049,7 +11878,7 @@ public class MessagesStorage extends BaseController { } } else { database.executeFast(String.format(Locale.US, "DELETE FROM " + table + " WHERE uid = %d AND start = %d AND end = %d", did, hole.start, hole.end)).stepThis().dispose(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO " + table + " VALUES(?, ?, ?)"); + state = database.executeFast("REPLACE INTO " + table + " VALUES(?, ?, ?)"); state.requery(); state.bindLong(1, did); state.bindInteger(2, hole.start); @@ -11061,11 +11890,19 @@ public class MessagesStorage extends BaseController { state.bindInteger(3, hole.end); state.step(); state.dispose(); + state = null; } } } } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } } @@ -11074,6 +11911,8 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; + SQLitePreparedStatement state2 = null; try { SQLiteCursor cursor = null; int readState = 0; @@ -11095,8 +11934,8 @@ public class MessagesStorage extends BaseController { database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); - SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); + state2 = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); if (message.dialog_id == 0) { MessageObject.getDialogId(message); } @@ -11166,7 +12005,9 @@ public class MessagesStorage extends BaseController { data.reuse(); state.dispose(); + state = null; state2.dispose(); + state2 = null; database.commitTransaction(); if (broadcast) { @@ -11187,16 +12028,31 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } + if (state2 != null) { + state2.dispose(); + } } }); } public void putMessages(TLRPC.messages_Messages messages, long dialogId, int load_type, int max_id, boolean createDialog, boolean scheduled) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state_messages = null; + SQLitePreparedStatement state_media = null; + SQLitePreparedStatement state_polls = null; + SQLitePreparedStatement state_webpage = null; + SQLitePreparedStatement state_tasks = null; + SQLitePreparedStatement state3 = null; + SQLiteCursor cursor = null; try { if (scheduled) { database.executeFast(String.format(Locale.US, "DELETE FROM scheduled_messages_v2 WHERE uid = %d AND mid > 0", dialogId)).stepThis().dispose(); - SQLitePreparedStatement state_messages = database.executeFast("REPLACE INTO scheduled_messages_v2 VALUES(?, ?, ?, ?, ?, ?, NULL, 0)"); + state_messages = database.executeFast("REPLACE INTO scheduled_messages_v2 VALUES(?, ?, ?, ?, ?, ?, NULL, 0)"); int count = messages.messages.size(); for (int a = 0; a < count; a++) { TLRPC.Message message = messages.messages.get(a); @@ -11219,6 +12075,7 @@ public class MessagesStorage extends BaseController { data.reuse(); } state_messages.dispose(); + state_messages = null; putUsersInternal(messages.users); putChatsInternal(messages.chats); @@ -11261,11 +12118,11 @@ public class MessagesStorage extends BaseController { ArrayList namesToDelete = new ArrayList<>(); ArrayList> idsToDelete = new ArrayList<>(); - SQLitePreparedStatement state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); - SQLitePreparedStatement state_media = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); - SQLitePreparedStatement state_polls = null; - SQLitePreparedStatement state_webpage = null; - SQLitePreparedStatement state_tasks = null; + state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, ?)"); + state_media = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); + state_polls = null; + state_webpage = null; + state_tasks = null; int minDeleteTime = Integer.MAX_VALUE; TLRPC.Message botKeyboard = null; long channelId = 0; @@ -11277,7 +12134,7 @@ public class MessagesStorage extends BaseController { } if (load_type == -2) { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, data, ttl, mention, read_state, send_state, custom_params FROM messages_v2 WHERE mid = %d AND uid = %d", message.id, MessageObject.getDialogId(message))); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, data, ttl, mention, read_state, send_state, custom_params FROM messages_v2 WHERE mid = %d AND uid = %d", message.id, MessageObject.getDialogId(message))); boolean exist; if (exist = cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(1); @@ -11329,6 +12186,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (!exist) { continue; } @@ -11338,7 +12196,7 @@ public class MessagesStorage extends BaseController { int pinned = 0; int mentions = 0; int flags = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT pinned, unread_count_i, flags FROM dialogs WHERE did = " + dialogId); + cursor = database.queryFinalized("SELECT pinned, unread_count_i, flags FROM dialogs WHERE did = " + dialogId); boolean exist; if (exist = cursor.next()) { pinned = cursor.intValue(0); @@ -11346,8 +12204,8 @@ public class MessagesStorage extends BaseController { flags = cursor.intValue(2); } cursor.dispose(); + cursor = null; - SQLitePreparedStatement state3; if (exist) { state3 = database.executeFast("UPDATE dialogs SET date = ?, last_mid = ?, inbox_max = ?, last_mid_i = ?, pts = ?, date_i = ? WHERE did = ?"); state3.bindInteger(1, message.date); @@ -11378,6 +12236,7 @@ public class MessagesStorage extends BaseController { } state3.step(); state3.dispose(); + state3 = null; } fixUnsupportedMedia(message); @@ -11493,16 +12352,21 @@ public class MessagesStorage extends BaseController { } } state_messages.dispose(); + state_messages = null; state_media.dispose(); + state_media = null; if (state_webpage != null) { state_webpage.dispose(); + state_webpage = null; } if (state_tasks != null) { state_tasks.dispose(); getMessagesController().didAddedNewTask(minDeleteTime, 0, null); + state_tasks = null; } if (state_polls != null) { state_polls.dispose(); + state_polls = null; } if (botKeyboard != null) { getMediaDataController().putBotKeyboard(dialogId, botKeyboard); @@ -11528,11 +12392,34 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state_messages != null) { + state_messages.dispose(); + } + if (state_media != null) { + state_media.dispose(); + } + if (state_polls != null) { + state_polls.dispose(); + } + if (state_webpage != null) { + state_webpage.dispose(); + } + if (state_tasks != null) { + state_tasks.dispose(); + } + if (state3 != null) { + state3.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } }); } - public static void addUsersAndChatsFromMessage(TLRPC.Message message, ArrayList usersToLoad, ArrayList chatsToLoad) { + public static void addUsersAndChatsFromMessage(TLRPC.Message message, ArrayList usersToLoad, ArrayList chatsToLoad, ArrayList emojiToLoad) { long fromId = MessageObject.getFromChatId(message); if (DialogObject.isUserDialog(fromId)) { if (!usersToLoad.contains(fromId)) { @@ -11591,6 +12478,8 @@ public class MessagesStorage extends BaseController { 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); + } else if (emojiToLoad != null && entity instanceof TLRPC.TL_messageEntityCustomEmoji) { + emojiToLoad.add(((TLRPC.TL_messageEntityCustomEmoji) entity).document_id); } } } @@ -11697,12 +12586,14 @@ public class MessagesStorage extends BaseController { storageQueue.postRunnable(() -> { TLRPC.messages_Dialogs dialogs = new TLRPC.TL_messages_dialogs(); ArrayList encryptedChats = new ArrayList<>(); + SQLiteCursor cursor = null; try { ArrayList usersToLoad = new ArrayList<>(); usersToLoad.add(getUserConfig().getClientUserId()); ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedToLoad = new ArrayList<>(); ArrayList loadedDialogs = new ArrayList<>(); + ArrayList emojiToLoad = new ArrayList<>(); LongSparseArray>> replyMessageOwners = new LongSparseArray<>(); LongSparseArray> dialogReplyMessagesIds = new LongSparseArray<>(); ArrayList foldersToLoad = new ArrayList<>(2); @@ -11719,7 +12610,7 @@ public class MessagesStorage extends BaseController { cnt = 100; } - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.folder_id = %d ORDER BY d.pinned DESC, d.date DESC LIMIT %d,%d", fid, off, cnt)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.folder_id = %d ORDER BY d.pinned DESC, d.date DESC LIMIT %d,%d", fid, off, cnt)); while (cursor.next()) { long dialogId = cursor.longValue(0); TLRPC.Dialog dialog; @@ -11788,7 +12679,7 @@ public class MessagesStorage extends BaseController { message.dialog_id = dialog.id; dialogs.messages.add(message); - addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, emojiToLoad); try { if (message.reply_to != null && message.reply_to.reply_to_msg_id != 0 && ( @@ -11802,7 +12693,7 @@ public class MessagesStorage extends BaseController { message.replyMessage.readAttachPath(data2, getUserConfig().clientUserId); data2.reuse(); if (message.replyMessage != null) { - addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad); + addUsersAndChatsFromMessage(message.replyMessage, usersToLoad, chatsToLoad, emojiToLoad); } } } @@ -11840,6 +12731,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } loadReplyMessages(replyMessageOwners, dialogReplyMessagesIds, usersToLoad, chatsToLoad, false); @@ -11870,11 +12762,12 @@ public class MessagesStorage extends BaseController { if (!unloadedDialogs.isEmpty()) { folderIds = new LongSparseArray<>(unloadedDialogs.size()); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT did, folder_id FROM dialogs WHERE did IN(%s)", TextUtils.join(",", unloadedDialogs))); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT did, folder_id FROM dialogs WHERE did IN(%s)", TextUtils.join(",", unloadedDialogs))); while (cursor.next()) { folderIds.put(cursor.longValue(0), cursor.intValue(1)); } cursor.dispose(); + cursor = null; } else { folderIds = null; } @@ -11907,6 +12800,10 @@ public class MessagesStorage extends BaseController { encryptedChats.clear(); FileLog.e(e); getMessagesController().processLoadedDialogs(dialogs, encryptedChats, folderId, 0, 100, 1, true, false, true); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -11929,6 +12826,15 @@ public class MessagesStorage extends BaseController { } private void putDialogsInternal(TLRPC.messages_Dialogs dialogs, int check) { + SQLitePreparedStatement state_messages = null; + SQLitePreparedStatement state_dialogs = null; + SQLitePreparedStatement state_media = null; + SQLitePreparedStatement state_settings = null; + SQLitePreparedStatement state_holes = null; + SQLitePreparedStatement state_media_holes = null; + SQLitePreparedStatement state_polls = null; + SQLitePreparedStatement state_tasks = null; + SQLiteCursor cursor = null; try { database.beginTransaction(); LongSparseArray new_dialogMessage = new LongSparseArray<>(dialogs.messages.size()); @@ -11938,14 +12844,14 @@ public class MessagesStorage extends BaseController { } if (!dialogs.dialogs.isEmpty()) { - SQLitePreparedStatement state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, NULL)"); - SQLitePreparedStatement state_dialogs = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - SQLitePreparedStatement state_media = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); - SQLitePreparedStatement state_settings = database.executeFast("REPLACE INTO dialog_settings VALUES(?, ?)"); - SQLitePreparedStatement state_holes = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); - SQLitePreparedStatement state_media_holes = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); - SQLitePreparedStatement state_polls = null; - SQLitePreparedStatement state_tasks = null; + state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, NULL)"); + state_dialogs = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state_media = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); + state_settings = database.executeFast("REPLACE INTO dialog_settings VALUES(?, ?)"); + state_holes = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); + state_media_holes = database.executeFast("REPLACE INTO media_holes_v2 VALUES(?, ?, ?, ?)"); + state_polls = null; + state_tasks = null; int minDeleteTime = Integer.MAX_VALUE; for (int a = 0; a < dialogs.dialogs.size(); a++) { @@ -11955,14 +12861,15 @@ public class MessagesStorage extends BaseController { unknownDialogsIds.remove(dialog.id); if (check == 1) { - SQLiteCursor cursor = database.queryFinalized("SELECT did FROM dialogs WHERE did = " + dialog.id); + cursor = database.queryFinalized("SELECT did FROM dialogs WHERE did = " + dialog.id); exists = cursor.next(); cursor.dispose(); + cursor = null; if (exists) { continue; } } else if (check == 2) { - SQLiteCursor cursor = database.queryFinalized("SELECT pinned FROM dialogs WHERE did = " + dialog.id); + cursor = database.queryFinalized("SELECT pinned FROM dialogs WHERE did = " + dialog.id); if (cursor.next()) { exists = true; if (dialog.pinned) { @@ -11970,13 +12877,15 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } else if (check == 3) { int mid = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT last_mid FROM dialogs WHERE did = " + dialog.id); + cursor = database.queryFinalized("SELECT last_mid FROM dialogs WHERE did = " + dialog.id); if (cursor.next()) { mid = cursor.intValue(0); } cursor.dispose(); + cursor = null; if (mid < 0) { continue; } @@ -12119,11 +13028,17 @@ public class MessagesStorage extends BaseController { } } state_messages.dispose(); + state_messages = null; state_dialogs.dispose(); + state_dialogs = null; state_media.dispose(); + state_media = null; state_settings.dispose(); + state_settings = null; state_holes.dispose(); + state_holes = null; state_media_holes.dispose(); + state_media_holes = null; if (state_tasks != null) { state_tasks.dispose(); getMessagesController().didAddedNewTask(minDeleteTime, 0, null); @@ -12140,17 +13055,50 @@ public class MessagesStorage extends BaseController { resetAllUnreadCounters(false); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (cursor != null) { + cursor.dispose(); + } + if (state_messages != null) { + state_messages.dispose(); + } + if (state_dialogs != null) { + state_dialogs.dispose(); + } + if (state_media != null) { + state_media.dispose(); + } + if (state_settings != null) { + state_settings.dispose(); + } + if (state_holes != null) { + state_holes.dispose(); + } + if (state_holes != null) { + state_holes.dispose(); + } + if (state_media_holes != null) { + state_media_holes.dispose(); + } + if (state_polls != null) { + state_polls.dispose(); + } + if (state_tasks != null) { + state_tasks.dispose(); + } } } public void getDialogFolderId(long dialogId, IntCallback callback) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; try { int folderId; if (unknownDialogsIds.get(dialogId) != null) { folderId = -1; } else { - SQLiteCursor cursor = database.queryFinalized("SELECT folder_id FROM dialogs WHERE did = ?", dialogId); + cursor = database.queryFinalized("SELECT folder_id FROM dialogs WHERE did = ?", dialogId); if (cursor.next()) { folderId = cursor.intValue(0); } else { @@ -12161,6 +13109,10 @@ public class MessagesStorage extends BaseController { AndroidUtilities.runOnUIThread(() -> callback.run(folderId)); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } }); } @@ -12170,9 +13122,10 @@ public class MessagesStorage extends BaseController { return; } storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { database.beginTransaction(); - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET folder_id = ?, pinned = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET folder_id = ?, pinned = ? WHERE did = ?"); if (peers != null) { for (int a = 0, N = peers.size(); a < N; a++) { TLRPC.TL_folderPeer folderPeer = peers.get(a); @@ -12203,18 +13156,25 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; database.commitTransaction(); checkIfFolderEmptyInternal(1); resetAllUnreadCounters(false); } catch (Exception e) { FileLog.e(e); + } finally { + database.commitTransaction(); + if (state != null) { + state.dispose(); + } } }); } private void checkIfFolderEmptyInternal(int folderId) { + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized("SELECT did FROM dialogs WHERE folder_id = ?", folderId); + cursor = database.queryFinalized("SELECT did FROM dialogs WHERE folder_id = ?", folderId); boolean isEmpty = true; while (cursor.next()) { long did = cursor.longValue(0); @@ -12236,6 +13196,10 @@ public class MessagesStorage extends BaseController { } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } } @@ -12245,9 +13209,11 @@ public class MessagesStorage extends BaseController { public void unpinAllDialogsExceptNew(ArrayList dids, int folderId) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { ArrayList unpinnedDialogs = new ArrayList<>(); - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT did, folder_id FROM dialogs WHERE pinned > 0 AND did NOT IN (%s)", TextUtils.join(",", dids))); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT did, folder_id FROM dialogs WHERE pinned > 0 AND did NOT IN (%s)", TextUtils.join(",", dids))); while (cursor.next()) { long did = cursor.longValue(0); int fid = cursor.intValue(1); @@ -12256,8 +13222,9 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (!unpinnedDialogs.isEmpty()) { - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET pinned = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET pinned = ? WHERE did = ?"); for (int a = 0; a < unpinnedDialogs.size(); a++) { long did = unpinnedDialogs.get(a); state.requery(); @@ -12266,15 +13233,24 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + if (state != null) { + state.dispose(); + } } }); } public void setDialogUnread(long did, boolean unread) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { int flags = 0; SQLiteCursor cursor = null; @@ -12297,7 +13273,7 @@ public class MessagesStorage extends BaseController { flags &= ~1; } - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET flags = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET flags = ? WHERE did = ?"); state.bindInteger(1, flags); state.bindLong(2, did); state.step(); @@ -12305,6 +13281,10 @@ public class MessagesStorage extends BaseController { resetAllUnreadCounters(false); } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } @@ -12334,22 +13314,29 @@ public class MessagesStorage extends BaseController { public void setDialogPinned(long did, int pinned) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET pinned = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET pinned = ? WHERE did = ?"); state.bindInteger(1, pinned); state.bindLong(2, did); state.step(); state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } public void setDialogsPinned(ArrayList dids, ArrayList pinned) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET pinned = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET pinned = ? WHERE did = ?"); for (int a = 0, N = dids.size(); a < N; a++) { state.requery(); state.bindInteger(1, pinned.get(a)); @@ -12357,8 +13344,13 @@ public class MessagesStorage extends BaseController { state.step(); } state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } } }); } @@ -12554,6 +13546,7 @@ public class MessagesStorage extends BaseController { public void localSearch(int dialogsType, String query, ArrayList resultArray, ArrayList resultArrayNames, ArrayList encUsers, int folderId) { long selfUserId = UserConfig.getInstance(currentAccount).getClientUserId(); + SQLiteCursor cursor = null; try { String search1 = query.trim().toLowerCase(); if (TextUtils.isEmpty(search1)) { @@ -12579,7 +13572,6 @@ public class MessagesStorage extends BaseController { int resultCount = 0; LongSparseArray dialogsResult = new LongSparseArray<>(); - SQLiteCursor cursor; if (folderId >= 0) { cursor = getDatabase().queryFinalized("SELECT did, date FROM dialogs WHERE folder_id = ? ORDER BY date DESC LIMIT 600", folderId); } else { @@ -12615,6 +13607,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (dialogsType != 4 && (savedMessages).startsWith(search1) || savedMessages2.startsWith(search1)) { TLRPC.User user = UserConfig.getInstance(currentAccount).getCurrentUser(); @@ -12683,6 +13676,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } if (!chatsToLoad.isEmpty()) { @@ -12712,6 +13706,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } if (!encryptedToLoad.isEmpty()) { @@ -12792,6 +13787,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } ArrayList searchResults = new ArrayList<>(resultCount); @@ -12861,16 +13857,22 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; } } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } } public ArrayList getCachedMessagesInRange(long dialogId, int minDate, int maxDate) { ArrayList messageIds = new ArrayList<>(); + SQLiteCursor cursor = null; try { - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE uid = %d AND date >= %d AND date <= %d", dialogId, minDate, maxDate)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid FROM messages_v2 WHERE uid = %d AND date >= %d AND date <= %d", dialogId, minDate, maxDate)); try { while (cursor.next()) { int mid = cursor.intValue(0); @@ -12882,27 +13884,38 @@ public class MessagesStorage extends BaseController { cursor.dispose(); } catch (Exception e) { FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } } return messageIds; } public void updateUnreadReactionsCount(long dialogId, int count) { storageQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; try { - SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET unread_reactions = ? WHERE did = ?"); + state = database.executeFast("UPDATE dialogs SET unread_reactions = ? WHERE did = ?"); state.bindInteger(1, Math.max(count, 0)); state.bindLong(2, dialogId); state.step(); state.dispose(); + state = null; if (count == 0) { state = database.executeFast("UPDATE reaction_mentions SET state = 0 WHERE dialog_id = ?"); state.bindLong(1, dialogId); state.step(); state.dispose(); + state = null; } } catch (SQLiteException e) { e.printStackTrace(); + } finally { + if (state != null) { + state.dispose(); + } } }); } @@ -12918,14 +13931,17 @@ public class MessagesStorage extends BaseController { } public void markMessageReactionsAsReadInternal(long dialogId, int messageId) { + SQLitePreparedStatement state = null; + SQLiteCursor cursor = null; try { - SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("UPDATE reaction_mentions SET state = 0 WHERE message_id = ? AND dialog_id = ?"); + state = getMessagesStorage().getDatabase().executeFast("UPDATE reaction_mentions SET state = 0 WHERE message_id = ? AND dialog_id = ?"); state.bindInteger(1, messageId); state.bindLong(2, dialogId); state.step(); state.dispose(); + state = null; - SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM messages_v2 WHERE uid = %d AND mid = %d", dialogId, messageId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM messages_v2 WHERE uid = %d AND mid = %d", dialogId, messageId)); TLRPC.Message message = null; if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); @@ -12941,6 +13957,7 @@ public class MessagesStorage extends BaseController { } } cursor.dispose(); + cursor = null; if (message != null) { state = getMessagesStorage().getDatabase().executeFast(String.format(Locale.US, "UPDATE messages_v2 SET data = ? WHERE uid = %d AND mid = %d", dialogId, messageId)); try { @@ -12956,29 +13973,47 @@ public class MessagesStorage extends BaseController { } } catch (SQLiteException e) { FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } } public void updateDialogUnreadReactions(long dialogId, int newUnreadCount, boolean increment) { storageQueue.postRunnable(() -> { + SQLiteCursor cursor = null; + SQLitePreparedStatement state = null; try { int oldUnreadRactions = 0; if (increment) { - SQLiteCursor cursor = database.queryFinalized("SELECT unread_reactions FROM dialogs WHERE did = " + dialogId); + cursor = database.queryFinalized("SELECT unread_reactions FROM dialogs WHERE did = " + dialogId); if (cursor.next()) { oldUnreadRactions = Math.max(0, cursor.intValue(0)); } cursor.dispose(); + cursor = null; } oldUnreadRactions += newUnreadCount; - SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("UPDATE dialogs SET unread_reactions = ? WHERE did = ?"); + state = getMessagesStorage().getDatabase().executeFast("UPDATE dialogs SET unread_reactions = ? WHERE did = ?"); state.bindInteger(1, oldUnreadRactions); state.bindLong(2, dialogId); state.step(); state.dispose(); + state = null; } catch (SQLiteException e) { e.printStackTrace(); + } finally { + if (state != null) { + state.dispose(); + } + if (cursor != null) { + cursor.dispose(); + } } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java index a146064b1..981071175 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java @@ -78,6 +78,7 @@ public class NotificationCenter { public static final int stickersDidLoad = totalEvents++; public static final int diceStickersDidLoad = totalEvents++; public static final int featuredStickersDidLoad = totalEvents++; + public static final int featuredEmojiDidLoad = totalEvents++; public static final int groupStickersDidLoad = totalEvents++; public static final int messagesReadContent = totalEvents++; public static final int botInfoDidLoad = totalEvents++; @@ -125,6 +126,7 @@ public class NotificationCenter { public static final int dialogDeleted = totalEvents++; public static final int webViewResultSent = totalEvents++; public static final int voiceTranscriptionUpdate = totalEvents++; + public static final int animatedEmojiDocumentLoaded = totalEvents++; public static final int didGenerateFingerprintKeyPair = totalEvents++; @@ -192,6 +194,8 @@ public class NotificationCenter { public static final int updateBotMenuButton = totalEvents++; + public static final int didUpdatePremiumGiftStickers = totalEvents++; + //global public static final int pushMessagesUpdated = totalEvents++; public static final int stopEncodingService = totalEvents++; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationImageProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationImageProvider.java index 5370c16bc..c68930133 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationImageProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationImageProvider.java @@ -6,9 +6,10 @@ import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.os.ParcelFileDescriptor; +import android.text.TextUtils; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import android.text.TextUtils; import java.io.File; import java.io.FileNotFoundException; @@ -18,18 +19,28 @@ import java.util.List; public class NotificationImageProvider extends ContentProvider implements NotificationCenter.NotificationCenterDelegate { - public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".notification_image_provider"; - - private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); - - static { - matcher.addURI(AUTHORITY, "msg_media_raw/#/*", 1); // content://org.telegram..../msg_media_raw/account/filename.ext - } + private static String authority; + private static UriMatcher matcher; private HashSet waitingForFiles = new HashSet<>(); private final Object sync = new Object(); private HashMap fileStartTimes = new HashMap<>(); + public static String getAuthority() { + if (authority == null) { + authority = ApplicationLoader.getApplicationId() + ".notification_image_provider"; + } + return authority; + } + + private static UriMatcher getUriMatcher() { + if (matcher == null) { + matcher = new UriMatcher(UriMatcher.NO_MATCH); + matcher.addURI(getAuthority(), "msg_media_raw/#/*", 1); // content://org.telegram..../msg_media_raw/account/filename.ext + } + return matcher; + } + @Override public boolean onCreate() { for (int i = 0; i < UserConfig.getActivatedAccountsCount(); i++) { @@ -88,7 +99,7 @@ public class NotificationImageProvider extends ContentProvider implements Notifi if (!"r".equals(mode)) { throw new SecurityException("Can only open files for read"); } - if (matcher.match(uri) == 1) { + if (getUriMatcher().match(uri) == 1) { List path = uri.getPathSegments(); int account = Integer.parseInt(path.get(1)); String name = path.get(2); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 155b1042b..e31e781d7 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -3781,7 +3781,7 @@ public class NotificationsController extends BaseController { sound = Settings.System.DEFAULT_NOTIFICATION_URI; } else { if (isInternalSoundFile) { - sound = FileProvider.getUriForFile(ApplicationLoader.applicationContext, BuildConfig.APPLICATION_ID + ".provider", new File(soundPath)); + sound = FileProvider.getUriForFile(ApplicationLoader.applicationContext, ApplicationLoader.getApplicationId() + ".provider", new File(soundPath)); ApplicationLoader.applicationContext.grantUriPermission("com.android.systemui", sound, Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { sound = Uri.parse(soundPath); @@ -3793,7 +3793,7 @@ public class NotificationsController extends BaseController { } else { if (Build.VERSION.SDK_INT >= 24 && soundPath.startsWith("file://") && !AndroidUtilities.isInternalUri(Uri.parse(soundPath))) { try { - Uri uri = FileProvider.getUriForFile(ApplicationLoader.applicationContext, BuildConfig.APPLICATION_ID + ".provider", new File(soundPath.replace("file://", ""))); + Uri uri = FileProvider.getUriForFile(ApplicationLoader.applicationContext, ApplicationLoader.getApplicationId() + ".provider", new File(soundPath.replace("file://", ""))); ApplicationLoader.applicationContext.grantUriPermission("com.android.systemui", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); mBuilder.setSound(uri, AudioManager.STREAM_NOTIFICATION); } catch (Exception e) { @@ -4298,7 +4298,7 @@ public class NotificationsController extends BaseController { Uri uri; if (attach.exists()) { try { - uri = FileProvider.getUriForFile(ApplicationLoader.applicationContext, BuildConfig.APPLICATION_ID + ".provider", attach); + uri = FileProvider.getUriForFile(ApplicationLoader.applicationContext, ApplicationLoader.getApplicationId() + ".provider", attach); } catch (Exception e) { FileLog.e(e); uri = null; @@ -4306,7 +4306,7 @@ public class NotificationsController extends BaseController { } else if (getFileLoader().isLoadingFile(attach.getName())) { Uri.Builder _uri = new Uri.Builder() .scheme("content") - .authority(NotificationImageProvider.AUTHORITY) + .authority(NotificationImageProvider.getAuthority()) .appendPath("msg_media_raw") .appendPath(currentAccount + "") .appendPath(attach.getName()) @@ -4339,7 +4339,7 @@ public class NotificationsController extends BaseController { Uri uri; if (Build.VERSION.SDK_INT >= 24) { try { - uri = FileProvider.getUriForFile(ApplicationLoader.applicationContext, BuildConfig.APPLICATION_ID + ".provider", f); + uri = FileProvider.getUriForFile(ApplicationLoader.applicationContext, ApplicationLoader.getApplicationId() + ".provider", f); } catch (Exception ignore) { uri = null; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java b/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java new file mode 100644 index 000000000..cb2c07d88 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java @@ -0,0 +1,1358 @@ +package org.telegram.messenger; + +import android.os.SystemClock; +import android.text.TextUtils; +import android.util.Base64; + +import androidx.annotation.IntDef; +import androidx.collection.LongSparseArray; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; +import com.google.firebase.messaging.FirebaseMessaging; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.NativeByteBuffer; +import org.telegram.tgnet.TLRPC; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; +import java.util.concurrent.CountDownLatch; + +public class PushListenerController { + public static final int PUSH_TYPE_FIREBASE = 2, + PUSH_TYPE_HUAWEI = 13; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + PUSH_TYPE_FIREBASE, + PUSH_TYPE_HUAWEI + }) + public @interface PushType {} + + public static final int NOTIFICATION_ID = 1; + private static CountDownLatch countDownLatch = new CountDownLatch(1); + + public static void sendRegistrationToServer(@PushType int pushType, String token) { + Utilities.stageQueue.postRunnable(() -> { + ConnectionsManager.setRegId(token, pushType, SharedConfig.pushStringStatus); + if (token == null) { + return; + } + boolean sendStat = false; + if (SharedConfig.pushStringGetTimeStart != 0 && SharedConfig.pushStringGetTimeEnd != 0 && (!SharedConfig.pushStatSent || !TextUtils.equals(SharedConfig.pushString, token))) { + sendStat = true; + SharedConfig.pushStatSent = false; + } + SharedConfig.pushString = token; + SharedConfig.pushType = pushType; + for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { + UserConfig userConfig = UserConfig.getInstance(a); + userConfig.registeredForPush = false; + userConfig.saveConfig(false); + if (userConfig.getClientUserId() != 0) { + final int currentAccount = a; + if (sendStat) { + String tag = pushType == PUSH_TYPE_FIREBASE ? "fcm" : "hcm"; + TLRPC.TL_help_saveAppLog req = new TLRPC.TL_help_saveAppLog(); + TLRPC.TL_inputAppEvent event = new TLRPC.TL_inputAppEvent(); + event.time = SharedConfig.pushStringGetTimeStart; + event.type = tag + "_token_request"; + event.peer = 0; + event.data = new TLRPC.TL_jsonNull(); + req.events.add(event); + + event = new TLRPC.TL_inputAppEvent(); + event.time = SharedConfig.pushStringGetTimeEnd; + event.type = tag + "_token_response"; + event.peer = SharedConfig.pushStringGetTimeEnd - SharedConfig.pushStringGetTimeStart; + event.data = new TLRPC.TL_jsonNull(); + req.events.add(event); + + sendStat = false; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error != null) { + SharedConfig.pushStatSent = true; + SharedConfig.saveConfig(); + } + })); + } + AndroidUtilities.runOnUIThread(() -> MessagesController.getInstance(currentAccount).registerForPush(pushType, token)); + } + } + }); + } + + public static void processRemoteMessage(@PushType int pushType, String data, long time) { + String tag = pushType == PUSH_TYPE_FIREBASE ? "FCM" : "HCM"; + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " PRE START PROCESSING"); + } + long receiveTime = SystemClock.elapsedRealtime(); + AndroidUtilities.runOnUIThread(() -> { + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " PRE INIT APP"); + } + ApplicationLoader.postInitApplication(); + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " POST INIT APP"); + } + Utilities.stageQueue.postRunnable(() -> { + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " START PROCESSING"); + } + int currentAccount = -1; + String loc_key = null; + String jsonString = null; + try { + byte[] bytes = Base64.decode(data, Base64.URL_SAFE); + NativeByteBuffer buffer = new NativeByteBuffer(bytes.length); + buffer.writeBytes(bytes); + buffer.position(0); + + if (SharedConfig.pushAuthKeyId == null) { + SharedConfig.pushAuthKeyId = new byte[8]; + byte[] authKeyHash = Utilities.computeSHA1(SharedConfig.pushAuthKey); + System.arraycopy(authKeyHash, authKeyHash.length - 8, SharedConfig.pushAuthKeyId, 0, 8); + } + byte[] inAuthKeyId = new byte[8]; + buffer.readBytes(inAuthKeyId, true); + if (!Arrays.equals(SharedConfig.pushAuthKeyId, inAuthKeyId)) { + onDecryptError(); + if (BuildVars.LOGS_ENABLED) { + FileLog.d(String.format(Locale.US, tag + " DECRYPT ERROR 2 k1=%s k2=%s, key=%s", Utilities.bytesToHex(SharedConfig.pushAuthKeyId), Utilities.bytesToHex(inAuthKeyId), Utilities.bytesToHex(SharedConfig.pushAuthKey))); + } + return; + } + + byte[] messageKey = new byte[16]; + buffer.readBytes(messageKey, true); + + MessageKeyData messageKeyData = MessageKeyData.generateMessageKeyData(SharedConfig.pushAuthKey, messageKey, true, 2); + Utilities.aesIgeEncryption(buffer.buffer, messageKeyData.aesKey, messageKeyData.aesIv, false, false, 24, bytes.length - 24); + + byte[] messageKeyFull = Utilities.computeSHA256(SharedConfig.pushAuthKey, 88 + 8, 32, buffer.buffer, 24, buffer.buffer.limit()); + if (!Utilities.arraysEquals(messageKey, 0, messageKeyFull, 8)) { + onDecryptError(); + if (BuildVars.LOGS_ENABLED) { + FileLog.d(String.format(tag + " DECRYPT ERROR 3, key = %s", Utilities.bytesToHex(SharedConfig.pushAuthKey))); + } + return; + } + + int len = buffer.readInt32(true); + byte[] strBytes = new byte[len]; + buffer.readBytes(strBytes, true); + jsonString = new String(strBytes); + JSONObject json = new JSONObject(jsonString); + + if (json.has("loc_key")) { + loc_key = json.getString("loc_key"); + } else { + loc_key = ""; + } + + + + JSONObject custom; + Object object = json.get("custom"); + if (object instanceof JSONObject) { + custom = json.getJSONObject("custom"); + } else { + custom = new JSONObject(); + } + + Object userIdObject; + if (json.has("user_id")) { + userIdObject = json.get("user_id"); + } else { + userIdObject = null; + } + long accountUserId; + if (userIdObject == null) { + accountUserId = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId(); + } else { + if (userIdObject instanceof Long) { + accountUserId = (Long) userIdObject; + } else if (userIdObject instanceof Integer) { + accountUserId = (Integer) userIdObject; + } else if (userIdObject instanceof String) { + accountUserId = Utilities.parseInt((String) userIdObject); + } else { + accountUserId = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId(); + } + } + int account = UserConfig.selectedAccount; + boolean foundAccount = false; + for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { + if (UserConfig.getInstance(a).getClientUserId() == accountUserId) { + account = a; + foundAccount = true; + break; + } + } + if (!foundAccount) { + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " ACCOUNT NOT FOUND"); + } + countDownLatch.countDown(); + return; + } + final int accountFinal = currentAccount = account; + if (!UserConfig.getInstance(currentAccount).isClientActivated()) { + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " ACCOUNT NOT ACTIVATED"); + } + countDownLatch.countDown(); + return; + } + switch (loc_key) { + case "DC_UPDATE": { + int dc = custom.getInt("dc"); + String addr = custom.getString("addr"); + String[] parts = addr.split(":"); + if (parts.length != 2) { + countDownLatch.countDown(); + return; + } + String ip = parts[0]; + int port = Integer.parseInt(parts[1]); + ConnectionsManager.getInstance(currentAccount).applyDatacenterAddress(dc, ip, port); + ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); + countDownLatch.countDown(); + return; + } + case "MESSAGE_ANNOUNCEMENT": { + TLRPC.TL_updateServiceNotification update = new TLRPC.TL_updateServiceNotification(); + update.popup = false; + update.flags = 2; + update.inbox_date = (int) (time / 1000); + update.message = json.getString("message"); + update.type = "announcement"; + update.media = new TLRPC.TL_messageMediaEmpty(); + final TLRPC.TL_updates updates = new TLRPC.TL_updates(); + updates.updates.add(update); + Utilities.stageQueue.postRunnable(() -> MessagesController.getInstance(accountFinal).processUpdates(updates, false)); + ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); + countDownLatch.countDown(); + return; + } + case "SESSION_REVOKE": { + AndroidUtilities.runOnUIThread(() -> { + if (UserConfig.getInstance(accountFinal).getClientUserId() != 0) { + UserConfig.getInstance(accountFinal).clearConfig(); + MessagesController.getInstance(accountFinal).performLogout(0); + } + }); + countDownLatch.countDown(); + return; + } + case "GEO_LIVE_PENDING": { + Utilities.stageQueue.postRunnable(() -> LocationController.getInstance(accountFinal).setNewLocationEndWatchTime()); + countDownLatch.countDown(); + return; + } + } + + long channel_id; + long chat_id; + long user_id; + long dialogId = 0; + boolean scheduled; + if (custom.has("channel_id")) { + channel_id = custom.getLong("channel_id"); + dialogId = -channel_id; + } else { + channel_id = 0; + } + if (custom.has("from_id")) { + user_id = custom.getLong("from_id"); + dialogId = user_id; + } else { + user_id = 0; + } + if (custom.has("chat_id")) { + chat_id = custom.getLong("chat_id"); + dialogId = -chat_id; + } else { + chat_id = 0; + } + if (custom.has("encryption_id")) { + dialogId = DialogObject.makeEncryptedDialogId(custom.getInt("encryption_id")); + } + if (custom.has("schedule")) { + scheduled = custom.getInt("schedule") == 1; + } else { + scheduled = false; + } + if (dialogId == 0 && "ENCRYPTED_MESSAGE".equals(loc_key)) { + dialogId = NotificationsController.globalSecretChatId; + } + boolean canRelease = true; + if (dialogId != 0) { + if ("READ_HISTORY".equals(loc_key)) { + int max_id = custom.getInt("max_id"); + final ArrayList updates = new ArrayList<>(); + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " received read notification max_id = " + max_id + " for dialogId = " + dialogId); + } + if (channel_id != 0) { + TLRPC.TL_updateReadChannelInbox update = new TLRPC.TL_updateReadChannelInbox(); + update.channel_id = channel_id; + update.max_id = max_id; + updates.add(update); + } else { + TLRPC.TL_updateReadHistoryInbox update = new TLRPC.TL_updateReadHistoryInbox(); + if (user_id != 0) { + update.peer = new TLRPC.TL_peerUser(); + update.peer.user_id = user_id; + } else { + update.peer = new TLRPC.TL_peerChat(); + update.peer.chat_id = chat_id; + } + update.max_id = max_id; + updates.add(update); + } + MessagesController.getInstance(accountFinal).processUpdateArray(updates, null, null, false, 0); + } else if ("MESSAGE_DELETED".equals(loc_key)) { + String messages = custom.getString("messages"); + String[] messagesArgs = messages.split(","); + LongSparseArray> deletedMessages = new LongSparseArray<>(); + ArrayList ids = new ArrayList<>(); + for (int a = 0; a < messagesArgs.length; a++) { + ids.add(Utilities.parseInt(messagesArgs[a])); + } + deletedMessages.put(-channel_id, ids); + NotificationsController.getInstance(currentAccount).removeDeletedMessagesFromNotifications(deletedMessages); + + MessagesController.getInstance(currentAccount).deleteMessagesByPush(dialogId, ids, channel_id); + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " received " + loc_key + " for dialogId = " + dialogId + " mids = " + TextUtils.join(",", ids)); + } + } else if (!TextUtils.isEmpty(loc_key)) { + int msg_id; + if (custom.has("msg_id")) { + msg_id = custom.getInt("msg_id"); + } else { + msg_id = 0; + } + + long random_id; + if (custom.has("random_id")) { + random_id = Utilities.parseLong(custom.getString("random_id")); + } else { + random_id = 0; + } + + boolean processNotification = false; + if (msg_id != 0) { + Integer currentReadValue = MessagesController.getInstance(currentAccount).dialogs_read_inbox_max.get(dialogId); + if (currentReadValue == null) { + currentReadValue = MessagesStorage.getInstance(currentAccount).getDialogReadMax(false, dialogId); + MessagesController.getInstance(accountFinal).dialogs_read_inbox_max.put(dialogId, currentReadValue); + } + if (msg_id > currentReadValue) { + processNotification = true; + } + } else if (random_id != 0) { + if (!MessagesStorage.getInstance(account).checkMessageByRandomId(random_id)) { + processNotification = true; + } + } + + if (loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_")) { + processNotification = true; + } + + if (processNotification) { + long chat_from_id = custom.optLong("chat_from_id", 0); + long chat_from_broadcast_id = custom.optLong("chat_from_broadcast_id", 0); + long chat_from_group_id = custom.optLong("chat_from_group_id", 0); + boolean isGroup = chat_from_id != 0 || chat_from_group_id != 0; + + boolean mention = custom.has("mention") && custom.getInt("mention") != 0; + boolean silent = custom.has("silent") && custom.getInt("silent") != 0; + + String[] args; + if (json.has("loc_args")) { + JSONArray loc_args = json.getJSONArray("loc_args"); + args = new String[loc_args.length()]; + for (int a = 0; a < args.length; a++) { + args[a] = loc_args.getString(a); + } + } else { + args = null; + } + String messageText = null; + String message1 = null; + String name = args[0]; + String userName = null; + boolean localMessage = false; + boolean supergroup = false; + boolean pinned = false; + boolean channel = false; + boolean edited = custom.has("edit_date"); + if (loc_key.startsWith("CHAT_")) { + if (UserObject.isReplyUser(dialogId)) { + name += " @ " + args[1]; + } else { + supergroup = channel_id != 0; + userName = name; + name = args[1]; + } + } else if (loc_key.startsWith("PINNED_")) { + supergroup = channel_id != 0; + pinned = true; + } else if (loc_key.startsWith("CHANNEL_")) { + channel = true; + } + + if (BuildVars.LOGS_ENABLED) { + FileLog.d(tag + " received message notification " + loc_key + " for dialogId = " + dialogId + " mid = " + msg_id); + } + if (loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_")) { + messageText = getReactedText(loc_key, args); + } else { + switch (loc_key) { + case "MESSAGE_RECURRING_PAY": { + messageText = LocaleController.formatString("NotificationMessageRecurringPay", R.string.NotificationMessageRecurringPay, args[0], args[1]); + message1 = LocaleController.getString("PaymentInvoice", R.string.PaymentInvoice); + break; + } + case "MESSAGE_TEXT": + case "CHANNEL_MESSAGE_TEXT": { + messageText = LocaleController.formatString("NotificationMessageText", R.string.NotificationMessageText, args[0], args[1]); + message1 = args[1]; + break; + } + case "MESSAGE_NOTEXT": { + messageText = LocaleController.formatString("NotificationMessageNoText", R.string.NotificationMessageNoText, args[0]); + message1 = LocaleController.getString("Message", R.string.Message); + break; + } + case "MESSAGE_PHOTO": { + messageText = LocaleController.formatString("NotificationMessagePhoto", R.string.NotificationMessagePhoto, args[0]); + message1 = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); + break; + } + case "MESSAGE_PHOTO_SECRET": { + messageText = LocaleController.formatString("NotificationMessageSDPhoto", R.string.NotificationMessageSDPhoto, args[0]); + message1 = LocaleController.getString("AttachDestructingPhoto", R.string.AttachDestructingPhoto); + break; + } + case "MESSAGE_VIDEO": { + messageText = LocaleController.formatString("NotificationMessageVideo", R.string.NotificationMessageVideo, args[0]); + message1 = LocaleController.getString("AttachVideo", R.string.AttachVideo); + break; + } + case "MESSAGE_VIDEO_SECRET": { + messageText = LocaleController.formatString("NotificationMessageSDVideo", R.string.NotificationMessageSDVideo, args[0]); + message1 = LocaleController.getString("AttachDestructingVideo", R.string.AttachDestructingVideo); + break; + } + case "MESSAGE_SCREENSHOT": { + messageText = LocaleController.getString("ActionTakeScreenshoot", R.string.ActionTakeScreenshoot).replace("un1", args[0]); + break; + } + case "MESSAGE_ROUND": { + messageText = LocaleController.formatString("NotificationMessageRound", R.string.NotificationMessageRound, args[0]); + message1 = LocaleController.getString("AttachRound", R.string.AttachRound); + break; + } + case "MESSAGE_DOC": { + messageText = LocaleController.formatString("NotificationMessageDocument", R.string.NotificationMessageDocument, args[0]); + message1 = LocaleController.getString("AttachDocument", R.string.AttachDocument); + break; + } + case "MESSAGE_STICKER": { + if (args.length > 1 && !TextUtils.isEmpty(args[1])) { + messageText = LocaleController.formatString("NotificationMessageStickerEmoji", R.string.NotificationMessageStickerEmoji, args[0], args[1]); + message1 = args[1] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); + } else { + messageText = LocaleController.formatString("NotificationMessageSticker", R.string.NotificationMessageSticker, args[0]); + message1 = LocaleController.getString("AttachSticker", R.string.AttachSticker); + } + break; + } + case "MESSAGE_AUDIO": { + messageText = LocaleController.formatString("NotificationMessageAudio", R.string.NotificationMessageAudio, args[0]); + message1 = LocaleController.getString("AttachAudio", R.string.AttachAudio); + break; + } + case "MESSAGE_CONTACT": { + messageText = LocaleController.formatString("NotificationMessageContact2", R.string.NotificationMessageContact2, args[0], args[1]); + message1 = LocaleController.getString("AttachContact", R.string.AttachContact); + break; + } + case "MESSAGE_QUIZ": { + messageText = LocaleController.formatString("NotificationMessageQuiz2", R.string.NotificationMessageQuiz2, args[0], args[1]); + message1 = LocaleController.getString("QuizPoll", R.string.QuizPoll); + break; + } + case "MESSAGE_POLL": { + messageText = LocaleController.formatString("NotificationMessagePoll2", R.string.NotificationMessagePoll2, args[0], args[1]); + message1 = LocaleController.getString("Poll", R.string.Poll); + break; + } + case "MESSAGE_GEO": { + messageText = LocaleController.formatString("NotificationMessageMap", R.string.NotificationMessageMap, args[0]); + message1 = LocaleController.getString("AttachLocation", R.string.AttachLocation); + break; + } + case "MESSAGE_GEOLIVE": { + messageText = LocaleController.formatString("NotificationMessageLiveLocation", R.string.NotificationMessageLiveLocation, args[0]); + message1 = LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation); + break; + } + case "MESSAGE_GIF": { + messageText = LocaleController.formatString("NotificationMessageGif", R.string.NotificationMessageGif, args[0]); + message1 = LocaleController.getString("AttachGif", R.string.AttachGif); + break; + } + case "MESSAGE_GAME": { + messageText = LocaleController.formatString("NotificationMessageGame", R.string.NotificationMessageGame, args[0], args[1]); + message1 = LocaleController.getString("AttachGame", R.string.AttachGame); + break; + } + case "MESSAGE_GAME_SCORE": + case "CHANNEL_MESSAGE_GAME_SCORE": { + messageText = LocaleController.formatString("NotificationMessageGameScored", R.string.NotificationMessageGameScored, args[0], args[1], args[2]); + break; + } + case "MESSAGE_INVOICE": { + messageText = LocaleController.formatString("NotificationMessageInvoice", R.string.NotificationMessageInvoice, args[0], args[1]); + message1 = LocaleController.getString("PaymentInvoice", R.string.PaymentInvoice); + break; + } + case "MESSAGE_FWDS": { + messageText = LocaleController.formatString("NotificationMessageForwardFew", R.string.NotificationMessageForwardFew, args[0], LocaleController.formatPluralString("messages", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "MESSAGE_PHOTOS": { + messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("Photos", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "MESSAGE_VIDEOS": { + messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("Videos", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "MESSAGE_PLAYLIST": { + messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("MusicFiles", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "MESSAGE_DOCS": { + messageText = LocaleController.formatString("NotificationMessageFew", R.string.NotificationMessageFew, args[0], LocaleController.formatPluralString("Files", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "MESSAGES": { + messageText = LocaleController.formatString("NotificationMessageAlbum", R.string.NotificationMessageAlbum, args[0]); + localMessage = true; + break; + } + case "CHANNEL_MESSAGE_NOTEXT": { + messageText = LocaleController.formatString("ChannelMessageNoText", R.string.ChannelMessageNoText, args[0]); + message1 = LocaleController.getString("Message", R.string.Message); + break; + } + case "CHANNEL_MESSAGE_PHOTO": { + messageText = LocaleController.formatString("ChannelMessagePhoto", R.string.ChannelMessagePhoto, args[0]); + message1 = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); + break; + } + case "CHANNEL_MESSAGE_VIDEO": { + messageText = LocaleController.formatString("ChannelMessageVideo", R.string.ChannelMessageVideo, args[0]); + message1 = LocaleController.getString("AttachVideo", R.string.AttachVideo); + break; + } + case "CHANNEL_MESSAGE_ROUND": { + messageText = LocaleController.formatString("ChannelMessageRound", R.string.ChannelMessageRound, args[0]); + message1 = LocaleController.getString("AttachRound", R.string.AttachRound); + break; + } + case "CHANNEL_MESSAGE_DOC": { + messageText = LocaleController.formatString("ChannelMessageDocument", R.string.ChannelMessageDocument, args[0]); + message1 = LocaleController.getString("AttachDocument", R.string.AttachDocument); + break; + } + case "CHANNEL_MESSAGE_STICKER": { + if (args.length > 1 && !TextUtils.isEmpty(args[1])) { + messageText = LocaleController.formatString("ChannelMessageStickerEmoji", R.string.ChannelMessageStickerEmoji, args[0], args[1]); + message1 = args[1] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); + } else { + messageText = LocaleController.formatString("ChannelMessageSticker", R.string.ChannelMessageSticker, args[0]); + message1 = LocaleController.getString("AttachSticker", R.string.AttachSticker); + } + break; + } + case "CHANNEL_MESSAGE_AUDIO": { + messageText = LocaleController.formatString("ChannelMessageAudio", R.string.ChannelMessageAudio, args[0]); + message1 = LocaleController.getString("AttachAudio", R.string.AttachAudio); + break; + } + case "CHANNEL_MESSAGE_CONTACT": { + messageText = LocaleController.formatString("ChannelMessageContact2", R.string.ChannelMessageContact2, args[0], args[1]); + message1 = LocaleController.getString("AttachContact", R.string.AttachContact); + break; + } + case "CHANNEL_MESSAGE_QUIZ": { + messageText = LocaleController.formatString("ChannelMessageQuiz2", R.string.ChannelMessageQuiz2, args[0], args[1]); + message1 = LocaleController.getString("QuizPoll", R.string.QuizPoll); + break; + } + case "CHANNEL_MESSAGE_POLL": { + messageText = LocaleController.formatString("ChannelMessagePoll2", R.string.ChannelMessagePoll2, args[0], args[1]); + message1 = LocaleController.getString("Poll", R.string.Poll); + break; + } + case "CHANNEL_MESSAGE_GEO": { + messageText = LocaleController.formatString("ChannelMessageMap", R.string.ChannelMessageMap, args[0]); + message1 = LocaleController.getString("AttachLocation", R.string.AttachLocation); + break; + } + case "CHANNEL_MESSAGE_GEOLIVE": { + messageText = LocaleController.formatString("ChannelMessageLiveLocation", R.string.ChannelMessageLiveLocation, args[0]); + message1 = LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation); + break; + } + case "CHANNEL_MESSAGE_GIF": { + messageText = LocaleController.formatString("ChannelMessageGIF", R.string.ChannelMessageGIF, args[0]); + message1 = LocaleController.getString("AttachGif", R.string.AttachGif); + break; + } + case "CHANNEL_MESSAGE_GAME": { + messageText = LocaleController.formatString("NotificationMessageGame", R.string.NotificationMessageGame, args[0]); + message1 = LocaleController.getString("AttachGame", R.string.AttachGame); + break; + } + case "CHANNEL_MESSAGE_FWDS": { + messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("ForwardedMessageCount", Utilities.parseInt(args[1])).toLowerCase()); + localMessage = true; + break; + } + case "CHANNEL_MESSAGE_PHOTOS": { + messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("Photos", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "CHANNEL_MESSAGE_VIDEOS": { + messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("Videos", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "CHANNEL_MESSAGE_PLAYLIST": { + messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("MusicFiles", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "CHANNEL_MESSAGE_DOCS": { + messageText = LocaleController.formatString("ChannelMessageFew", R.string.ChannelMessageFew, args[0], LocaleController.formatPluralString("Files", Utilities.parseInt(args[1]))); + localMessage = true; + break; + } + case "CHANNEL_MESSAGES": { + messageText = LocaleController.formatString("ChannelMessageAlbum", R.string.ChannelMessageAlbum, args[0]); + localMessage = true; + break; + } + case "CHAT_MESSAGE_TEXT": { + messageText = LocaleController.formatString("NotificationMessageGroupText", R.string.NotificationMessageGroupText, args[0], args[1], args[2]); + message1 = args[2]; + break; + } + case "CHAT_MESSAGE_NOTEXT": { + messageText = LocaleController.formatString("NotificationMessageGroupNoText", R.string.NotificationMessageGroupNoText, args[0], args[1]); + message1 = LocaleController.getString("Message", R.string.Message); + break; + } + case "CHAT_MESSAGE_PHOTO": { + messageText = LocaleController.formatString("NotificationMessageGroupPhoto", R.string.NotificationMessageGroupPhoto, args[0], args[1]); + message1 = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); + break; + } + case "CHAT_MESSAGE_VIDEO": { + messageText = LocaleController.formatString("NotificationMessageGroupVideo", R.string.NotificationMessageGroupVideo, args[0], args[1]); + message1 = LocaleController.getString("AttachVideo", R.string.AttachVideo); + break; + } + case "CHAT_MESSAGE_ROUND": { + messageText = LocaleController.formatString("NotificationMessageGroupRound", R.string.NotificationMessageGroupRound, args[0], args[1]); + message1 = LocaleController.getString("AttachRound", R.string.AttachRound); + break; + } + case "CHAT_MESSAGE_DOC": { + messageText = LocaleController.formatString("NotificationMessageGroupDocument", R.string.NotificationMessageGroupDocument, args[0], args[1]); + message1 = LocaleController.getString("AttachDocument", R.string.AttachDocument); + break; + } + case "CHAT_MESSAGE_STICKER": { + if (args.length > 2 && !TextUtils.isEmpty(args[2])) { + messageText = LocaleController.formatString("NotificationMessageGroupStickerEmoji", R.string.NotificationMessageGroupStickerEmoji, args[0], args[1], args[2]); + message1 = args[2] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); + } else { + messageText = LocaleController.formatString("NotificationMessageGroupSticker", R.string.NotificationMessageGroupSticker, args[0], args[1]); + message1 = args[1] + " " + LocaleController.getString("AttachSticker", R.string.AttachSticker); + } + break; + } + case "CHAT_MESSAGE_AUDIO": { + messageText = LocaleController.formatString("NotificationMessageGroupAudio", R.string.NotificationMessageGroupAudio, args[0], args[1]); + message1 = LocaleController.getString("AttachAudio", R.string.AttachAudio); + break; + } + case "CHAT_MESSAGE_CONTACT": { + messageText = LocaleController.formatString("NotificationMessageGroupContact2", R.string.NotificationMessageGroupContact2, args[0], args[1], args[2]); + message1 = LocaleController.getString("AttachContact", R.string.AttachContact); + break; + } + case "CHAT_MESSAGE_QUIZ": { + messageText = LocaleController.formatString("NotificationMessageGroupQuiz2", R.string.NotificationMessageGroupQuiz2, args[0], args[1], args[2]); + message1 = LocaleController.getString("PollQuiz", R.string.PollQuiz); + break; + } + case "CHAT_MESSAGE_POLL": { + messageText = LocaleController.formatString("NotificationMessageGroupPoll2", R.string.NotificationMessageGroupPoll2, args[0], args[1], args[2]); + message1 = LocaleController.getString("Poll", R.string.Poll); + break; + } + case "CHAT_MESSAGE_GEO": { + messageText = LocaleController.formatString("NotificationMessageGroupMap", R.string.NotificationMessageGroupMap, args[0], args[1]); + message1 = LocaleController.getString("AttachLocation", R.string.AttachLocation); + break; + } + case "CHAT_MESSAGE_GEOLIVE": { + messageText = LocaleController.formatString("NotificationMessageGroupLiveLocation", R.string.NotificationMessageGroupLiveLocation, args[0], args[1]); + message1 = LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation); + break; + } + case "CHAT_MESSAGE_GIF": { + messageText = LocaleController.formatString("NotificationMessageGroupGif", R.string.NotificationMessageGroupGif, args[0], args[1]); + message1 = LocaleController.getString("AttachGif", R.string.AttachGif); + break; + } + case "CHAT_MESSAGE_GAME": { + messageText = LocaleController.formatString("NotificationMessageGroupGame", R.string.NotificationMessageGroupGame, args[0], args[1], args[2]); + message1 = LocaleController.getString("AttachGame", R.string.AttachGame); + break; + } + case "CHAT_MESSAGE_GAME_SCORE": { + messageText = LocaleController.formatString("NotificationMessageGroupGameScored", R.string.NotificationMessageGroupGameScored, args[0], args[1], args[2], args[3]); + break; + } + case "CHAT_MESSAGE_INVOICE": { + messageText = LocaleController.formatString("NotificationMessageGroupInvoice", R.string.NotificationMessageGroupInvoice, args[0], args[1], args[2]); + message1 = LocaleController.getString("PaymentInvoice", R.string.PaymentInvoice); + break; + } + case "CHAT_CREATED": + case "CHAT_ADD_YOU": { + messageText = LocaleController.formatString("NotificationInvitedToGroup", R.string.NotificationInvitedToGroup, args[0], args[1]); + break; + } + case "CHAT_TITLE_EDITED": { + messageText = LocaleController.formatString("NotificationEditedGroupName", R.string.NotificationEditedGroupName, args[0], args[1]); + break; + } + case "CHAT_PHOTO_EDITED": { + messageText = LocaleController.formatString("NotificationEditedGroupPhoto", R.string.NotificationEditedGroupPhoto, args[0], args[1]); + break; + } + case "CHAT_ADD_MEMBER": { + messageText = LocaleController.formatString("NotificationGroupAddMember", R.string.NotificationGroupAddMember, args[0], args[1], args[2]); + break; + } + case "CHAT_VOICECHAT_START": { + messageText = LocaleController.formatString("NotificationGroupCreatedCall", R.string.NotificationGroupCreatedCall, args[0], args[1]); + break; + } + case "CHAT_VOICECHAT_INVITE": { + messageText = LocaleController.formatString("NotificationGroupInvitedToCall", R.string.NotificationGroupInvitedToCall, args[0], args[1], args[2]); + break; + } + case "CHAT_VOICECHAT_END": { + messageText = LocaleController.formatString("NotificationGroupEndedCall", R.string.NotificationGroupEndedCall, args[0], args[1]); + break; + } + case "CHAT_VOICECHAT_INVITE_YOU": { + messageText = LocaleController.formatString("NotificationGroupInvitedYouToCall", R.string.NotificationGroupInvitedYouToCall, args[0], args[1]); + break; + } + case "CHAT_DELETE_MEMBER": { + messageText = LocaleController.formatString("NotificationGroupKickMember", R.string.NotificationGroupKickMember, args[0], args[1]); + break; + } + case "CHAT_DELETE_YOU": { + messageText = LocaleController.formatString("NotificationGroupKickYou", R.string.NotificationGroupKickYou, args[0], args[1]); + break; + } + case "CHAT_LEFT": { + messageText = LocaleController.formatString("NotificationGroupLeftMember", R.string.NotificationGroupLeftMember, args[0], args[1]); + break; + } + case "CHAT_RETURNED": { + messageText = LocaleController.formatString("NotificationGroupAddSelf", R.string.NotificationGroupAddSelf, args[0], args[1]); + break; + } + case "CHAT_JOINED": { + messageText = LocaleController.formatString("NotificationGroupAddSelfMega", R.string.NotificationGroupAddSelfMega, args[0], args[1]); + break; + } + case "CHAT_REQ_JOINED": { + messageText = LocaleController.formatString("UserAcceptedToGroupPushWithGroup", R.string.UserAcceptedToGroupPushWithGroup, args[0], args[1]); + break; + } + case "CHAT_MESSAGE_FWDS": { + messageText = LocaleController.formatString("NotificationGroupForwardedFew", R.string.NotificationGroupForwardedFew, args[0], args[1], LocaleController.formatPluralString("messages", Utilities.parseInt(args[2]))); + localMessage = true; + break; + } + case "CHAT_MESSAGE_PHOTOS": { + messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("Photos", Utilities.parseInt(args[2]))); + localMessage = true; + break; + } + case "CHAT_MESSAGE_VIDEOS": { + messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("Videos", Utilities.parseInt(args[2]))); + localMessage = true; + break; + } + case "CHAT_MESSAGE_PLAYLIST": { + messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("MusicFiles", Utilities.parseInt(args[2]))); + localMessage = true; + break; + } + case "CHAT_MESSAGE_DOCS": { + messageText = LocaleController.formatString("NotificationGroupFew", R.string.NotificationGroupFew, args[0], args[1], LocaleController.formatPluralString("Files", Utilities.parseInt(args[2]))); + localMessage = true; + break; + } + case "CHAT_MESSAGES": { + messageText = LocaleController.formatString("NotificationGroupAlbum", R.string.NotificationGroupAlbum, args[0], args[1]); + localMessage = true; + break; + } + case "PINNED_TEXT": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedText", R.string.NotificationActionPinnedText, args[0], args[1], args[2]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedTextChannel", R.string.NotificationActionPinnedTextChannel, args[0], args[1]); + } + } + break; + } + case "PINNED_NOTEXT": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedNoTextUser", R.string.NotificationActionPinnedNoTextUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedNoText", R.string.NotificationActionPinnedNoText, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedNoTextChannel", R.string.NotificationActionPinnedNoTextChannel, args[0]); + } + } + break; + } + case "PINNED_PHOTO": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedPhotoUser", R.string.NotificationActionPinnedPhotoUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedPhoto", R.string.NotificationActionPinnedPhoto, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedPhotoChannel", R.string.NotificationActionPinnedPhotoChannel, args[0]); + } + } + break; + } + case "PINNED_VIDEO": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedVideoUser", R.string.NotificationActionPinnedVideoUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedVideo", R.string.NotificationActionPinnedVideo, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedVideoChannel", R.string.NotificationActionPinnedVideoChannel, args[0]); + } + } + break; + } + case "PINNED_ROUND": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedRoundUser", R.string.NotificationActionPinnedRoundUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedRound", R.string.NotificationActionPinnedRound, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedRoundChannel", R.string.NotificationActionPinnedRoundChannel, args[0]); + } + } + break; + } + case "PINNED_DOC": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedFileUser", R.string.NotificationActionPinnedFileUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedFile", R.string.NotificationActionPinnedFile, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedFileChannel", R.string.NotificationActionPinnedFileChannel, args[0]); + } + } + break; + } + case "PINNED_STICKER": { + if (dialogId > 0) { + if (args.length > 1 && !TextUtils.isEmpty(args[1])) { + messageText = LocaleController.formatString("NotificationActionPinnedStickerEmojiUser", R.string.NotificationActionPinnedStickerEmojiUser, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedStickerUser", R.string.NotificationActionPinnedStickerUser, args[0]); + } + } else { + if (isGroup) { + if (args.length > 2 && !TextUtils.isEmpty(args[2])) { + messageText = LocaleController.formatString("NotificationActionPinnedStickerEmoji", R.string.NotificationActionPinnedStickerEmoji, args[0], args[2], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedSticker", R.string.NotificationActionPinnedSticker, args[0], args[1]); + } + } else { + if (args.length > 1 && !TextUtils.isEmpty(args[1])) { + messageText = LocaleController.formatString("NotificationActionPinnedStickerEmojiChannel", R.string.NotificationActionPinnedStickerEmojiChannel, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedStickerChannel", R.string.NotificationActionPinnedStickerChannel, args[0]); + } + } + } + break; + } + case "PINNED_AUDIO": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedVoiceUser", R.string.NotificationActionPinnedVoiceUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedVoice", R.string.NotificationActionPinnedVoice, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedVoiceChannel", R.string.NotificationActionPinnedVoiceChannel, args[0]); + } + } + break; + } + case "PINNED_CONTACT": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedContactUser", R.string.NotificationActionPinnedContactUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedContact2", R.string.NotificationActionPinnedContact2, args[0], args[2], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedContactChannel2", R.string.NotificationActionPinnedContactChannel2, args[0], args[1]); + } + } + break; + } + case "PINNED_QUIZ": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedQuizUser", R.string.NotificationActionPinnedQuizUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedQuiz2", R.string.NotificationActionPinnedQuiz2, args[0], args[2], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedQuizChannel2", R.string.NotificationActionPinnedQuizChannel2, args[0], args[1]); + } + } + break; + } + case "PINNED_POLL": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedPollUser", R.string.NotificationActionPinnedPollUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedPoll2", R.string.NotificationActionPinnedPoll2, args[0], args[2], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedPollChannel2", R.string.NotificationActionPinnedPollChannel2, args[0], args[1]); + } + } + break; + } + case "PINNED_GEO": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedGeoUser", R.string.NotificationActionPinnedGeoUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedGeo", R.string.NotificationActionPinnedGeo, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedGeoChannel", R.string.NotificationActionPinnedGeoChannel, args[0]); + } + } + break; + } + case "PINNED_GEOLIVE": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedGeoLiveUser", R.string.NotificationActionPinnedGeoLiveUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedGeoLive", R.string.NotificationActionPinnedGeoLive, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedGeoLiveChannel", R.string.NotificationActionPinnedGeoLiveChannel, args[0]); + } + } + break; + } + case "PINNED_GAME": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedGameUser", R.string.NotificationActionPinnedGameUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedGame", R.string.NotificationActionPinnedGame, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedGameChannel", R.string.NotificationActionPinnedGameChannel, args[0]); + } + } + break; + } + case "PINNED_GAME_SCORE": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedGameScoreUser", R.string.NotificationActionPinnedGameScoreUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedGameScore", R.string.NotificationActionPinnedGameScore, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedGameScoreChannel", R.string.NotificationActionPinnedGameScoreChannel, args[0]); + } + } + break; + } + case "PINNED_INVOICE": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedInvoiceUser", R.string.NotificationActionPinnedInvoiceUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedInvoice", R.string.NotificationActionPinnedInvoice, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedInvoiceChannel", R.string.NotificationActionPinnedInvoiceChannel, args[0]); + } + } + break; + } + case "PINNED_GIF": { + if (dialogId > 0) { + messageText = LocaleController.formatString("NotificationActionPinnedGifUser", R.string.NotificationActionPinnedGifUser, args[0], args[1]); + } else { + if (isGroup) { + messageText = LocaleController.formatString("NotificationActionPinnedGif", R.string.NotificationActionPinnedGif, args[0], args[1]); + } else { + messageText = LocaleController.formatString("NotificationActionPinnedGifChannel", R.string.NotificationActionPinnedGifChannel, args[0]); + } + } + break; + } + case "ENCRYPTED_MESSAGE": { + messageText = LocaleController.getString("YouHaveNewMessage", R.string.YouHaveNewMessage); + name = LocaleController.getString("SecretChatName", R.string.SecretChatName); + localMessage = true; + break; + } + case "REACT_TEXT": { + break; + } + case "CONTACT_JOINED": + case "AUTH_UNKNOWN": + case "AUTH_REGION": + case "LOCKED_MESSAGE": + case "ENCRYPTION_REQUEST": + case "ENCRYPTION_ACCEPT": + case "PHONE_CALL_REQUEST": + case "MESSAGE_MUTED": + case "PHONE_CALL_MISSED": { + //ignored + break; + } + + default: { + if (BuildVars.LOGS_ENABLED) { + FileLog.w("unhandled loc_key = " + loc_key); + } + break; + } + } + } + if (messageText != null) { + TLRPC.TL_message messageOwner = new TLRPC.TL_message(); + messageOwner.id = msg_id; + messageOwner.random_id = random_id; + messageOwner.message = message1 != null ? message1 : messageText; + messageOwner.date = (int) (time / 1000); + if (pinned) { + messageOwner.action = new TLRPC.TL_messageActionPinMessage(); + } + if (supergroup) { + messageOwner.flags |= 0x80000000; + } + messageOwner.dialog_id = dialogId; + if (channel_id != 0) { + messageOwner.peer_id = new TLRPC.TL_peerChannel(); + messageOwner.peer_id.channel_id = channel_id; + } else if (chat_id != 0) { + messageOwner.peer_id = new TLRPC.TL_peerChat(); + messageOwner.peer_id.chat_id = chat_id; + } else { + messageOwner.peer_id = new TLRPC.TL_peerUser(); + messageOwner.peer_id.user_id = user_id; + } + messageOwner.flags |= 256; + if (chat_from_group_id != 0) { + messageOwner.from_id = new TLRPC.TL_peerChat(); + messageOwner.from_id.chat_id = chat_id; + } else if (chat_from_broadcast_id != 0) { + messageOwner.from_id = new TLRPC.TL_peerChannel(); + messageOwner.from_id.channel_id = chat_from_broadcast_id; + } else if (chat_from_id != 0) { + messageOwner.from_id = new TLRPC.TL_peerUser(); + messageOwner.from_id.user_id = chat_from_id; + } else { + messageOwner.from_id = messageOwner.peer_id; + } + messageOwner.mentioned = mention || pinned; + messageOwner.silent = silent; + messageOwner.from_scheduled = scheduled; + + MessageObject messageObject = new MessageObject(currentAccount, messageOwner, messageText, name, userName, localMessage, channel, supergroup, edited); + messageObject.isReactionPush = loc_key.startsWith("REACT_") || loc_key.startsWith("CHAT_REACT_"); + ArrayList arrayList = new ArrayList<>(); + arrayList.add(messageObject); + canRelease = false; + NotificationsController.getInstance(currentAccount).processNewMessages(arrayList, true, true, countDownLatch); + } + } + } + } + if (canRelease) { + countDownLatch.countDown(); + } + + ConnectionsManager.onInternalPushReceived(currentAccount); + ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); + } catch (Throwable e) { + if (currentAccount != -1) { + ConnectionsManager.onInternalPushReceived(currentAccount); + ConnectionsManager.getInstance(currentAccount).resumeNetworkMaybe(); + countDownLatch.countDown(); + } else { + onDecryptError(); + } + if (BuildVars.LOGS_ENABLED) { + FileLog.e("error in loc_key = " + loc_key + " json " + jsonString); + } + FileLog.e(e); + } + }); + }); + try { + countDownLatch.await(); + } catch (Throwable ignore) { + + } + if (BuildVars.DEBUG_VERSION) { + FileLog.d("finished " + tag + " service, time = " + (SystemClock.elapsedRealtime() - receiveTime)); + } + } + + private static String getReactedText(String loc_key, Object[] args) { + switch (loc_key) { + case "REACT_TEXT": { + return LocaleController.formatString("PushReactText", R.string.PushReactText, args); + } + case "REACT_NOTEXT": { + return LocaleController.formatString("PushReactNoText", R.string.PushReactNoText, args); + } + case "REACT_PHOTO": { + return LocaleController.formatString("PushReactPhoto", R.string.PushReactPhoto, args); + } + case "REACT_VIDEO": { + return LocaleController.formatString("PushReactVideo", R.string.PushReactVideo, args); + } + case "REACT_ROUND": { + return LocaleController.formatString("PushReactRound", R.string.PushReactRound, args); + } + case "REACT_DOC": { + return LocaleController.formatString("PushReactDoc", R.string.PushReactDoc, args); + } + case "REACT_STICKER": { + return LocaleController.formatString("PushReactSticker", R.string.PushReactSticker, args); + } + case "REACT_AUDIO": { + return LocaleController.formatString("PushReactAudio", R.string.PushReactAudio, args); + } + case "REACT_CONTACT": { + return LocaleController.formatString("PushReactContect", R.string.PushReactContect, args); + } + case "REACT_GEO": { + return LocaleController.formatString("PushReactGeo", R.string.PushReactGeo, args); + } + case "REACT_GEOLIVE": { + return LocaleController.formatString("PushReactGeoLocation", R.string.PushReactGeoLocation, args); + } + case "REACT_POLL": { + return LocaleController.formatString("PushReactPoll", R.string.PushReactPoll, args); + } + case "REACT_QUIZ": { + return LocaleController.formatString("PushReactQuiz", R.string.PushReactQuiz, args); + } + case "REACT_GAME": { + return LocaleController.formatString("PushReactGame", R.string.PushReactGame, args); + } + case "REACT_INVOICE": { + return LocaleController.formatString("PushReactInvoice", R.string.PushReactInvoice, args); + } + case "REACT_GIF": { + return LocaleController.formatString("PushReactGif", R.string.PushReactGif, args); + } + case "CHAT_REACT_TEXT": { + return LocaleController.formatString("PushChatReactText", R.string.PushChatReactText, args); + } + case "CHAT_REACT_NOTEXT": { + return LocaleController.formatString("PushChatReactNotext", R.string.PushChatReactNotext, args); + } + case "CHAT_REACT_PHOTO": { + return LocaleController.formatString("PushChatReactPhoto", R.string.PushChatReactPhoto, args); + } + case "CHAT_REACT_VIDEO": { + return LocaleController.formatString("PushChatReactVideo", R.string.PushChatReactVideo, args); + } + case "CHAT_REACT_ROUND": { + return LocaleController.formatString("PushChatReactRound", R.string.PushChatReactRound, args); + } + case "CHAT_REACT_DOC": { + return LocaleController.formatString("PushChatReactDoc", R.string.PushChatReactDoc, args); + } + case "CHAT_REACT_STICKER": { + return LocaleController.formatString("PushChatReactSticker", R.string.PushChatReactSticker, args); + } + case "CHAT_REACT_AUDIO": { + return LocaleController.formatString("PushChatReactAudio", R.string.PushChatReactAudio, args); + } + case "CHAT_REACT_CONTACT": { + return LocaleController.formatString("PushChatReactContact", R.string.PushChatReactContact, args); + } + case "CHAT_REACT_GEO": { + return LocaleController.formatString("PushChatReactGeo", R.string.PushChatReactGeo, args); + } + case "CHAT_REACT_GEOLIVE": { + return LocaleController.formatString("PushChatReactGeoLive", R.string.PushChatReactGeoLive, args); + } + case "CHAT_REACT_POLL": { + return LocaleController.formatString("PushChatReactPoll", R.string.PushChatReactPoll, args); + } + case "CHAT_REACT_QUIZ": { + return LocaleController.formatString("PushChatReactQuiz", R.string.PushChatReactQuiz, args); + } + case "CHAT_REACT_GAME": { + return LocaleController.formatString("PushChatReactGame", R.string.PushChatReactGame, args); + } + case "CHAT_REACT_INVOICE": { + return LocaleController.formatString("PushChatReactInvoice", R.string.PushChatReactInvoice, args); + } + case "CHAT_REACT_GIF": { + return LocaleController.formatString("PushChatReactGif", R.string.PushChatReactGif, args); + } + } + return null; + } + + private static void onDecryptError() { + for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { + if (UserConfig.getInstance(a).isClientActivated()) { + ConnectionsManager.onInternalPushReceived(a); + ConnectionsManager.getInstance(a).resumeNetworkMaybe(); + } + } + countDownLatch.countDown(); + } + + public interface IPushListenerServiceProvider { + boolean hasServices(); + String getLogTitle(); + void onRequestPushToken(); + @PushType + int getPushType(); + } + + public final static class GooglePushListenerServiceProvider implements IPushListenerServiceProvider { + public final static GooglePushListenerServiceProvider INSTANCE = new GooglePushListenerServiceProvider(); + + private Boolean hasServices; + + private GooglePushListenerServiceProvider() {} + + @Override + public String getLogTitle() { + return "Google Play Services"; + } + + @Override + public int getPushType() { + return PUSH_TYPE_FIREBASE; + } + + @Override + public void onRequestPushToken() { + String currentPushString = SharedConfig.pushString; + if (!TextUtils.isEmpty(currentPushString)) { + if (BuildVars.DEBUG_PRIVATE_VERSION && BuildVars.LOGS_ENABLED) { + FileLog.d("FCM regId = " + currentPushString); + } + } else { + if (BuildVars.LOGS_ENABLED) { + FileLog.d("FCM Registration not found."); + } + } + Utilities.globalQueue.postRunnable(() -> { + try { + SharedConfig.pushStringGetTimeStart = SystemClock.elapsedRealtime(); + FirebaseMessaging.getInstance().getToken() + .addOnCompleteListener(task -> { + SharedConfig.pushStringGetTimeEnd = SystemClock.elapsedRealtime(); + if (!task.isSuccessful()) { + if (BuildVars.LOGS_ENABLED) { + FileLog.d("Failed to get regid"); + } + SharedConfig.pushStringStatus = "__FIREBASE_FAILED__"; + PushListenerController.sendRegistrationToServer(getPushType(), null); + return; + } + String token = task.getResult(); + if (!TextUtils.isEmpty(token)) { + PushListenerController.sendRegistrationToServer(getPushType(), token); + } + }); + } catch (Throwable e) { + FileLog.e(e); + } + }); + } + + @Override + public boolean hasServices() { + if (hasServices == null) { + try { + int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(ApplicationLoader.applicationContext); + hasServices = resultCode == ConnectionResult.SUCCESS; + } catch (Exception e) { + FileLog.e(e); + hasServices = false; + } + } + return hasServices; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java index 7e4bba194..e0bbb14c6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java @@ -940,7 +940,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaPhoto || decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaDocument) { long size = (Long) args[5]; - decryptedMessage.media.size = (int) size; + decryptedMessage.media.size = size; } decryptedMessage.media.key = (byte[]) args[3]; decryptedMessage.media.iv = (byte[]) args[4]; @@ -1037,7 +1037,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe if (obj == messageObject) { message.obj.shouldRemoveVideoEditedInfo = true; obj.messageOwner.params.remove("ve"); - obj.messageOwner.media.document.size = (int) finalSize; + obj.messageOwner.media.document.size = finalSize; ArrayList messages = new ArrayList<>(); messages.add(obj.messageOwner); @@ -1048,7 +1048,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe } else if (message.obj == messageObject) { message.obj.shouldRemoveVideoEditedInfo = true; message.obj.messageOwner.params.remove("ve"); - message.obj.messageOwner.media.document.size = (int) finalSize; + message.obj.messageOwner.media.document.size = finalSize; ArrayList messages = new ArrayList<>(); messages.add(message.obj.messageOwner); @@ -1231,7 +1231,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe object.generateCaption(); } else { object.resetLayout(); - object.checkLayout(); +// object.checkLayout(); } ArrayList arr = new ArrayList<>(); @@ -1468,7 +1468,8 @@ public class SendMessagesHelper extends BaseController implements NotificationCe entity instanceof TLRPC.TL_messageEntityPre || entity instanceof TLRPC.TL_messageEntityCode || entity instanceof TLRPC.TL_messageEntityTextUrl || - entity instanceof TLRPC.TL_messageEntitySpoiler) { + entity instanceof TLRPC.TL_messageEntitySpoiler || + entity instanceof TLRPC.TL_messageEntityCustomEmoji) { entities.add(entity); } } @@ -1651,6 +1652,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe boolean canSendMedia = true; boolean canSendPolls = true; boolean canSendPreview = true; + boolean canSendVoiceMessages = true; String rank = null; long linkedToGroup = 0; TLRPC.Chat chat; @@ -1660,6 +1662,11 @@ public class SendMessagesHelper extends BaseController implements NotificationCe return 0; } chat = null; + + TLRPC.UserFull userFull = getMessagesController().getUserFull(peer); + if (userFull != null) { + canSendVoiceMessages = !userFull.voice_messages_forbidden; + } } else { chat = getMessagesController().getChat(-peer); if (ChatObject.isChannel(chat)) { @@ -1717,6 +1724,16 @@ public class SendMessagesHelper extends BaseController implements NotificationCe sendResult = ChatObject.isActionBannedByDefault(chat, ChatObject.ACTION_SEND_POLLS) ? 6 : 3; } continue; + } else if (!canSendVoiceMessages && MessageObject.isVoiceMessage(msgObj.messageOwner)) { + if (sendResult == 0) { + sendResult = 7; + } + continue; + } else if (!canSendVoiceMessages && MessageObject.isRoundVideoMessage(msgObj.messageOwner)) { + if (sendResult == 0) { + sendResult = 8; + } + continue; } final TLRPC.Message newMsg = new TLRPC.TL_message(); @@ -2131,8 +2148,35 @@ public class SendMessagesHelper extends BaseController implements NotificationCe } } } else { + boolean canSendVoiceMessages = true; + TLRPC.EncryptedChat encryptedChat = getMessagesController().getEncryptedChat((int) peer); + long userId = encryptedChat.user_id; + if (DialogObject.isUserDialog(userId)) { + TLRPC.User sendToUser = getMessagesController().getUser(userId); + if (sendToUser != null) { + TLRPC.UserFull userFull = getMessagesController().getUserFull(userId); + if (userFull != null) { + canSendVoiceMessages = !userFull.voice_messages_forbidden; + } + } + } + for (int a = 0; a < messages.size(); a++) { - processForwardFromMyName(messages.get(a), peer); + MessageObject msgObj = messages.get(a); + if (!canSendVoiceMessages && MessageObject.isVoiceMessage(msgObj.messageOwner)) { + if (sendResult == 0) { + sendResult = 7; + } + } else if (!canSendVoiceMessages && MessageObject.isRoundVideoMessage(msgObj.messageOwner)) { + if (sendResult == 0) { + sendResult = 8; + } + } + } + if (sendResult == 0) { + for (int a = 0; a < messages.size(); a++) { + processForwardFromMyName(messages.get(a), peer); + } } } return sendResult; @@ -4521,7 +4565,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe message.videoEditedInfo.file = null; } else if (message.videoEditedInfo.encryptedFile != null) { TLRPC.TL_decryptedMessage decryptedMessage = (TLRPC.TL_decryptedMessage) message.sendEncryptedRequest; - decryptedMessage.media.size = (int) message.videoEditedInfo.estimatedSize; + decryptedMessage.media.size = message.videoEditedInfo.estimatedSize; decryptedMessage.media.key = message.videoEditedInfo.key; decryptedMessage.media.iv = message.videoEditedInfo.iv; getSecretChatHelper().performSendEncryptedRequest(decryptedMessage, message.obj.messageOwner, message.encryptedChat, message.videoEditedInfo.encryptedFile, message.originalPath, message.obj); @@ -6342,7 +6386,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe } @UiThread - public static void prepareSendingAudioDocuments(AccountInstance accountInstance, ArrayList messageObjects, String caption, long dialogId, MessageObject replyToMsg, MessageObject replyToTopMsg, MessageObject editingMessageObject, boolean notify, int scheduleDate) { + public static void prepareSendingAudioDocuments(AccountInstance accountInstance, ArrayList messageObjects, CharSequence caption, long dialogId, MessageObject replyToMsg, MessageObject replyToTopMsg, MessageObject editingMessageObject, boolean notify, int scheduleDate) { new Thread(() -> { int count = messageObjects.size(); long groupId = 0; @@ -6386,7 +6430,9 @@ public class SendMessagesHelper extends BaseController implements NotificationCe final TLRPC.TL_document documentFinal = document; final String parentFinal = parentObject; - final String captionFinal = a == 0 ? caption : null; + final CharSequence[] text = new CharSequence[] { caption }; + final ArrayList entities = a == 0 ? accountInstance.getMediaDataController().getEntities(text, true) : null; + final String captionFinal = a == 0 ? text[0].toString() : null; final HashMap params = new HashMap<>(); if (originalPath != null) { params.put("originalPath", originalPath); @@ -6403,7 +6449,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe if (editingMessageObject != null) { accountInstance.getSendMessagesHelper().editMessage(editingMessageObject, null, null, documentFinal, messageObject.messageOwner.attachPath, params, false, parentFinal); } else { - accountInstance.getSendMessagesHelper().sendMessage(documentFinal, null, messageObject.messageOwner.attachPath, dialogId, replyToMsg, replyToTopMsg, captionFinal, null, null, params, notify, scheduleDate, 0, parentFinal, null); + accountInstance.getSendMessagesHelper().sendMessage(documentFinal, null, messageObject.messageOwner.attachPath, dialogId, replyToMsg, replyToTopMsg, captionFinal, entities, null, params, notify, scheduleDate, 0, parentFinal, null); } }); } @@ -6533,7 +6579,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe } @UiThread - public static void prepareSendingBotContextResult(AccountInstance accountInstance, TLRPC.BotInlineResult result, HashMap params, long dialogId, MessageObject replyToMsg, MessageObject replyToTopMsg, boolean notify, int scheduleDate) { + public static void prepareSendingBotContextResult(BaseFragment fragment, AccountInstance accountInstance, TLRPC.BotInlineResult result, HashMap params, long dialogId, MessageObject replyToMsg, MessageObject replyToTopMsg, boolean notify, int scheduleDate) { if (result == null) { return; } @@ -6789,6 +6835,17 @@ public class SendMessagesHelper extends BaseController implements NotificationCe ensureMediaThumbExists(accountInstance, isEncrypted, document, gifFile.getAbsolutePath(), null, 0); precachedKey[0] = getKeyForPhotoSize(accountInstance, photoSizeThumb, precahcedThumb, true, true); } + TLRPC.InputPeer sendToPeer = !DialogObject.isEncryptedDialog(dialogId) ? accountInstance.getMessagesController().getInputPeer(dialogId) : null; + if (sendToPeer.user_id != 0 && accountInstance.getMessagesController().getUserFull(sendToPeer.user_id) != null && + accountInstance.getMessagesController().getUserFull(sendToPeer.user_id).voice_messages_forbidden && document != null) { + + if (MessageObject.isVoiceDocument(finalDocument)) { + AndroidUtilities.runOnUIThread(() -> AlertsCreator.showSendMediaAlert(7, fragment, null)); + } else if (MessageObject.isRoundVideoDocument(finalDocument)) { + AndroidUtilities.runOnUIThread(() -> AlertsCreator.showSendMediaAlert(8, fragment, null)); + } + return; + } AndroidUtilities.runOnUIThread(() -> { if (finalDocument != null) { if (precahcedThumb[0] != null && precachedKey[0] != null) { @@ -7411,7 +7468,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe attributeVideo.w = w; attributeVideo.h = h; } - document.size = (int) videoEditedInfo.estimatedSize; + document.size = videoEditedInfo.estimatedSize; } else { if (temp.exists()) { document.size = (int) temp.length(); @@ -7807,7 +7864,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe public static Bitmap createVideoThumbnailAtTime(String filePath, long time, int[] orientation, boolean precise) { Bitmap bitmap = null; if (precise) { - AnimatedFileDrawable fileDrawable = new AnimatedFileDrawable(new File(filePath), true, 0, null, null, null, 0, 0, true); + AnimatedFileDrawable fileDrawable = new AnimatedFileDrawable(new File(filePath), true, 0, null, null, null, 0, 0, true, null); bitmap = fileDrawable.getFrameAtTime(time, precise); if (orientation != null) { orientation[0] = fileDrawable.getOrientation(); @@ -7925,32 +7982,33 @@ public class SendMessagesHelper extends BaseController implements NotificationCe selectedCompression = compressionsCount; } boolean needCompress = false; - if (selectedCompression != compressionsCount || Math.max(videoEditedInfo.originalWidth, videoEditedInfo.originalHeight) > 1280) { - needCompress = true; - switch (selectedCompression) { - case 1: - maxSize = 432.0f; - break; - case 2: - maxSize = 640.0f; - break; - case 3: - maxSize = 848.0f; - break; - default: - maxSize = 1280.0f; - break; + if (new File(videoPath).length() < 1024L * 1024L * 1000L) { + if (selectedCompression != compressionsCount || Math.max(videoEditedInfo.originalWidth, videoEditedInfo.originalHeight) > 1280) { + needCompress = true; + switch (selectedCompression) { + case 1: + maxSize = 432.0f; + break; + case 2: + maxSize = 640.0f; + break; + case 3: + maxSize = 848.0f; + break; + default: + maxSize = 1280.0f; + break; + } + float scale = videoEditedInfo.originalWidth > videoEditedInfo.originalHeight ? maxSize / videoEditedInfo.originalWidth : maxSize / videoEditedInfo.originalHeight; + videoEditedInfo.resultWidth = Math.round(videoEditedInfo.originalWidth * scale / 2) * 2; + videoEditedInfo.resultHeight = Math.round(videoEditedInfo.originalHeight * scale / 2) * 2; } - float scale = videoEditedInfo.originalWidth > videoEditedInfo.originalHeight ? maxSize / videoEditedInfo.originalWidth : maxSize / videoEditedInfo.originalHeight; - videoEditedInfo.resultWidth = Math.round(videoEditedInfo.originalWidth * scale / 2) * 2; - videoEditedInfo.resultHeight = Math.round(videoEditedInfo.originalHeight * scale / 2) * 2; + bitrate = MediaController.makeVideoBitrate( + videoEditedInfo.originalHeight, videoEditedInfo.originalWidth, + originalBitrate, + videoEditedInfo.resultHeight, videoEditedInfo.resultWidth + ); } - bitrate = MediaController.makeVideoBitrate( - videoEditedInfo.originalHeight, videoEditedInfo.originalWidth, - originalBitrate, - videoEditedInfo.resultHeight, videoEditedInfo.resultWidth - ); - if (!needCompress) { videoEditedInfo.resultWidth = videoEditedInfo.originalWidth; @@ -7960,7 +8018,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe videoEditedInfo.bitrate = bitrate; } - videoEditedInfo.estimatedSize = (int) (audioFramesSize + videoDuration / 1000.0f * bitrate / 8); + videoEditedInfo.estimatedSize = (long) (audioFramesSize + videoDuration / 1000.0f * bitrate / 8); if (videoEditedInfo.estimatedSize == 0) { videoEditedInfo.estimatedSize = 1; } @@ -8080,7 +8138,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe attributeVideo.w = w; attributeVideo.h = h; } - document.size = (int) videoEditedInfo.estimatedSize; + document.size = videoEditedInfo.estimatedSize; } else { if (temp.exists()) { document.size = (int) temp.length(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java index d5509d0c9..df9d1f18f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java @@ -43,6 +43,7 @@ public class SharedConfig { public final static int PASSCODE_TYPE_PIN = 0, PASSCODE_TYPE_PASSWORD = 1; + @Retention(RetentionPolicy.SOURCE) @IntDef({ PASSCODE_TYPE_PIN, @@ -54,6 +55,8 @@ public class SharedConfig { public final static int SAVE_TO_GALLERY_FLAG_GROUP = 2; public final static int SAVE_TO_GALLERY_FLAG_CHANNELS = 4; + @PushListenerController.PushType + public static int pushType = PushListenerController.PUSH_TYPE_FIREBASE; public static String pushString = ""; public static String pushStringStatus = ""; public static long pushStringGetTimeStart; @@ -81,6 +84,7 @@ public class SharedConfig { public static boolean useFingerprint = true; public static String lastUpdateVersion; public static int suggestStickers; + public static boolean suggestAnimatedEmoji; public static boolean loopStickers; public static int keepMedia = 2; public static int lastKeepMediaCheckTime; @@ -222,6 +226,7 @@ public class SharedConfig { editor.putBoolean("useFingerprint", useFingerprint); editor.putBoolean("allowScreenCapture", allowScreenCapture); editor.putString("pushString2", pushString); + editor.putInt("pushType", pushType); editor.putBoolean("pushStatSent", pushStatSent); editor.putString("pushAuthKey", pushAuthKey != null ? Base64.encodeToString(pushAuthKey, Base64.DEFAULT) : ""); editor.putInt("lastLocalId", lastLocalId); @@ -289,6 +294,7 @@ public class SharedConfig { allowScreenCapture = preferences.getBoolean("allowScreenCapture", false); lastLocalId = preferences.getInt("lastLocalId", -210000); pushString = preferences.getString("pushString2", ""); + pushType = preferences.getInt("pushType", PushListenerController.PUSH_TYPE_FIREBASE); pushStatSent = preferences.getBoolean("pushStatSent", false); passportConfigJson = preferences.getString("passportConfigJson", ""); passportConfigHash = preferences.getInt("passportConfigHash", 0); @@ -379,6 +385,7 @@ public class SharedConfig { streamAllVideo = preferences.getBoolean("streamAllVideo", BuildVars.DEBUG_VERSION); streamMkv = preferences.getBoolean("streamMkv", false); suggestStickers = preferences.getInt("suggestStickers", 0); + suggestAnimatedEmoji = preferences.getBoolean("suggestAnimatedEmoji", true); sortContactsByName = preferences.getBoolean("sortContactsByName", false); sortFilesByName = preferences.getBoolean("sortFilesByName", false); noSoundHintShowed = preferences.getBoolean("noSoundHintShowed", false); @@ -802,6 +809,14 @@ public class SharedConfig { editor.commit(); } + public static void toggleSuggestAnimatedEmoji() { + suggestAnimatedEmoji = !suggestAnimatedEmoji; + SharedPreferences preferences = MessagesController.getGlobalMainSettings(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("suggestAnimatedEmoji", suggestAnimatedEmoji); + editor.commit(); + } + public static void setPlaybackOrderType(int type) { if (type == 2) { shuffleMusic = true; @@ -1274,4 +1289,8 @@ public class SharedConfig { prefs.edit().putLong("last_checked", l).apply(); } } + + public static boolean animationsEnabled() { + return MessagesController.getGlobalMainSettings().getBoolean("view_animations", true); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java index c4cec3a41..4db9475f9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java @@ -39,7 +39,6 @@ import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.Build; -import android.os.SystemClock; import org.telegram.ui.ActionBar.Theme; import org.xml.sax.Attributes; @@ -71,7 +70,7 @@ public class SvgHelper { } } - private static class Circle { + public static class Circle { float x1, y1, rad; public Circle(float x1, float y1, float rad) { @@ -103,22 +102,24 @@ public class SvgHelper { protected ArrayList commands = new ArrayList<>(); protected HashMap paints = new HashMap<>(); private Paint overridePaint; + private Paint backgroundPaint; protected int width; protected int height; private static int[] parentPosition = new int[2]; - private Bitmap backgroundBitmap; - private Canvas backgroundCanvas; - private LinearGradient placeholderGradient; - private Matrix placeholderMatrix; + private Bitmap[] backgroundBitmap = new Bitmap[2]; + private Canvas[] backgroundCanvas = new Canvas[2]; + private LinearGradient[] placeholderGradient = new LinearGradient[2]; + private Matrix[] placeholderMatrix = new Matrix[2]; private static float totalTranslation; private static float gradientWidth; private static long lastUpdateTime; private static Runnable shiftRunnable; private static WeakReference shiftDrawable; private ImageReceiver parentImageReceiver; - private int currentColor; + private int[] currentColor = new int[2]; private String currentColorKey; + private Theme.ResourcesProvider currentResourcesProvider; private float colorAlpha; private float crossfadeAlpha = 1.0f; @@ -145,27 +146,93 @@ public class SvgHelper { @Override public void draw(Canvas canvas) { + drawInternal(canvas, false, System.currentTimeMillis(), getBounds().left, getBounds().top, getBounds().width(), getBounds().height()); + } + + public void drawInternal(Canvas canvas, boolean drawInBackground, long time, float x, float y, float w, float h) { if (currentColorKey != null) { - setupGradient(currentColorKey, colorAlpha); + setupGradient(currentColorKey, currentResourcesProvider, colorAlpha, drawInBackground); } - Rect bounds = getBounds(); - float scale = getScale(); + + float scale = getScale((int) w, (int) h); + if (placeholderGradient != null) { + if (drawInBackground) { + long dt = time - lastUpdateTime; + if (dt > 64) { + dt = 64; + } + if (dt > 0) { + lastUpdateTime = time; + totalTranslation += dt * gradientWidth / 1800.0f; + while (totalTranslation >= gradientWidth * 2) { + totalTranslation -= gradientWidth * 2; + } + } + } else { + if (shiftRunnable == null || shiftDrawable.get() == this) { + long dt = time - lastUpdateTime; + if (dt > 64) { + dt = 64; + } + if (dt < 0) { + dt = 0; + } + lastUpdateTime = time; + totalTranslation += dt * gradientWidth / 1800.0f; + while (totalTranslation >= gradientWidth / 2) { + totalTranslation -= gradientWidth; + } + shiftDrawable = new WeakReference<>(this); + if (shiftRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(shiftRunnable); + } + AndroidUtilities.runOnUIThread(shiftRunnable = () -> shiftRunnable = null, (int) (1000 / AndroidUtilities.screenRefreshRate) - 1); + } + } + int offset; + if (parentImageReceiver != null && !drawInBackground) { + parentImageReceiver.getParentPosition(parentPosition); + offset = parentPosition[0]; + } else { + offset = 0; + } + + int index = drawInBackground ? 1 : 0; + if (placeholderMatrix[index] != null) { + placeholderMatrix[index].reset(); + if (drawInBackground) { + placeholderMatrix[index].postTranslate(-offset + totalTranslation - x, 0); + } else { + placeholderMatrix[index].postTranslate(-offset + totalTranslation - x, 0); + } + + placeholderMatrix[index].postScale(1.0f / scale, 1.0f / scale); + placeholderGradient[index].setLocalMatrix(placeholderMatrix[index]); + + if (parentImageReceiver != null && !drawInBackground) { + parentImageReceiver.invalidate(); + } + } + } + canvas.save(); - canvas.translate(bounds.left, bounds.top); + canvas.translate(x, y); if (!aspectFill) { - canvas.translate((bounds.width() - width * scale) / 2, (bounds.height() - height * scale) / 2); + canvas.translate((w - width * scale) / 2, (h - height * scale) / 2); } canvas.scale(scale, scale); for (int a = 0, N = commands.size(); a < N; a++) { Object object = commands.get(a); if (object instanceof Matrix) { canvas.save(); - canvas.concat((Matrix) object); + // canvas.concat((Matrix) object); } else if (object == null) { canvas.restore(); } else { Paint paint; - if (overridePaint != null) { + if (drawInBackground) { + paint = backgroundPaint; + } else if (overridePaint != null) { paint = overridePaint; } else { paint = paints.get(object); @@ -195,41 +262,11 @@ public class SvgHelper { } } canvas.restore(); - if (placeholderGradient != null) { - if (shiftRunnable == null || shiftDrawable.get() == this) { - long newUpdateTime = SystemClock.elapsedRealtime(); - long dt = Math.abs(lastUpdateTime - newUpdateTime); - if (dt > 17) { - dt = 16; - } - lastUpdateTime = newUpdateTime; - totalTranslation += dt * gradientWidth / 1800.0f; - while (totalTranslation >= gradientWidth / 2) { - totalTranslation -= gradientWidth; - } - shiftDrawable = new WeakReference<>(this); - if (shiftRunnable != null) { - AndroidUtilities.cancelRunOnUIThread(shiftRunnable); - } - AndroidUtilities.runOnUIThread(shiftRunnable = () -> shiftRunnable = null, (int) (1000 / AndroidUtilities.screenRefreshRate) - 1); - } - if (parentImageReceiver != null) { - parentImageReceiver.getParentPosition(parentPosition); - } - placeholderMatrix.reset(); - placeholderMatrix.postTranslate(-parentPosition[0] + totalTranslation - bounds.left, 0); - placeholderMatrix.postScale(1.0f / scale, 1.0f / scale); - placeholderGradient.setLocalMatrix(placeholderMatrix); - if (parentImageReceiver != null) { - parentImageReceiver.invalidate(); - } - } } - public float getScale() { - Rect bounds = getBounds(); - float scaleX = bounds.width() / (float) width; - float scaleY = bounds.height() / (float) height; + public float getScale(int viewWidth, int viewHeight) { + float scaleX = viewWidth / (float) width; + float scaleY = viewHeight / (float) height; return aspectFill ? Math.max(scaleX, scaleY) : Math.min(scaleX, scaleY); } @@ -261,35 +298,52 @@ public class SvgHelper { parentImageReceiver = imageReceiver; } - public void setupGradient(String colorKey, float alpha) { - int color = Theme.getColor(colorKey); - if (currentColor != color) { + public void setupGradient(String colorKey, float alpha, boolean drawInBackground) { + setupGradient(colorKey, null, alpha, drawInBackground); + } + + public void setupGradient(String colorKey, Theme.ResourcesProvider resourcesProvider, float alpha, boolean drawInBackground) { + int color = Theme.getColor(colorKey, resourcesProvider); + int index = drawInBackground ? 1 : 0; + currentResourcesProvider = resourcesProvider; + if (currentColor[index] != color) { colorAlpha = alpha; currentColorKey = colorKey; - currentColor = color; + currentColor[index] = color; gradientWidth = AndroidUtilities.displaySize.x * 2; float w = AndroidUtilities.dp(180) / gradientWidth; color = Color.argb((int) (Color.alpha(color) / 2 * colorAlpha), Color.red(color), Color.green(color), Color.blue(color)); float centerX = (1.0f - w) / 2; - placeholderGradient = new LinearGradient(0, 0, gradientWidth, 0, new int[]{0x00000000, 0x00000000, color, 0x00000000, 0x00000000}, new float[]{0.0f, centerX - w / 2.0f, centerX, centerX + w / 2.0f, 1.0f}, Shader.TileMode.REPEAT); + placeholderGradient[index] = new LinearGradient(0, 0, gradientWidth, 0, new int[]{0x00000000, 0x00000000, color, 0x00000000, 0x00000000}, new float[]{0.0f, centerX - w / 2.0f, centerX, centerX + w / 2.0f, 1.0f}, Shader.TileMode.REPEAT); Shader backgroundGradient; if (Build.VERSION.SDK_INT >= 28) { backgroundGradient = new LinearGradient(0, 0, gradientWidth, 0, new int[]{color, color}, null, Shader.TileMode.REPEAT); } else { - if (backgroundBitmap == null) { - backgroundBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); - backgroundCanvas = new Canvas(backgroundBitmap); + if (backgroundBitmap[index] == null) { + backgroundBitmap[index] = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + backgroundCanvas[index] = new Canvas(backgroundBitmap[index]); } - backgroundCanvas.drawColor(color); - backgroundGradient = new BitmapShader(backgroundBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); + backgroundCanvas[index].drawColor(color); + backgroundGradient = new BitmapShader(backgroundBitmap[index], Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); } - placeholderMatrix = new Matrix(); - placeholderGradient.setLocalMatrix(placeholderMatrix); - for (Paint paint : paints.values()) { + placeholderMatrix[index] = new Matrix(); + placeholderGradient[index].setLocalMatrix(placeholderMatrix[index]); + if (drawInBackground) { + if (backgroundPaint == null) { + backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + } if (Build.VERSION.SDK_INT <= 22) { - paint.setShader(backgroundGradient); + backgroundPaint.setShader(backgroundGradient); } else { - paint.setShader(new ComposeShader(placeholderGradient, backgroundGradient, PorterDuff.Mode.ADD)); + backgroundPaint.setShader(new ComposeShader(placeholderGradient[index], backgroundGradient, PorterDuff.Mode.ADD)); + } + } else { + for (Paint paint : paints.values()) { + if (Build.VERSION.SDK_INT <= 22) { + paint.setShader(backgroundGradient); + } else { + paint.setShader(new ComposeShader(placeholderGradient[index], backgroundGradient, PorterDuff.Mode.ADD)); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index 4038b36c9..77c3a6194 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -16,7 +16,11 @@ import android.util.Base64; import org.telegram.tgnet.SerializedData; import org.telegram.tgnet.TLRPC; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; public class UserConfig extends BaseController { @@ -61,6 +65,12 @@ public class UserConfig extends BaseController { public TLRPC.TL_help_termsOfService unacceptedTermsOfService; public long autoDownloadConfigLoadTime; + public List awaitBillingProductIds = new ArrayList<>(); + public TLRPC.InputStorePaymentPurpose billingPaymentPurpose; + + public String premiumGiftsStickerPack; + public long lastUpdatedPremiumGiftsStickerPack; + public volatile byte[] savedPasswordHash; public volatile byte[] savedSaltedPassword; public volatile long savedPasswordTime; @@ -145,6 +155,17 @@ public class UserConfig extends BaseController { editor.putInt("sharingMyLocationUntil", sharingMyLocationUntil); editor.putInt("lastMyLocationShareTime", lastMyLocationShareTime); editor.putBoolean("filtersLoaded", filtersLoaded); + editor.putStringSet("awaitBillingProductIds", new HashSet<>(awaitBillingProductIds)); + if (billingPaymentPurpose != null) { + SerializedData data = new SerializedData(billingPaymentPurpose.getObjectSize()); + billingPaymentPurpose.serializeToStream(data); + editor.putString("billingPaymentPurpose", Base64.encodeToString(data.toByteArray(), Base64.DEFAULT)); + data.cleanup(); + } else { + editor.remove("billingPaymentPurpose"); + } + editor.putString("premiumGiftsStickerPack", premiumGiftsStickerPack); + editor.putLong("lastUpdatedPremiumGiftsStickerPack", lastUpdatedPremiumGiftsStickerPack); editor.putInt("6migrateOffsetId", migrateOffsetId); if (migrateOffsetId != -1) { @@ -280,6 +301,20 @@ public class UserConfig extends BaseController { sharingMyLocationUntil = preferences.getInt("sharingMyLocationUntil", 0); lastMyLocationShareTime = preferences.getInt("lastMyLocationShareTime", 0); filtersLoaded = preferences.getBoolean("filtersLoaded", false); + awaitBillingProductIds = new ArrayList<>(preferences.getStringSet("awaitBillingProductIds", Collections.emptySet())); + if (preferences.contains("billingPaymentPurpose")) { + String purpose = preferences.getString("billingPaymentPurpose", null); + if (purpose != null) { + byte[] arr = Base64.decode(purpose, Base64.DEFAULT); + if (arr != null) { + SerializedData data = new SerializedData(); + billingPaymentPurpose = TLRPC.InputStorePaymentPurpose.TLdeserialize(data, data.readInt32(false), false); + data.cleanup(); + } + } + } + premiumGiftsStickerPack = preferences.getString("premiumGiftsStickerPack", null); + lastUpdatedPremiumGiftsStickerPack = preferences.getLong("lastUpdatedPremiumGiftsStickerPack", 0); try { String terms = preferences.getString("terms", null); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java index 58a7df743..54317dc3e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java @@ -434,6 +434,10 @@ public class Utilities { return null; } + public static int clamp(int value, int maxValue, int minValue) { + return Math.max(Math.min(value, maxValue), minValue); + } + public static float clamp(float value, float maxValue, float minValue) { if (Float.isNaN(value)) { return minValue; @@ -455,4 +459,8 @@ public class Utilities { } return sb.toString(); } + + public static interface Callback { + public void run(T arg); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraSession.java b/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraSession.java index 8b443a43b..bea54dcd7 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraSession.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraSession.java @@ -11,7 +11,6 @@ package org.telegram.messenger.camera; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; -import android.graphics.ImageFormat; import android.graphics.Rect; import android.hardware.Camera; import android.media.CamcorderProfile; @@ -204,7 +203,7 @@ public class CameraSession { return sameTakePictureOrientation; } - protected void configureRoundCamera(boolean initial) { + protected boolean configureRoundCamera(boolean initial) { try { isVideo = true; Camera camera = cameraInfo.camera; @@ -276,7 +275,9 @@ public class CameraSession { } } catch (Throwable e) { FileLog.e(e); + return false; } + return true; } public void updateRotation() { @@ -580,4 +581,12 @@ public class CameraSession { orientationEventListener = null; } } + + public Camera.Size getCurrentPreviewSize() { + return cameraInfo.camera.getParameters().getPreviewSize(); + } + + public Camera.Size getCurrentPictureSize() { + return cameraInfo.camera.getParameters().getPictureSize(); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/utils/BitmapsCache.java b/TMessagesProj/src/main/java/org/telegram/messenger/utils/BitmapsCache.java new file mode 100644 index 000000000..70511d97e --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/utils/BitmapsCache.java @@ -0,0 +1,419 @@ +package org.telegram.messenger.utils; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.Utilities; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class BitmapsCache { + + public final static int FRAME_RESULT_OK = 0; + public final static int FRAME_RESULT_NO_FRAME = -1; + public static final int COMPRESS_QUALITY_DEFAULT = 60; + private final Cacheable source; + String fileName; + int w; + int h; + + ArrayList frameOffsets = new ArrayList<>(); + + byte[] bufferTmp; + + private final static int N = Utilities.clamp(Runtime.getRuntime().availableProcessors() - 2, 8, 1); + private static ThreadPoolExecutor bitmapCompressExecutor; + private final Object mutex = new Object(); + private int frameIndex; + boolean error; + int compressQuality; + + final File file; + + public BitmapsCache(File sourceFile, Cacheable source, CacheOptions options, int w, int h) { + this.source = source; + this.w = w; + this.h = h; + compressQuality = options.compressQuality; + fileName = sourceFile.getName(); + if (bitmapCompressExecutor == null) { + bitmapCompressExecutor = new ThreadPoolExecutor(N, N, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + } + + File fileTmo = new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache"); + file = new File(fileTmo, fileName + "_" + w + "_" + h + ".pcache2"); + } + + volatile boolean checkCache; + volatile boolean cacheCreated; + volatile boolean recycled; + + RandomAccessFile cachedFile; + + public void createCache() { + try { + long time = System.currentTimeMillis(); + RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); + if (file.exists()) { + try { + cacheCreated = randomAccessFile.readBoolean(); + if (cacheCreated) { + randomAccessFile.close(); + return; + } else { + file.delete(); + } + } catch (Exception e) { + + } + } + randomAccessFile.close(); + randomAccessFile = new RandomAccessFile(file, "rw"); + + Bitmap[] bitmap = new Bitmap[N]; + ByteArrayOutputStream[] byteArrayOutputStream = new ByteArrayOutputStream[N]; + CountDownLatch[] countDownLatch = new CountDownLatch[N]; + for (int i = 0; i < N; i++) { + bitmap[i] = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + byteArrayOutputStream[i] = new ByteArrayOutputStream(w * h * 2); + } + ArrayList frameOffsets = new ArrayList<>(); + RandomAccessFile finalRandomAccessFile = randomAccessFile; + + + finalRandomAccessFile.writeBoolean(false); + finalRandomAccessFile.writeInt(0); + + int index = 0; + long bitmapFrameTime = 0; + long compressTime = 0; + long writeFileTime = 0; + int framePosition = 0; + + source.prepareForGenerateCache(); + while (true) { + if (countDownLatch[index] != null) { + try { + countDownLatch[index].await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + long time2 = System.currentTimeMillis(); + if (source.getNextFrame(bitmap[index]) != 1) { + break; + } + bitmapFrameTime += System.currentTimeMillis() - time2; + countDownLatch[index] = new CountDownLatch(1); + + + int finalIndex = index; + int finalFramePosition = framePosition; + RandomAccessFile finalRandomAccessFile1 = randomAccessFile; + bitmapCompressExecutor.execute(() -> { + bitmap[finalIndex].compress(Bitmap.CompressFormat.WEBP, compressQuality, byteArrayOutputStream[finalIndex]); + int size = byteArrayOutputStream[finalIndex].count; + + try { + synchronized (mutex) { + FrameOffset frameOffset = new FrameOffset(finalFramePosition); + frameOffset.frameOffset = (int) finalRandomAccessFile1.length(); + + frameOffsets.add(frameOffset); + + finalRandomAccessFile1.write(byteArrayOutputStream[finalIndex].buf, 0, size); + frameOffset.frameSize = size; + byteArrayOutputStream[finalIndex].reset(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + countDownLatch[finalIndex].countDown(); + }); + + index++; + framePosition++; + if (index >= N) { + index = 0; + } + } + for (int i = 0; i < N; i++) { + if (countDownLatch[i] != null) { + try { + countDownLatch[i].await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + if (bitmap[i] != null) { + try { + bitmap[i].recycle(); + } catch (Exception e) { + + } + } + if (byteArrayOutputStream[i] != null) { + byteArrayOutputStream[i].buf = null; + } + } + + int arrayOffset = (int) randomAccessFile.length(); + + Collections.sort(frameOffsets, Comparator.comparingInt(o -> o.index)); + randomAccessFile.writeInt(frameOffsets.size()); + for (int i = 0; i < frameOffsets.size(); i++) { + randomAccessFile.writeInt(frameOffsets.get(i).frameOffset); + randomAccessFile.writeInt(frameOffsets.get(i).frameSize); + } + randomAccessFile.seek(0); + randomAccessFile.writeBoolean(true); + randomAccessFile.writeInt(arrayOffset); + randomAccessFile.close(); + + if (BuildVars.DEBUG_VERSION) { + FileLog.d("generate cache for time = " + (System.currentTimeMillis() - time) + " drawFrameTime = " + bitmapFrameTime + " comressQuality = " + compressQuality + " fileSize = " + AndroidUtilities.formatFileSize(file.length()) + " " + fileName); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + source.releaseForGenerateCache(); + } + } + + public int getFrame(Bitmap bitmap, Metadata metadata) { + int res = getFrame(frameIndex, bitmap); + metadata.frame = frameIndex; + if (cacheCreated && !frameOffsets.isEmpty()) { + frameIndex++; + if (frameIndex >= frameOffsets.size()) { + frameIndex = 0; + } + } + return res; + } + + public boolean cacheExist() { + if (checkCache) { + return cacheCreated; + } + RandomAccessFile randomAccessFile = null; + try { + synchronized (mutex) { + randomAccessFile = new RandomAccessFile(file, "r"); + cacheCreated = randomAccessFile.readBoolean(); + } + } catch (Exception e) { + + } finally { + if (randomAccessFile != null) { + try { + randomAccessFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + checkCache = false; + return cacheCreated; + } + + public int getFrame(int index, Bitmap bitmap) { + if (error) { + return FRAME_RESULT_NO_FRAME; + } + RandomAccessFile randomAccessFile = null; + try { + FrameOffset selectedFrame; + synchronized (mutex) { + if (!cacheCreated || cachedFile == null) { + randomAccessFile = new RandomAccessFile(file, "r"); + cacheCreated = randomAccessFile.readBoolean(); + if (cacheCreated && frameOffsets.isEmpty()) { + randomAccessFile.seek(randomAccessFile.readInt()); + int count = randomAccessFile.readInt(); + + for (int i = 0; i < count; i++) { + FrameOffset frameOffset = new FrameOffset(i); + frameOffset.frameOffset = randomAccessFile.readInt(); + frameOffset.frameSize = randomAccessFile.readInt(); + frameOffsets.add(frameOffset); + } + } + + if (!cacheCreated) { + randomAccessFile.close(); + randomAccessFile = null; + source.getFirstFrame(bitmap); + return FRAME_RESULT_OK; + } else if (frameOffsets.isEmpty()) { + return FRAME_RESULT_NO_FRAME; + } + } else { + randomAccessFile = cachedFile; + } + index = Utilities.clamp(index, frameOffsets.size() - 1, 0); + selectedFrame = frameOffsets.get(index); + randomAccessFile.seek(selectedFrame.frameOffset); + if (bufferTmp == null || bufferTmp.length < selectedFrame.frameSize) { + bufferTmp = new byte[selectedFrame.frameSize]; + } + randomAccessFile.readFully(bufferTmp, 0, selectedFrame.frameSize); + if (!recycled) { + cachedFile = randomAccessFile; + } else { + cachedFile = null; + randomAccessFile.close(); + } + } + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inBitmap = bitmap; + BitmapFactory.decodeByteArray(bufferTmp, 0, selectedFrame.frameSize, options); + return FRAME_RESULT_OK; + } catch (FileNotFoundException e) { + + } catch (IOException e) { + FileLog.e(e); + } + + if (randomAccessFile != null) { + try { + randomAccessFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // source.getFirstFrame(bitmap); + return FRAME_RESULT_NO_FRAME; + } + + public boolean needGenCache() { + return !cacheCreated; + } + + public void recycle() { + if (cachedFile != null) { + try { + cachedFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + cachedFile = null; + } + recycled = true; + } + + public int getFrameCount() { + return frameOffsets.size(); + } + + private class FrameOffset { + final int index; + int frameSize; + int frameOffset; + + private FrameOffset(int index) { + this.index = index; + } + } + + public interface Cacheable { + void prepareForGenerateCache(); + int getNextFrame(Bitmap bitmap); + void releaseForGenerateCache(); + + Bitmap getFirstFrame(Bitmap bitmap); + } + + public static class ByteArrayOutputStream extends OutputStream { + + protected byte buf[]; + + protected int count; + + public ByteArrayOutputStream() { + this(32); + } + + public ByteArrayOutputStream(int size) { + buf = new byte[size]; + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity - buf.length > 0) + grow(minCapacity); + } + + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + private void grow(int minCapacity) { + int oldCapacity = buf.length; + int newCapacity = oldCapacity << 1; + if (newCapacity - minCapacity < 0) + newCapacity = minCapacity; + if (newCapacity - MAX_ARRAY_SIZE > 0) + newCapacity = hugeCapacity(minCapacity); + buf = Arrays.copyOf(buf, newCapacity); + } + + private static int hugeCapacity(int minCapacity) { + if (minCapacity < 0) // overflow + throw new OutOfMemoryError(); + return (minCapacity > MAX_ARRAY_SIZE) ? + Integer.MAX_VALUE : + MAX_ARRAY_SIZE; + } + + public synchronized void write(int b) { + ensureCapacity(count + 1); + buf[count] = (byte) b; + count += 1; + } + + public synchronized void write(byte b[], int off, int len) { + if ((off < 0) || (off > b.length) || (len < 0) || + ((off + len) - b.length > 0)) { + throw new IndexOutOfBoundsException(); + } + ensureCapacity(count + len); + System.arraycopy(b, off, buf, count, len); + count += len; + } + + public synchronized void writeTo(OutputStream out) throws IOException { + out.write(buf, 0, count); + } + + public synchronized void reset() { + count = 0; + } + } + + public static class Metadata { + public int frame; + } + + public static class CacheOptions { + public int compressQuality = 100; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/utils/CopyUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/utils/CopyUtilities.java new file mode 100644 index 000000000..3724fda57 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/utils/CopyUtilities.java @@ -0,0 +1,298 @@ +package org.telegram.messenger.utils; + +import android.graphics.Typeface; +import android.os.Build; +import android.text.Editable; +import android.text.Html; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.StrikethroughSpan; +import android.text.style.StyleSpan; +import android.text.style.URLSpan; +import android.text.style.UnderlineSpan; + +import org.telegram.messenger.FileLog; +import org.telegram.messenger.MediaDataController; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Components.AnimatedEmojiSpan; +import org.telegram.ui.Components.URLSpanReplacement; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +import java.util.ArrayDeque; +import java.util.ArrayList; + +public class CopyUtilities { + + private final static int TYPE_SPOILER = 0; + private final static int TYPE_MONO = 1; + + public static Spannable fromHTML(String html) { + Spanned spanned; + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + spanned = Html.fromHtml("" + html + "", Html.FROM_HTML_MODE_COMPACT, null, new HTMLTagAttributesHandler(new HTMLTagHandler())); + } else { + spanned = Html.fromHtml("" + html + "", null, new HTMLTagAttributesHandler(new HTMLTagHandler())); + } + } catch (Exception e) { + FileLog.e("Html.fromHtml", e); + return null; + } + if (spanned == null) { + return null; + } + + Object[] spans = spanned.getSpans(0, spanned.length(), Object.class); + ArrayList entities = new ArrayList<>(spans.length); + for (int i = 0; i < spans.length; ++i) { + Object span = spans[i]; + int start = spanned.getSpanStart(span); + int end = spanned.getSpanEnd(span); + if (span instanceof StyleSpan) { + int style = ((StyleSpan) span).getStyle(); + if ((style & Typeface.BOLD) > 0) { + entities.add(setEntityStartEnd(new TLRPC.TL_messageEntityBold(), start, end)); + } + if ((style & Typeface.ITALIC) > 0) { + entities.add(setEntityStartEnd(new TLRPC.TL_messageEntityItalic(), start, end)); + } + } else if (span instanceof UnderlineSpan) { + entities.add(setEntityStartEnd(new TLRPC.TL_messageEntityUnderline(), start, end)); + } else if (span instanceof StrikethroughSpan) { + entities.add(setEntityStartEnd(new TLRPC.TL_messageEntityStrike(), start, end)); + } else if (span instanceof ParsedSpan) { + ParsedSpan parsedSpan = (ParsedSpan) span; + if (parsedSpan.type == TYPE_SPOILER) { + entities.add(setEntityStartEnd(new TLRPC.TL_messageEntitySpoiler(), start, end)); + } else if (parsedSpan.type == TYPE_MONO) { + entities.add(setEntityStartEnd(new TLRPC.TL_messageEntityPre(), start, end)); + } + } else if (span instanceof AnimatedEmojiSpan) { + TLRPC.TL_messageEntityCustomEmoji entity = new TLRPC.TL_messageEntityCustomEmoji(); + entity.document_id = ((AnimatedEmojiSpan) span).documentId; + entity.document = ((AnimatedEmojiSpan) span).document; + entities.add(setEntityStartEnd(entity, start, end)); + } + } + + SpannableString spannable = new SpannableString(spanned.toString()); + MediaDataController.addTextStyleRuns(entities, spannable, spannable); + for (int i = 0; i < spans.length; ++i) { + Object span = spans[i]; + if (span instanceof URLSpan) { + int start = spanned.getSpanStart(span); + int end = spanned.getSpanEnd(span); + String text = spanned.subSequence(start, end).toString(); + String url = ((URLSpan) span).getURL(); + if (text.equals(url)) { + spannable.setSpan(new URLSpan(url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else { + spannable.setSpan(new URLSpanReplacement(url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + MediaDataController.addAnimatedEmojiSpans(entities, spannable, null); + return spannable; + } + + private static TLRPC.MessageEntity setEntityStartEnd(TLRPC.MessageEntity entity, int spanStart, int spanEnd) { + entity.offset = spanStart; + entity.length = spanEnd - spanStart; + return entity; + } + + public static class HTMLTagAttributesHandler implements Html.TagHandler, ContentHandler { + public interface TagHandler { + boolean handleTag(boolean opening, String tag, Editable output, Attributes attributes); + } + + public static String getValue(Attributes attributes, String name) { + for (int i = 0, n = attributes.getLength(); i < n; ++i) { + if (name.equals(attributes.getLocalName(i))) { + return attributes.getValue(i); + } + } + return null; + } + + private final TagHandler handler; + private ContentHandler wrapped; + private Editable text; + private ArrayDeque tagStatus = new ArrayDeque<>(); + + private HTMLTagAttributesHandler(TagHandler handler) { + this.handler = handler; + } + + @Override + public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { + if (wrapped == null) { + text = output; + wrapped = xmlReader.getContentHandler(); + xmlReader.setContentHandler(this); + tagStatus.addLast(Boolean.FALSE); + } + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + boolean isHandled = handler.handleTag(true, localName, text, attributes); + tagStatus.addLast(isHandled); + if (!isHandled) { + wrapped.startElement(uri, localName, qName, attributes); + } + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (!tagStatus.removeLast()) { + wrapped.endElement(uri, localName, qName); + } + handler.handleTag(false, localName, text, null); + } + + @Override + public void setDocumentLocator(Locator locator) { + wrapped.setDocumentLocator(locator); + } + + @Override + public void startDocument() throws SAXException { + wrapped.startDocument(); + } + + @Override + public void endDocument() throws SAXException { + wrapped.endDocument(); + } + + @Override + public void startPrefixMapping(String prefix, String uri) throws SAXException { + wrapped.startPrefixMapping(prefix, uri); + } + + @Override + public void endPrefixMapping(String prefix) throws SAXException { + wrapped.endPrefixMapping(prefix); + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + wrapped.characters(ch, start, length); + } + + @Override + public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { + wrapped.ignorableWhitespace(ch, start, length); + } + + @Override + public void processingInstruction(String target, String data) throws SAXException { + wrapped.processingInstruction(target, data); + } + + @Override + public void skippedEntity(String name) throws SAXException { + wrapped.skippedEntity(name); + } + } + + private static class HTMLTagHandler implements HTMLTagAttributesHandler.TagHandler { + + @Override + public boolean handleTag(boolean opening, String tag, Editable output, Attributes attributes) { + if (tag.startsWith("animated-emoji")) { + if (opening) { + String documentIdString = HTMLTagAttributesHandler.getValue(attributes, "data-document-id"); + if (documentIdString != null) { + long documentId = Long.parseLong(documentIdString); + output.setSpan(new AnimatedEmojiSpan(documentId, null), output.length(), output.length(), Spanned.SPAN_MARK_MARK); + return true; + } + } else { + AnimatedEmojiSpan obj = getLast(output, AnimatedEmojiSpan.class); + if (obj != null) { + int where = output.getSpanStart(obj); + output.removeSpan(obj); + if (where != output.length()) { + output.setSpan(obj, where, output.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + return true; + } + } + } else if (tag.equals("spoiler")) { + if (opening) { + output.setSpan(new ParsedSpan(TYPE_SPOILER), output.length(), output.length(), Spanned.SPAN_MARK_MARK); + return true; + } else { + ParsedSpan obj = getLast(output, ParsedSpan.class, TYPE_SPOILER); + if (obj != null) { + int where = output.getSpanStart(obj); + output.removeSpan(obj); + if (where != output.length()) { + output.setSpan(obj, where, output.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + return true; + } + } + } else if (tag.equals("pre")) { + if (opening) { + output.setSpan(new ParsedSpan(TYPE_MONO), output.length(), output.length(), Spanned.SPAN_MARK_MARK); + return true; + } else { + ParsedSpan obj = getLast(output, ParsedSpan.class, TYPE_MONO); + if (obj != null) { + int where = output.getSpanStart(obj); + output.removeSpan(obj); + if (where != output.length()) { + output.setSpan(obj, where, output.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + return true; + } + } + } + return false; + } + + private T getLast(Editable text, Class kind) { + T[] objs = text.getSpans(0, text.length(), kind); + if (objs.length == 0) { + return null; + } else { + for (int i = objs.length; i > 0; i--) { + if (text.getSpanFlags(objs[i - 1]) == Spannable.SPAN_MARK_MARK) { + return objs[i - 1]; + } + } + return null; + } + } + + private T getLast(Editable text, Class kind, int type) { + T[] objs = text.getSpans(0, text.length(), kind); + if (objs.length == 0) { + return null; + } else { + for (int i = objs.length; i > 0; i--) { + if (text.getSpanFlags(objs[i - 1]) == Spannable.SPAN_MARK_MARK && objs[i - 1].type == type) { + return objs[i - 1]; + } + } + return null; + } + } + } + + private static class ParsedSpan { + final int type; + + private ParsedSpan(int type) { + this.type = type; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/utils/CustomHtml.java b/TMessagesProj/src/main/java/org/telegram/messenger/utils/CustomHtml.java new file mode 100644 index 000000000..61d999e81 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/utils/CustomHtml.java @@ -0,0 +1,219 @@ +package org.telegram.messenger.utils; + +import android.text.Spanned; + +import org.telegram.ui.Components.AnimatedEmojiSpan; +import org.telegram.ui.Components.TextStyleSpan; +import org.telegram.ui.Components.URLSpanMono; +import org.telegram.ui.Components.URLSpanReplacement; + +public class CustomHtml { + + + private CustomHtml() { } + + public static String toHtml(Spanned text) { + StringBuilder out = new StringBuilder(); + toHTML_1_wrapTextStyle(out, text, 0, text.length()); + return out.toString(); + } + + private static void toHTML_1_wrapTextStyle(StringBuilder out, Spanned text, int start, int end) { + int next; + for (int i = start; i < end; i = next) { + next = text.nextSpanTransition(i, end, TextStyleSpan.class); + if (next < 0) { + next = end; + } + TextStyleSpan[] spans = text.getSpans(i, next, TextStyleSpan.class); + + if (spans != null) { + for (int j = 0; j < spans.length; ++j) { + Object spanObject = spans[j]; + if (spanObject != null) { + TextStyleSpan span = (TextStyleSpan) spanObject; + int flags = span.getStyleFlags(); + if ((flags & (TextStyleSpan.FLAG_STYLE_SPOILER | TextStyleSpan.FLAG_STYLE_SPOILER_REVEALED)) > 0) { + out.append(""); + } + if ((flags & TextStyleSpan.FLAG_STYLE_BOLD) > 0) { + out.append(""); + } + if ((flags & TextStyleSpan.FLAG_STYLE_ITALIC) > 0) { + out.append(""); + } + if ((flags & TextStyleSpan.FLAG_STYLE_UNDERLINE) > 0) { + out.append(""); + } + if ((flags & TextStyleSpan.FLAG_STYLE_STRIKE) > 0) { + out.append(""); + } + if ((flags & TextStyleSpan.FLAG_STYLE_URL) > 0) { + if (span.getTextStyleRun() != null && span.getTextStyleRun().urlEntity != null) { + out.append(""); + } + } + } else if (spanObject instanceof URLSpanMono) { + out.append("
");
+                    }
+                }
+            }
+
+            toHTML_2_wrapURLReplacements(out, text, i, next);
+
+            if (spans != null) {
+                for (int j = 0; j < spans.length; ++j) {
+                    TextStyleSpan spanObject = spans[j];
+                    if (spanObject != null) {
+                        TextStyleSpan span = (TextStyleSpan) spanObject;
+                        int flags = span.getStyleFlags();
+                        if ((flags & TextStyleSpan.FLAG_STYLE_URL) > 0 && span.getTextStyleRun() != null && span.getTextStyleRun().urlEntity != null) {
+                            out.append("");
+                        }
+                        if ((flags & TextStyleSpan.FLAG_STYLE_STRIKE) > 0) {
+                            out.append("");
+                        }
+                        if ((flags & TextStyleSpan.FLAG_STYLE_UNDERLINE) > 0) {
+                            out.append("");
+                        }
+                        if ((flags & TextStyleSpan.FLAG_STYLE_ITALIC) > 0) {
+                            out.append("");
+                        }
+                        if ((flags & TextStyleSpan.FLAG_STYLE_BOLD) > 0) {
+                            out.append("");
+                        }
+                        if ((flags & (TextStyleSpan.FLAG_STYLE_SPOILER | TextStyleSpan.FLAG_STYLE_SPOILER_REVEALED)) > 0) {
+                            out.append("");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private static void toHTML_2_wrapURLReplacements(StringBuilder out, Spanned text, int start, int end) {
+        int next;
+        for (int i = start; i < end; i = next) {
+            next = text.nextSpanTransition(i, end, URLSpanReplacement .class);
+            if (next < 0) {
+                next = end;
+            }
+            URLSpanReplacement[] spans = text.getSpans(i, next, URLSpanReplacement.class);
+
+            if (spans != null) {
+                for (int j = 0; j < spans.length; ++j) {
+                    URLSpanReplacement span = spans[j];
+                    out.append("");
+                }
+            }
+
+            toHTML_3_wrapMonoscape(out, text, i, next);
+
+            if (spans != null) {
+                for (int j = 0; j < spans.length; ++j) {
+                    out.append("");
+                }
+            }
+        }
+    }
+
+    private static void toHTML_3_wrapMonoscape(StringBuilder out, Spanned text, int start, int end) {
+
+        int next;
+        for (int i = start; i < end; i = next) {
+            next = text.nextSpanTransition(i, end, URLSpanMono.class);
+            if (next < 0) {
+                next = end;
+            }
+            URLSpanMono[] spans = text.getSpans(i, next, URLSpanMono.class);
+
+            if (spans != null) {
+                for (int j = 0; j < spans.length; ++j) {
+                    URLSpanMono span = spans[j];
+                    if (span != null) {
+                        out.append("
");
+                    }
+                }
+            }
+
+            toHTML_4_wrapAnimatedEmoji(out, text, i, next);
+            if (spans != null) {
+                for (int j = 0; j < spans.length; ++j) {
+                    URLSpanMono span = spans[j];
+                    if (span != null) {
+                        out.append("
"); + } + } + } + } + + + } + + private static void toHTML_4_wrapAnimatedEmoji(StringBuilder out, Spanned text, int start, int end) { + int next; + for (int i = start; i < end; i = next) { + next = text.nextSpanTransition(i, end, AnimatedEmojiSpan.class); + if (next < 0) { + next = end; + } + AnimatedEmojiSpan[] spans = text.getSpans(i, next, AnimatedEmojiSpan.class); + + if (spans != null) { + for (int j = 0; j < spans.length; ++j) { + AnimatedEmojiSpan span = spans[j]; + if (span != null && !span.standard) { + out.append(""); + } + } + } + + toHTML_5_withinStyle(out, text, i, next); + + if (spans != null) { + for (int j = 0; j < spans.length; ++j) { + AnimatedEmojiSpan span = spans[j]; + if (span != null && !span.standard) { + out.append(""); + } + } + } + } + } + + private static void toHTML_5_withinStyle(StringBuilder out, CharSequence text, int start, int end) { + for (int i = start; i < end; i++) { + char c = text.charAt(i); + + if (c == '\n') { + out.append("
"); + } else if (c == '<') { + out.append("<"); + } else if (c == '>') { + out.append(">"); + } else if (c == '&') { + out.append("&"); + } else if (c >= 0xD800 && c <= 0xDFFF) { + if (c < 0xDC00 && i + 1 < end) { + char d = text.charAt(i + 1); + if (d >= 0xDC00 && d <= 0xDFFF) { + i++; + int codepoint = 0x010000 | (int) c - 0xD800 << 10 | (int) d - 0xDC00; + out.append("&#").append(codepoint).append(";"); + } + } + } else if (c > 0x7E || c < ' ') { + out.append("&#").append((int) c).append(";"); + } else if (c == ' ') { + while (i + 1 < end && text.charAt(i + 1) == ' ') { + out.append(" "); + i++; + } + + out.append(' '); + } else { + out.append(c); + } + } + } +} 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 9445351e3..c371c8aef 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/video/TextureRenderer.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/TextureRenderer.java @@ -633,7 +633,7 @@ public class TextureRenderer { entity.ptr = RLottieDrawable.create(entity.text, null, 512, 512, entity.metadata, false, null, false, 0); entity.framesPerDraw = entity.metadata[1] / videoFps; } else if ((entity.subType & 4) != 0) { - entity.animatedFileDrawable = new AnimatedFileDrawable(new File(entity.text), true, 0, null, null, null, 0, UserConfig.selectedAccount, true, 512, 512); + entity.animatedFileDrawable = new AnimatedFileDrawable(new File(entity.text), true, 0, null, null, null, 0, UserConfig.selectedAccount, true, 512, 512, null); entity.framesPerDraw = videoFps / 30f; entity.currentFrame = 0; } else { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java index 0d891f8f5..28bc473e1 100755 --- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java @@ -80,13 +80,10 @@ import android.widget.Toast; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.util.Log; - import org.json.JSONObject; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; @@ -3911,7 +3908,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa .setSmallIcon(R.drawable.notification) .setSubText(subText) .setContentIntent(PendingIntent.getActivity(this, 0, intent, 0)); - Uri soundProviderUri = Uri.parse("content://" + BuildConfig.APPLICATION_ID + ".call_sound_provider/start_ringing"); + Uri soundProviderUri = Uri.parse("content://" + ApplicationLoader.getApplicationId() + ".call_sound_provider/start_ringing"); if (Build.VERSION.SDK_INT >= 26) { SharedPreferences nprefs = MessagesController.getGlobalNotificationsSettings(); int chanIndex = nprefs.getInt("calls_notification_channel", 0); diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java index cb976d91e..d9b277520 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java @@ -25,6 +25,7 @@ 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.SharedConfig; import org.telegram.messenger.StatsController; import org.telegram.messenger.UserConfig; @@ -226,11 +227,15 @@ public class ConnectionsManager extends BaseController { private String getRegId() { String pushString = SharedConfig.pushString; + if (!TextUtils.isEmpty(pushString) && SharedConfig.pushType == PushListenerController.PUSH_TYPE_HUAWEI) { + pushString = "huawei://" + pushString; + } if (TextUtils.isEmpty(pushString) && !TextUtils.isEmpty(SharedConfig.pushStringStatus)) { pushString = SharedConfig.pushStringStatus; } if (TextUtils.isEmpty(pushString)) { - pushString = SharedConfig.pushStringStatus = "__FIREBASE_GENERATING_SINCE_" + getCurrentTime() + "__"; + String tag = SharedConfig.pushType == PushListenerController.PUSH_TYPE_FIREBASE ? "FIREBASE" : "HUAWEI"; + pushString = SharedConfig.pushStringStatus = "__" + tag + "_GENERATING_SINCE_" + getCurrentTime() + "__"; } return pushString; } @@ -421,13 +426,17 @@ public class ConnectionsManager extends BaseController { } } - public static void setRegId(String regId, String status) { + public static void setRegId(String regId, @PushListenerController.PushType int type, String status) { String pushString = regId; + if (!TextUtils.isEmpty(pushString) && type == PushListenerController.PUSH_TYPE_HUAWEI) { + pushString = "huawei://" + pushString; + } if (TextUtils.isEmpty(pushString) && !TextUtils.isEmpty(status)) { pushString = status; } if (TextUtils.isEmpty(pushString)) { - pushString = SharedConfig.pushStringStatus = "__FIREBASE_GENERATING_SINCE_" + getInstance(0).getCurrentTime() + "__"; + String tag = type == PushListenerController.PUSH_TYPE_FIREBASE ? "FIREBASE" : "HUAWEI"; + pushString = SharedConfig.pushStringStatus = "__" + tag + "_GENERATING_SINCE_" + getInstance(0).getCurrentTime() + "__"; } for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { native_setRegId(a, pushString); diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java index 6c49bd186..c903db4d6 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java @@ -66,7 +66,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 = 143; + public static final int LAYER = 144; public static class TL_stats_megagroupStats extends TLObject { public static int constructor = 0xef7ff916; @@ -1051,6 +1051,53 @@ public class TLRPC { } } + public static class TL_premiumGiftOption extends TLObject { + public static int constructor = 0x74c34319; + + public int flags; + public int months; + public String currency; + public long amount; + public String bot_url; + public String store_product; + + public static TL_premiumGiftOption TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_premiumGiftOption.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_premiumGiftOption", constructor)); + } else { + return null; + } + } + TL_premiumGiftOption result = new TL_premiumGiftOption(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + months = stream.readInt32(exception); + currency = stream.readString(exception); + amount = stream.readInt64(exception); + bot_url = stream.readString(exception); + if ((flags & 1) != 0) { + store_product = stream.readString(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeInt32(months); + stream.writeString(currency); + stream.writeInt64(amount); + stream.writeString(bot_url); + if ((flags & 1) != 0) { + stream.writeString(store_product); + } + } + } + public static class TL_error extends TLObject { public static int constructor = 0xc4b9f9bb; @@ -1328,6 +1375,9 @@ public class TLRPC { case 0x9852f9c6: result = new TL_documentAttributeAudio(); break; + case 0xfd149899: + result = new TL_documentAttributeCustomEmoji(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in DocumentAttribute", constructor)); @@ -1564,6 +1614,27 @@ public class TLRPC { } } + public static class TL_documentAttributeCustomEmoji extends DocumentAttribute { + public static int constructor = 0xfd149899; + + public boolean free; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + free = (flags & 1) != 0; + alt = stream.readString(exception); + stickerset = InputStickerSet.TLdeserialize(stream, stream.readInt32(exception), exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = free ? (flags | 1) : (flags &~ 1); + stream.writeInt32(flags); + stream.writeString(alt); + stickerset.serializeToStream(stream); + } + } + public static class TL_textPhone extends RichText { public static int constructor = 0x1ccb966a; @@ -2756,6 +2827,7 @@ public class TLRPC { public int count; public int next_rate; public int offset_id_offset; + public ArrayList animatedEmoji; public static messages_Messages TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { messages_Messages result = null; @@ -3092,12 +3164,11 @@ public class TLRPC { } public static class TL_payments_paymentForm extends TLObject { - public static int constructor = 0xb0133b37; + public static int constructor = 0xa0058751; public int flags; public boolean can_save_credentials; public boolean password_missing; - public boolean test; public long form_id; public long bot_id; public String title; @@ -3108,8 +3179,9 @@ public class TLRPC { public String url; public String native_provider; public TL_dataJSON native_params; + public ArrayList additional_methods = new ArrayList<>(); public TL_paymentRequestedInfo saved_info; - public TL_paymentSavedCredentialsCard saved_credentials; + public ArrayList saved_credentials = new ArrayList<>(); public ArrayList users = new ArrayList<>(); public static TL_payments_paymentForm TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -3129,7 +3201,6 @@ public class TLRPC { flags = stream.readInt32(exception); can_save_credentials = (flags & 4) != 0; password_missing = (flags & 8) != 0; - test = (flags & 64) != 0; form_id = stream.readInt64(exception); bot_id = stream.readInt64(exception); title = stream.readString(exception); @@ -3146,11 +3217,42 @@ public class TLRPC { if ((flags & 16) != 0) { native_params = TL_dataJSON.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 a = 0; a < count; a++) { + TL_paymentFormMethod object = TL_paymentFormMethod.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + additional_methods.add(object); + } + } if ((flags & 1) != 0) { saved_info = TL_paymentRequestedInfo.TLdeserialize(stream, stream.readInt32(exception), exception); } if ((flags & 2) != 0) { - saved_credentials = TL_paymentSavedCredentialsCard.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_paymentSavedCredentialsCard object = TL_paymentSavedCredentialsCard.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + saved_credentials.add(object); + } } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { @@ -3173,7 +3275,6 @@ public class TLRPC { stream.writeInt32(constructor); flags = can_save_credentials ? (flags | 4) : (flags &~ 4); flags = password_missing ? (flags | 8) : (flags &~ 8); - flags = test ? (flags | 64) : (flags &~ 64); stream.writeInt32(flags); stream.writeInt64(form_id); stream.writeInt64(bot_id); @@ -3191,11 +3292,24 @@ public class TLRPC { if ((flags & 16) != 0) { native_params.serializeToStream(stream); } + if ((flags & 64) != 0) { + stream.writeInt32(0x1cb5c415); + int count = additional_methods.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + additional_methods.get(a).serializeToStream(stream); + } + } if ((flags & 1) != 0) { saved_info.serializeToStream(stream); } if ((flags & 2) != 0) { - saved_credentials.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = saved_credentials.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + saved_credentials.get(a).serializeToStream(stream); + } } stream.writeInt32(0x1cb5c415); int count = users.size(); @@ -3206,6 +3320,37 @@ public class TLRPC { } } + public static class TL_paymentFormMethod extends TLObject { + public static int constructor = 0x88f8f21b; + + public String url; + public String title; + + public static TL_paymentFormMethod TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_paymentFormMethod.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_PaymentFormMethod", constructor)); + } else { + return null; + } + } + TL_paymentFormMethod result = new TL_paymentFormMethod(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + url = stream.readString(exception); + title = stream.readString(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(url); + stream.writeString(title); + } + } + public static abstract class ContactLink_layer101 extends TLObject { public static ContactLink_layer101 TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -5036,6 +5181,9 @@ public class TLRPC { case 0x42ffd42b: result = new TL_privacyKeyAddedByPhone(); break; + case 0x697f414: + result = new TL_privacyKeyVoiceMessages(); + break; case 0x3d662b7b: result = new TL_privacyKeyPhoneCall(); break; @@ -5104,6 +5252,15 @@ public class TLRPC { } } + public static class TL_privacyKeyVoiceMessages extends PrivacyKey { + public static int constructor = 0x697f414; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_privacyKeyForwards extends PrivacyKey { public static int constructor = 0x69ec56a3; @@ -10603,6 +10760,9 @@ public class TLRPC { case 0xd1219bdd: result = new TL_inputPrivacyKeyAddedByPhone(); break; + case 0xaee69d68: + result = new TL_inputPrivacyKeyVoiceMessages(); + break; case 0xdb9e70d2: result = new TL_inputPrivacyKeyPhoneP2P(); break; @@ -10671,6 +10831,15 @@ public class TLRPC { } } + public static class TL_inputPrivacyKeyVoiceMessages extends InputPrivacyKey { + public static int constructor = 0xaee69d68; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_inputPrivacyKeyProfilePhoto extends InputPrivacyKey { public static int constructor = 0x5719bacc; @@ -22059,11 +22228,13 @@ public class TLRPC { public boolean recurring_init; public boolean recurring_used; public String currency; + public long amount; public long total_amount; public String invoice_slug; public long game_id; public int score; public boolean video; + public int months; public static MessageAction TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { MessageAction result = null; @@ -22209,6 +22380,9 @@ public class TLRPC { case 0x8f31b327: result = new TL_messageActionPaymentSentMe(); break; + case 0xaba0f5c6: + result = new TL_messageActionGiftPremium(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in MessageAction", constructor)); @@ -23001,6 +23175,23 @@ public class TLRPC { } } + public static class TL_messageActionGiftPremium extends MessageAction { + public static int constructor = 0xaba0f5c6; + + public void readParams(AbstractSerializedData stream, boolean exception) { + currency = stream.readString(exception); + amount = stream.readInt64(exception); + months = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(currency); + stream.writeInt64(amount); + stream.writeInt32(months); + } + } + public static class TL_messageActionPaymentSentMe extends MessageAction { public static int constructor = 0x8f31b327; @@ -27655,6 +27846,9 @@ public class TLRPC { case 0x3407e51b: result = new TL_stickerSetMultiCovered(); break; + case 0x1aed5ee5: + result = new TL_stickerSetFullCovered(); + break; case 0x6410a5d2: result = new TL_stickerSetCovered(); break; @@ -27704,6 +27898,64 @@ public class TLRPC { } } + public static class TL_stickerSetFullCovered extends StickerSetCovered { + public static int constructor = 0x1aed5ee5; + + public ArrayList packs = new ArrayList<>(); + public ArrayList documents = new ArrayList<>(); + + public void readParams(AbstractSerializedData stream, boolean exception) { + set = StickerSet.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_stickerPack object = TL_stickerPack.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + packs.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++) { + Document object = Document.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + documents.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + set.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = packs.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + packs.get(a).serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + count = documents.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + documents.get(a).serializeToStream(stream); + } + } + } + public static class TL_stickerSetCovered extends StickerSetCovered { public static int constructor = 0x6410a5d2; @@ -27813,6 +28065,9 @@ public class TLRPC { case 0xe67f520e: result = new TL_inputStickerSetDice(); break; + case 0xc88b3b02: + result = new TL_inputStickerSetPremiumGifts(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in InputStickerSet", constructor)); @@ -27824,6 +28079,15 @@ public class TLRPC { } } + public static class TL_inputStickerSetPremiumGifts extends InputStickerSet { + public static int constructor = 0xc88b3b02; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_inputStickerSetDice extends InputStickerSet { public static int constructor = 0xe67f520e; @@ -28562,6 +28826,9 @@ public class TLRPC { case 0xe32f3d77: result = new TL_updateChatParticipantDelete(); break; + case 0xfb4c496c: + result = new TL_updateReadFeaturedEmojiStickers(); + break; case 0xe40370a3: result = new TL_updateEditMessage(); break; @@ -30653,11 +30920,13 @@ public class TLRPC { public int flags; public boolean masks; + public boolean emojis; public ArrayList order = new ArrayList<>(); public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); masks = (flags & 1) != 0; + emojis = (flags & 2) != 0; int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -30674,6 +30943,7 @@ public class TLRPC { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); flags = masks ? (flags | 1) : (flags &~ 1); + flags = emojis ? (flags | 2) : (flags &~ 2); stream.writeInt32(flags); stream.writeInt32(0x1cb5c415); int count = order.size(); @@ -30684,6 +30954,15 @@ public class TLRPC { } } + public static class TL_updateReadFeaturedEmojiStickers extends Update { + public static int constructor = 0xfb4c496c; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_updateReadChannelInbox extends Update { public static int constructor = 0x922e6e10; @@ -31865,7 +32144,7 @@ public class TLRPC { case 0xdc7b1140: result = new TL_messageEntityMentionName(); break; - case 0xd4a00ed5: + case 0xc8cf05f8: result = new TL_messageEntityCustomEmoji(); break; } @@ -40692,6 +40971,8 @@ public class TLRPC { public boolean official; public boolean animated; public boolean masks; + public boolean videos; + public boolean emojis; public long id; public long access_hash; public String title; @@ -40702,6 +40983,7 @@ public class TLRPC { public ArrayList thumbs = new ArrayList<>(); public int thumb_dc_id; public int thumb_version; + public long thumb_document_id; public boolean gifs; public static StickerSet TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -40726,6 +41008,9 @@ public class TLRPC { result = new TL_stickerSet_layer75(); break; case 0xd7df217a: + result = new TL_stickerSet_layer143(); + break; + case 0x2dd14edc: result = new TL_stickerSet(); break; } @@ -40760,7 +41045,7 @@ public class TLRPC { } public static class TL_stickerSet extends StickerSet { - public static int constructor = 0xd7df217a; + public static int constructor = 0x2dd14edc; public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); @@ -40768,7 +41053,8 @@ public class TLRPC { official = (flags & 4) != 0; masks = (flags & 8) != 0; animated = (flags & 32) != 0; - gifs = (flags & 64) != 0; + videos = (flags & 64) != 0; + emojis = (flags & 128) != 0; if ((flags & 1) != 0) { installed_date = stream.readInt32(exception); } @@ -40799,6 +41085,9 @@ public class TLRPC { if ((flags & 16) != 0) { thumb_version = stream.readInt32(exception); } + if ((flags & 256) != 0) { + thumb_document_id = stream.readInt64(exception); + } count = stream.readInt32(exception); hash = stream.readInt32(exception); } @@ -40809,7 +41098,8 @@ public class TLRPC { flags = official ? (flags | 4) : (flags &~ 4); flags = masks ? (flags | 8) : (flags &~ 8); flags = animated ? (flags | 32) : (flags &~ 32); - flags = gifs ? (flags | 64) : (flags &~ 64); + flags = videos ? (flags | 64) : (flags &~ 64); + flags = emojis ? (flags | 128) : (flags &~ 128); stream.writeInt32(flags); if ((flags & 1) != 0) { stream.writeInt32(installed_date); @@ -40832,6 +41122,95 @@ public class TLRPC { if ((flags & 16) != 0) { stream.writeInt32(thumb_version); } + if ((flags & 256) != 0) { + stream.writeInt64(thumb_document_id); + } + stream.writeInt32(count); + stream.writeInt32(hash); + } + } + + public static class TL_stickerSet_layer143 extends TL_stickerSet { + public static int constructor = 0xd7df217a; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + 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); + } + id = stream.readInt64(exception); + access_hash = stream.readInt64(exception); + title = stream.readString(exception); + short_name = stream.readString(exception); + 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 a = 0; a < count; a++) { + PhotoSize object = PhotoSize.TLdeserialize(0, 0, id, stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + thumbs.add(object); + } + } + if ((flags & 16) != 0) { + thumb_dc_id = stream.readInt32(exception); + } + if ((flags & 16) != 0) { + thumb_version = stream.readInt32(exception); + } + if ((flags & 256) != 0) { + thumb_document_id = stream.readInt64(exception); + } + count = stream.readInt32(exception); + hash = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + 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) { + stream.writeInt32(installed_date); + } + stream.writeInt64(id); + stream.writeInt64(access_hash); + stream.writeString(title); + stream.writeString(short_name); + if ((flags & 16) != 0) { + stream.writeInt32(0x1cb5c415); + int count = thumbs.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + thumbs.get(a).serializeToStream(stream); + } + } + if ((flags & 16) != 0) { + stream.writeInt32(thumb_dc_id); + } + if ((flags & 16) != 0) { + stream.writeInt32(thumb_version); + } + if ((flags & 256) != 0) { + stream.writeInt64(thumb_document_id); + } stream.writeInt32(count); stream.writeInt32(hash); } @@ -43149,6 +43528,7 @@ public class TLRPC { public boolean can_pin_message; public boolean has_scheduled; public boolean video_calls_available; + public boolean voice_messages_forbidden; public User user; public String about; public TL_contacts_link_layer101 link; @@ -43165,13 +43545,17 @@ public class TLRPC { public String private_forward_name; public TL_chatAdminRights bot_group_admin_rights; public TL_chatAdminRights bot_broadcast_admin_rights; + public ArrayList premium_gifts = new ArrayList<>(); public static UserFull TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { UserFull result = null; switch (constructor) { - case 0x8c72ea81: + case 0xc4b1fc3f: result = new TL_userFull(); break; + case 0x8c72ea81: + result = new TL_userFull_layer143(); + break; case 0xcf366521: result = new TL_userFull_layer139(); break; @@ -43202,6 +43586,126 @@ public class TLRPC { } public static class TL_userFull extends UserFull { + public static int constructor = 0xc4b1fc3f; + + 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; + id = stream.readInt64(exception); + if ((flags & 2) != 0) { + about = stream.readString(exception); + } + settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 4) != 0) { + profile_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); + } + } + } + + 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); + stream.writeInt32(flags); + stream.writeInt64(id); + if ((flags & 2) != 0) { + stream.writeString(about); + } + settings.serializeToStream(stream); + if ((flags & 4) != 0) { + profile_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); + } + } + } + } + + public static class TL_userFull_layer143 extends TL_userFull { public static int constructor = 0x8c72ea81; public void readParams(AbstractSerializedData stream, boolean exception) { @@ -50200,6 +50704,7 @@ public class TLRPC { public int flags; public boolean masks; + public boolean emojis; public long offset_id; public int limit; @@ -50210,6 +50715,7 @@ public class TLRPC { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); flags = masks ? (flags | 1) : (flags &~ 1); + flags = emojis ? (flags | 2) : (flags &~ 2); stream.writeInt32(flags); stream.writeInt64(offset_id); stream.writeInt32(limit); @@ -52174,6 +52680,7 @@ public class TLRPC { public int flags; public boolean masks; + public boolean emojis; public ArrayList order = new ArrayList<>(); public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { @@ -52183,6 +52690,7 @@ public class TLRPC { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); flags = masks ? (flags | 1) : (flags &~ 1); + flags = emojis ? (flags | 2) : (flags &~ 2); stream.writeInt32(flags); stream.writeInt32(0x1cb5c415); int count = order.size(); @@ -52193,6 +52701,36 @@ public class TLRPC { } } + public static class TL_messages_getEmojiStickers extends TLObject { + public static int constructor = 0xfbfca18f; + + public long hash; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_AllStickers.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(hash); + } + } + + public static class TL_messages_getFeaturedEmojiStickers extends TLObject { + public static int constructor = 0xecf6736; + + public long hash; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_FeaturedStickers.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(hash); + } + } + public static class TL_messages_getDocumentByHash extends TLObject { public static int constructor = 0x338e2464; @@ -52933,6 +53471,8 @@ 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; public String short_name; @@ -52941,13 +53481,15 @@ public class TLRPC { public String software; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_messages_stickerSet.TLdeserialize(stream, constructor, exception); + return messages_StickerSet.TLdeserialize(stream, constructor, exception); } 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); stream.writeString(title); @@ -53900,17 +54442,80 @@ public class TLRPC { } public static class TL_payments_assignPlayMarketTransaction extends TLObject { - public static int constructor = 0x4faa4aed; + public static int constructor = 0xdffd50d3; - public String purchase_token; + public TL_dataJSON receipt; + public InputStorePaymentPurpose purpose; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_updates.TLdeserialize(stream, constructor, exception); + return Updates.TLdeserialize(stream, constructor, exception); } public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); - stream.writeString(purchase_token); + receipt.serializeToStream(stream); + purpose.serializeToStream(stream); + } + } + + public static abstract class InputStorePaymentPurpose extends TLObject { + + public static InputStorePaymentPurpose TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + InputStorePaymentPurpose result = null; + switch (constructor) { + case 0xa6751e66: + result = new TL_inputStorePaymentPremiumSubscription(); + break; + case 0x44618a7d: + result = new TL_inputStorePaymentGiftPremium(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in InputStorePaymentPurpose", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_inputStorePaymentPremiumSubscription extends InputStorePaymentPurpose { + public static int constructor = 0xa6751e66; + + public int flags; + public boolean restore; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + restore = (flags & 1) != 0; + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = restore ? (flags | 1) : (flags &~ 1); + stream.writeInt32(flags); + } + } + + public static class TL_inputStorePaymentGiftPremium extends InputStorePaymentPurpose { + public static int constructor = 0x616f7fe8; + + public InputUser user_id; + public String currency; + public long amount; + + public void readParams(AbstractSerializedData stream, boolean exception) { + user_id = InputUser.TLdeserialize(stream, stream.readInt32(exception), exception); + currency = stream.readString(exception); + amount = stream.readInt64(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + user_id.serializeToStream(stream); + stream.writeString(currency); + stream.writeInt64(amount); } } @@ -55114,7 +55719,7 @@ public class TLRPC { break; } if (result == null && exception) { - throw new RuntimeException(String.format("can't parse magic %x in Message", constructor)); + throw new RuntimeException(String.format("can't parse magic %x in Message", constructor)); } if (result != null) { result.readParams(stream, exception); @@ -60253,24 +60858,10 @@ public class TLRPC { } } - public static class TL_payments_restorePlayMarketReceipt extends TLObject { - public static int constructor = 0xd164e36a; - - public byte[] receipt; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return Updates.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeByteArray(receipt); - } - } - public static class TL_payments_canPurchasePremium extends TLObject { - public static int constructor = 0xaa6a90c8; + public static int constructor = 0x9fc19eb6; + public InputStorePaymentPurpose purpose; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { return Bool.TLdeserialize(stream, constructor, exception); @@ -60278,6 +60869,7 @@ public class TLRPC { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); + purpose.serializeToStream(stream); } } @@ -60301,17 +60893,14 @@ public class TLRPC { } public static class TL_messageEntityCustomEmoji extends MessageEntity { - public static int constructor = 0xd4a00ed5; + public static int constructor = 0xc8cf05f8; - public int offset; - public int length; - public InputStickerSet stickerset; public long document_id; + public TLRPC.Document document; //custom public void readParams(AbstractSerializedData stream, boolean exception) { offset = stream.readInt32(exception); length = stream.readInt32(exception); - stickerset = InputStickerSet.TLdeserialize(stream, stream.readInt32(exception), exception); document_id = stream.readInt64(exception); } @@ -60319,10 +60908,38 @@ public class TLRPC { stream.writeInt32(constructor); stream.writeInt32(offset); stream.writeInt32(length); - stickerset.serializeToStream(stream); stream.writeInt64(document_id); } } + + public static class TL_messages_getCustomEmojiDocuments extends TLObject { + public static int constructor = 0xd9ab0f54; + + public ArrayList document_id = new ArrayList<>(); + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + Vector vector = new Vector(); + int size = stream.readInt32(exception); + for (int a = 0; a < size; a++) { + Document object = Document.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return vector; + } + vector.objects.add(object); + } + return vector; + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(0x1cb5c415); + int count = document_id.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + stream.writeInt64(document_id.get(a)); + } + } + } //functions public static class Vector extends TLObject { 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 39acdaec1..7f333c703 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -1977,139 +1977,161 @@ public class ActionBarLayout extends FrameLayout { } public void animateThemedValues(Theme.ThemeInfo theme, int accentId, boolean nightTheme, boolean instant) { - animateThemedValues(new ThemeAnimationSettings(theme, accentId, nightTheme, instant)); + animateThemedValues(new ThemeAnimationSettings(theme, accentId, nightTheme, instant), null); } - public void animateThemedValues(ThemeAnimationSettings settings) { + public void animateThemedValues(Theme.ThemeInfo theme, int accentId, boolean nightTheme, boolean instant, Runnable onDone) { + animateThemedValues(new ThemeAnimationSettings(theme, accentId, nightTheme, instant), onDone); + } + + public void animateThemedValues(ThemeAnimationSettings settings, Runnable onDone) { if (transitionAnimationInProgress || startedTracking) { animateThemeAfterAnimation = true; animateSetThemeAfterAnimation = settings.theme; animateSetThemeNightAfterAnimation = settings.nightTheme; animateSetThemeAccentIdAfterAnimation = settings.accentId; + if (onDone != null) { + onDone.run(); + } return; } if (themeAnimatorSet != null) { themeAnimatorSet.cancel(); themeAnimatorSet = null; } - boolean startAnimation = false; - int fragmentCount = settings.onlyTopFragment ? 1 : fragmentsStack.size(); - for (int i = 0; i < fragmentCount; i++) { - BaseFragment fragment; - if (i == 0) { - fragment = getLastFragment(); - } else { - if (!inPreviewMode && !transitionAnimationPreviewMode || fragmentsStack.size() <= 1) { - continue; - } - fragment = fragmentsStack.get(fragmentsStack.size() - 2); - } - if (fragment != null) { - startAnimation = true; - if (settings.resourcesProvider != null) { - if (messageDrawableOutStart == null) { - messageDrawableOutStart = new Theme.MessageDrawable(Theme.MessageDrawable.TYPE_TEXT, true, false, startColorsProvider); - messageDrawableOutStart.isCrossfadeBackground = true; - messageDrawableOutMediaStart = new Theme.MessageDrawable(Theme.MessageDrawable.TYPE_MEDIA, true, false, startColorsProvider); - messageDrawableOutMediaStart.isCrossfadeBackground = true; - } - startColorsProvider.saveColors(settings.resourcesProvider); - } - ArrayList descriptions = fragment.getThemeDescriptions(); - addStartDescriptions(descriptions); - if (fragment.visibleDialog instanceof BottomSheet) { - BottomSheet sheet = (BottomSheet) fragment.visibleDialog; - addStartDescriptions(sheet.getThemeDescriptions()); - } else if (fragment.visibleDialog instanceof AlertDialog) { - AlertDialog dialog = (AlertDialog) fragment.visibleDialog; - addStartDescriptions(dialog.getThemeDescriptions()); - } + final int fragmentCount = settings.onlyTopFragment ? 1 : fragmentsStack.size(); + Runnable next = () -> { + boolean startAnimation = false; + for (int i = 0; i < fragmentCount; i++) { + BaseFragment fragment; if (i == 0) { - if (settings.applyTheme) { - if (settings.accentId != -1 && settings.theme != null) { - settings.theme.setCurrentAccentId(settings.accentId); - Theme.saveThemeAccents(settings.theme, true, false, true, false); + fragment = getLastFragment(); + } else { + if (!inPreviewMode && !transitionAnimationPreviewMode || fragmentsStack.size() <= 1) { + continue; + } + fragment = fragmentsStack.get(fragmentsStack.size() - 2); + } + if (fragment != null) { + startAnimation = true; + if (settings.resourcesProvider != null) { + if (messageDrawableOutStart == null) { + messageDrawableOutStart = new Theme.MessageDrawable(Theme.MessageDrawable.TYPE_TEXT, true, false, startColorsProvider); + messageDrawableOutStart.isCrossfadeBackground = true; + messageDrawableOutMediaStart = new Theme.MessageDrawable(Theme.MessageDrawable.TYPE_MEDIA, true, false, startColorsProvider); + messageDrawableOutMediaStart.isCrossfadeBackground = true; } - Theme.applyTheme(settings.theme, settings.nightTheme); + startColorsProvider.saveColors(settings.resourcesProvider); } - if (settings.afterStartDescriptionsAddedRunnable != null) { - settings.afterStartDescriptionsAddedRunnable.run(); + ArrayList descriptions = fragment.getThemeDescriptions(); + addStartDescriptions(descriptions); + if (fragment.visibleDialog instanceof BottomSheet) { + BottomSheet sheet = (BottomSheet) fragment.visibleDialog; + addStartDescriptions(sheet.getThemeDescriptions()); + } else if (fragment.visibleDialog instanceof AlertDialog) { + AlertDialog dialog = (AlertDialog) fragment.visibleDialog; + addStartDescriptions(dialog.getThemeDescriptions()); } - } - addEndDescriptions(descriptions); - if (fragment.visibleDialog instanceof BottomSheet) { - addEndDescriptions(((BottomSheet) fragment.visibleDialog).getThemeDescriptions()); - } else if (fragment.visibleDialog instanceof AlertDialog) { - addEndDescriptions(((AlertDialog) fragment.visibleDialog).getThemeDescriptions()); - } - } - } - if (startAnimation) { - if (!settings.onlyTopFragment) { - int count = fragmentsStack.size() - (inPreviewMode || transitionAnimationPreviewMode ? 2 : 1); - for (int a = 0; a < count; a++) { - BaseFragment fragment = fragmentsStack.get(a); - fragment.clearViews(); - fragment.setParentLayout(this); - } - } - if (settings.instant) { - setThemeAnimationValue(1.0f); - themeAnimatorDescriptions.clear(); - animateStartColors.clear(); - animateEndColors.clear(); - themeAnimatorDelegate.clear(); - presentingFragmentDescriptions = null; - if (settings.afterAnimationRunnable != null) { - settings.afterAnimationRunnable.run(); - } - return; - } - Theme.setAnimatingColor(true); - if (settings.beforeAnimationRunnable != null) { - settings.beforeAnimationRunnable.run(); - } - animationProgressListener = settings.animationProgress; - if (animationProgressListener != null) { - animationProgressListener.setProgress(0); - } - themeAnimatorSet = new AnimatorSet(); - themeAnimatorSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (animation.equals(themeAnimatorSet)) { - themeAnimatorDescriptions.clear(); - animateStartColors.clear(); - animateEndColors.clear(); - themeAnimatorDelegate.clear(); - Theme.setAnimatingColor(false); - presentingFragmentDescriptions = null; - themeAnimatorSet = null; - if (settings.afterAnimationRunnable != null) { - settings.afterAnimationRunnable.run(); + if (i == 0) { + if (settings.afterStartDescriptionsAddedRunnable != null) { + settings.afterStartDescriptionsAddedRunnable.run(); } } + addEndDescriptions(descriptions); + if (fragment.visibleDialog instanceof BottomSheet) { + addEndDescriptions(((BottomSheet) fragment.visibleDialog).getThemeDescriptions()); + } else if (fragment.visibleDialog instanceof AlertDialog) { + addEndDescriptions(((AlertDialog) fragment.visibleDialog).getThemeDescriptions()); + } } + } + if (startAnimation) { + if (!settings.onlyTopFragment) { + int count = fragmentsStack.size() - (inPreviewMode || transitionAnimationPreviewMode ? 2 : 1); + for (int a = 0; a < count; a++) { + BaseFragment fragment = fragmentsStack.get(a); + fragment.clearViews(); + fragment.setParentLayout(this); + } + } + if (settings.instant) { + setThemeAnimationValue(1.0f); + themeAnimatorDescriptions.clear(); + animateStartColors.clear(); + animateEndColors.clear(); + themeAnimatorDelegate.clear(); + presentingFragmentDescriptions = null; + if (settings.afterAnimationRunnable != null) { + settings.afterAnimationRunnable.run(); + } + if (onDone != null) { + onDone.run(); + } + return; + } + Theme.setAnimatingColor(true); + if (settings.beforeAnimationRunnable != null) { + settings.beforeAnimationRunnable.run(); + } + animationProgressListener = settings.animationProgress; + if (animationProgressListener != null) { + animationProgressListener.setProgress(0); + } + themeAnimatorSet = new AnimatorSet(); + themeAnimatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (animation.equals(themeAnimatorSet)) { + themeAnimatorDescriptions.clear(); + animateStartColors.clear(); + animateEndColors.clear(); + themeAnimatorDelegate.clear(); + Theme.setAnimatingColor(false); + presentingFragmentDescriptions = null; + themeAnimatorSet = null; + if (settings.afterAnimationRunnable != null) { + settings.afterAnimationRunnable.run(); + } + } + } - @Override - public void onAnimationCancel(Animator animation) { - if (animation.equals(themeAnimatorSet)) { - themeAnimatorDescriptions.clear(); - animateStartColors.clear(); - animateEndColors.clear(); - themeAnimatorDelegate.clear(); - Theme.setAnimatingColor(false); - presentingFragmentDescriptions = null; - themeAnimatorSet = null; - if (settings.afterAnimationRunnable != null) { - settings.afterAnimationRunnable.run(); + @Override + public void onAnimationCancel(Animator animation) { + if (animation.equals(themeAnimatorSet)) { + themeAnimatorDescriptions.clear(); + animateStartColors.clear(); + animateEndColors.clear(); + themeAnimatorDelegate.clear(); + Theme.setAnimatingColor(false); + presentingFragmentDescriptions = null; + themeAnimatorSet = null; + if (settings.afterAnimationRunnable != null) { + settings.afterAnimationRunnable.run(); + } } } - } - }); - themeAnimatorSet.playTogether(ObjectAnimator.ofFloat(this, "themeAnimationValue", 0.0f, 1.0f)); - themeAnimatorSet.setDuration(settings.duration); - themeAnimatorSet.start(); + }); + themeAnimatorSet.playTogether(ObjectAnimator.ofFloat(this, "themeAnimationValue", 0.0f, 1.0f)); + themeAnimatorSet.setDuration(settings.duration); + themeAnimatorSet.start(); + } + if (onDone != null) { + onDone.run(); + } + }; + if (fragmentCount >= 1 && settings.applyTheme) { + if (settings.accentId != -1 && settings.theme != null) { + settings.theme.setCurrentAccentId(settings.accentId); + Theme.saveThemeAccents(settings.theme, true, false, true, false); + } + if (onDone == null) { + Theme.applyTheme(settings.theme, settings.nightTheme); + next.run(); + } else { + Theme.applyThemeInBackground(settings.theme, settings.nightTheme, () -> AndroidUtilities.runOnUIThread(next)); + } + } else { + next.run(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BackDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BackDrawable.java index 50a32ab04..029c6e58f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BackDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BackDrawable.java @@ -21,6 +21,7 @@ import org.telegram.messenger.AndroidUtilities; public class BackDrawable extends Drawable { private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint prevPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private boolean reverseAngle; private long lastFrameTime; private boolean animationInProgress; @@ -38,6 +39,9 @@ public class BackDrawable extends Drawable { public BackDrawable(boolean close) { super(); paint.setStrokeWidth(AndroidUtilities.dp(2)); + paint.setStrokeCap(Paint.Cap.ROUND); + prevPaint.setStrokeWidth(AndroidUtilities.dp(2)); + prevPaint.setColor(Color.RED); alwaysClose = close; } @@ -125,11 +129,11 @@ public class BackDrawable extends Drawable { canvas.rotate(135 + currentRotation * (reverseAngle ? -180 : 180)); rotation = 1.0f; } - canvas.drawLine(-AndroidUtilities.dp(7) - AndroidUtilities.dp(1) * rotation, 0, AndroidUtilities.dp(8), 0, paint); - float startYDiff = -AndroidUtilities.dp(0.5f); - float endYDiff = AndroidUtilities.dp(7) + AndroidUtilities.dp(1) * rotation; - float startXDiff = -AndroidUtilities.dp(7.0f) + AndroidUtilities.dp(7.0f) * rotation; - float endXDiff = AndroidUtilities.dp(0.5f) - AndroidUtilities.dp(0.5f) * rotation; + canvas.drawLine(AndroidUtilities.dp(AndroidUtilities.lerp(-6.75f, -8f, rotation)), 0, AndroidUtilities.dp(8) - (paint.getStrokeWidth() / 2f) * (1f - rotation), 0, paint); + float startYDiff = AndroidUtilities.dp(-0.25f); + float endYDiff = AndroidUtilities.dp(AndroidUtilities.lerp(7f, 8f, rotation)) - (paint.getStrokeWidth() / 4f) * (1f - rotation); + float startXDiff = AndroidUtilities.dp(AndroidUtilities.lerp(-7f - 0.25f, 0f, rotation)); + float endXDiff = 0; canvas.drawLine(startXDiff, -startYDiff, endXDiff, -endYDiff, paint); canvas.drawLine(startXDiff, startYDiff, endXDiff, endYDiff, paint); canvas.restore(); @@ -137,12 +141,12 @@ public class BackDrawable extends Drawable { @Override public void setAlpha(int alpha) { - + paint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { - + paint.setColorFilter(cf); } @Override 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 2a5ee6f3c..3305d7a24 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -416,6 +416,10 @@ public abstract class BaseFragment { return null; } + public Context getContext() { + return getParentActivity(); + } + protected void setParentActivityTitle(CharSequence title) { Activity activity = getParentActivity(); if (activity != null) { 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 d0aed7cf4..31cde2bd5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java @@ -16,6 +16,7 @@ import android.animation.ValueAnimator; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Insets; import android.graphics.Paint; @@ -331,7 +332,7 @@ public class BottomSheet extends Dialog { startedTrackingX = (int) ev.getX(); startedTrackingY = (int) ev.getY(); if (startedTrackingY < containerView.getTop() || startedTrackingX < containerView.getLeft() || startedTrackingX > containerView.getRight()) { - dismiss(); + onDismissWithTouchOutside(); return true; } onScrollUpBegin(y); @@ -940,6 +941,14 @@ public class BottomSheet extends Dialog { super.dispatchDraw(canvas); mainContainerDispatchDraw(canvas); } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + lastInsets = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + container.requestApplyInsets(); + } + } }; container.setBackgroundDrawable(backDrawable); focusable = needFocus; @@ -1274,6 +1283,10 @@ public class BottomSheet extends Dialog { return false; } + protected void onDismissWithTouchOutside() { + dismiss(); + } + protected boolean canDismissWithTouchOutside() { return true; } @@ -1525,7 +1538,7 @@ public class BottomSheet extends Dialog { } }); currentSheetAnimation.playTogether( - ObjectAnimator.ofFloat(containerView, View.TRANSLATION_Y, getContainerViewHeight() + container.keyboardHeight + AndroidUtilities.dp(10) + (scrollNavBar ? getBottomInset() : 0)), + containerView == null ? null : ObjectAnimator.ofFloat(containerView, View.TRANSLATION_Y, getContainerViewHeight() + container.keyboardHeight + AndroidUtilities.dp(10) + (scrollNavBar ? getBottomInset() : 0)), ObjectAnimator.ofInt(backDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, 0), navigationBarAnimation ); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java index 2b9d63c66..3d3e1f7f5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java @@ -34,6 +34,7 @@ public class MenuDrawable extends Drawable { private DecelerateInterpolator interpolator = new DecelerateInterpolator(); private int iconColor; private int backColor; + private boolean roundCap; private RectF rect = new RectF(); @@ -171,11 +172,18 @@ public class MenuDrawable extends Drawable { canvas.rotate(currentRotation * (reverseAngle ? -180 : 180), AndroidUtilities.dp(9), 0); paint.setColor(color1); paint.setAlpha(alpha); - canvas.drawLine(0, 0, AndroidUtilities.dp(18) - AndroidUtilities.dp(3.0f) * currentRotation - diffMiddle, 0, paint); + canvas.drawLine((roundCap ? AndroidUtilities.dp(.5f) * currentRotation + (paint.getStrokeWidth() / 2f) * (1f - currentRotation) : 0), 0, AndroidUtilities.dp(18) - AndroidUtilities.dp(3.0f) * currentRotation - diffMiddle - (roundCap ? (paint.getStrokeWidth() / 2f) * (1f - currentRotation) : 0), 0, paint); endYDiff = AndroidUtilities.dp(5) * (1 - Math.abs(currentRotation)) - AndroidUtilities.dp(0.5f) * Math.abs(currentRotation); endXDiff = AndroidUtilities.dp(18) - AndroidUtilities.dp(2.5f) * Math.abs(currentRotation); startYDiff = AndroidUtilities.dp(5) + AndroidUtilities.dp(2.0f) * Math.abs(currentRotation); startXDiff = AndroidUtilities.dp(7.5f) * Math.abs(currentRotation); + if (roundCap) { + startXDiff += (paint.getStrokeWidth() / 2f) * (1f - currentRotation); + endYDiff += AndroidUtilities.dp(.5f) * currentRotation; + endXDiff -= AndroidUtilities.dp(.5f) * currentRotation + (paint.getStrokeWidth() / 2f) * (1f - currentRotation); + startYDiff -= AndroidUtilities.dp(.25f) * currentRotation; + endYDiff += AndroidUtilities.dp(.25f) * currentRotation; + } } else { canvas.rotate(currentRotation * (reverseAngle ? -225 : 135), AndroidUtilities.dp(9), 0); if (miniIcon) { @@ -186,7 +194,6 @@ public class MenuDrawable extends Drawable { endXDiff = AndroidUtilities.dpf2(16) * (1 - Math.abs(currentRotation)) + (AndroidUtilities.dpf2(9)) * Math.abs(currentRotation); startYDiff = AndroidUtilities.dpf2(5) + AndroidUtilities.dpf2(3.0f) * Math.abs(currentRotation); startXDiff = AndroidUtilities.dpf2(2) + AndroidUtilities.dpf2(7) * Math.abs(currentRotation); - } else { int color2 = Theme.getColor(Theme.key_actionBarActionModeDefaultIcon); int backColor2 = Theme.getColor(Theme.key_actionBarActionModeDefault); @@ -314,6 +321,7 @@ public class MenuDrawable extends Drawable { public void setRoundCap() { paint.setStrokeCap(Paint.Cap.ROUND); + roundCap = true; } public void setMiniIcon(boolean miniIcon) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java index 7c246508f..80597aa16 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java @@ -27,7 +27,6 @@ import android.text.SpannableStringBuilder; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -36,6 +35,8 @@ import android.view.accessibility.AccessibilityNodeInfo; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; import org.telegram.ui.Cells.DialogCell; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.EmptyStubSpan; import org.telegram.ui.Components.StaticLayoutEx; import org.telegram.ui.Components.spoilers.SpoilerEffect; @@ -112,6 +113,9 @@ public class SimpleTextView extends View implements Drawable.Callback { private boolean maybeClick; private float touchDownX, touchDownY; + private AnimatedEmojiSpan.EmojiGroupedSpans emojiStack; + private boolean attachedToWindow; + public SimpleTextView(Context context) { super(context); textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); @@ -128,9 +132,18 @@ public class SimpleTextView extends View implements Drawable.Callback { invalidate(); } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + attachedToWindow = true; + emojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, emojiStack, layout); + } + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); + attachedToWindow = false; + AnimatedEmojiSpan.release(this, emojiStack); wasLayout = false; } @@ -334,7 +347,6 @@ public class SimpleTextView extends View implements Drawable.Callback { if (layout != null && layout.getText() instanceof Spannable) { SpoilerEffect.addSpoilers(this, layout, spoilersPool, spoilers); } - calcOffset(width); } catch (Exception ignore) { @@ -344,6 +356,10 @@ public class SimpleTextView extends View implements Drawable.Callback { textWidth = 0; textHeight = 0; } + AnimatedEmojiSpan.release(this, emojiStack); + if (attachedToWindow) { + emojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, emojiStack, layout); + } invalidate(); return true; } @@ -750,17 +766,25 @@ public class SimpleTextView extends View implements Drawable.Callback { canvas.save(); clipOutSpoilers(canvas); + if (emojiStack != null) { + emojiStack.clearPositions(); + } layout.draw(canvas); canvas.restore(); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, layout, emojiStack, 0, null, 0, 0, 0, 1f); drawSpoilers(canvas); canvas.restore(); } else { canvas.save(); clipOutSpoilers(canvas); + if (emojiStack != null) { + emojiStack.clearPositions(); + } layout.draw(canvas); canvas.restore(); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, layout, emojiStack, 0, null, 0, 0, 0, 1f); drawSpoilers(canvas); } } 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 5619f0a53..37b7a8112 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java @@ -47,6 +47,7 @@ import android.graphics.drawable.RippleDrawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.StateListDrawable; import android.graphics.drawable.shapes.OvalShape; +import android.graphics.drawable.shapes.RectShape; import android.graphics.drawable.shapes.RoundRectShape; import android.hardware.Sensor; import android.hardware.SensorEvent; @@ -2926,6 +2927,7 @@ public class Theme { public static TextPaint chat_actionTextPaint; public static TextPaint chat_msgBotButtonPaint; public static TextPaint chat_msgGameTextPaint; + public static TextPaint[] chat_msgTextPaintEmoji; public static TextPaint chat_msgTextPaintOneEmoji; public static TextPaint chat_msgTextPaintTwoEmoji; public static TextPaint chat_msgTextPaintThreeEmoji; @@ -3591,6 +3593,7 @@ public class Theme { public static final String key_chat_emojiPanelShadowLine = "chat_emojiPanelShadowLine"; public static final String key_chat_emojiPanelEmptyText = "chat_emojiPanelEmptyText"; public static final String key_chat_emojiPanelIcon = "chat_emojiPanelIcon"; + public static final String key_chat_emojiPanelIconSelector = "chat_emojiPanelIconSelector"; public static final String key_chat_emojiBottomPanelIcon = "chat_emojiBottomPanelIcon"; public static final String key_chat_emojiPanelIconSelected = "chat_emojiPanelIconSelected"; public static final String key_chat_emojiPanelStickerPackSelector = "chat_emojiPanelStickerPackSelector"; @@ -3864,6 +3867,7 @@ public class Theme { public static final String key_chat_inReactionButtonTextSelected = "chat_inReactionButtonTextSelected"; public static final String key_chat_outReactionButtonTextSelected = "chat_outReactionButtonTextSelected"; + public static final String key_premiumGradient0 = "premiumGradient0"; public static final String key_premiumGradient1 = "premiumGradient1"; public static final String key_premiumGradient2 = "premiumGradient2"; public static final String key_premiumGradient3 = "premiumGradient3"; @@ -4403,8 +4407,9 @@ public class Theme { defaultColors.put(key_chat_emojiPanelShadowLine, 0x12000000); defaultColors.put(key_chat_emojiPanelEmptyText, 0xff949ba1); defaultColors.put(key_chat_emojiPanelIcon, 0xff9da4ab); + defaultColors.put(key_chat_emojiPanelIconSelector, 0x0b000000); defaultColors.put(key_chat_emojiBottomPanelIcon, 0xff8c9197); - defaultColors.put(key_chat_emojiPanelIconSelected, 0xff2b97e2); + defaultColors.put(key_chat_emojiPanelIconSelected, 0xff5E6976); defaultColors.put(key_chat_emojiPanelStickerPackSelector, 0xffe2e5e7); defaultColors.put(key_chat_emojiPanelStickerPackSelectorLine, 0xff56abf0); defaultColors.put(key_chat_emojiPanelBackspace, 0xff8c9197); @@ -4751,6 +4756,7 @@ public class Theme { defaultColors.put(key_chat_inReactionButtonTextSelected, 0xffffffff); defaultColors.put(key_chat_outReactionButtonTextSelected, 0xffffffff); + defaultColors.put(key_premiumGradient0, 0xff4ACD43); defaultColors.put(key_premiumGradient1, 0xff55A5FF); defaultColors.put(key_premiumGradient2, 0xffA767FF); defaultColors.put(key_premiumGradient3, 0xffDB5C9D); @@ -4823,6 +4829,7 @@ public class Theme { fallbackKeys.put(key_dialogFloatingButtonPressed, key_dialogRoundCheckBox); fallbackKeys.put(key_dialogFloatingIcon, key_dialogRoundCheckBoxCheck); fallbackKeys.put(key_dialogShadowLine, key_chat_emojiPanelShadowLine); + fallbackKeys.put(key_chat_emojiPanelIconSelector, key_listSelector); fallbackKeys.put(key_actionBarDefaultArchived, key_actionBarDefault); fallbackKeys.put(key_actionBarDefaultArchivedSelector, key_actionBarDefaultSelector); fallbackKeys.put(key_actionBarDefaultArchivedIcon, key_actionBarDefaultIcon); @@ -6030,7 +6037,7 @@ public class Theme { public static final int RIPPLE_MASK_CIRCLE_TO_BOUND_EDGE = 3; public static final int RIPPLE_MASK_CIRCLE_TO_BOUND_CORNER = 4; public static final int RIPPLE_MASK_CIRCLE_AUTO = 5; - private static final int RIPPLE_MASK_ROUNDRECT_6DP = 7; + public static final int RIPPLE_MASK_ROUNDRECT_6DP = 7; public static Drawable createSelectorDrawable(int color, int maskType, int radius) { if (Build.VERSION.SDK_INT >= 21) { @@ -6058,11 +6065,12 @@ public class Theme { rect = new RectF(); } rect.set(bounds); - canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), maskPaint); + float rad = radius <= 0 ? AndroidUtilities.dp(6) : radius; + canvas.drawRoundRect(rect, rad, rad, maskPaint); } else { int rad; if (maskType == RIPPLE_MASK_CIRCLE_20DP || maskType == 6) { - rad = AndroidUtilities.dp(20); + rad = radius <= 0 ? AndroidUtilities.dp(20) : radius; } else if (maskType == RIPPLE_MASK_CIRCLE_TO_BOUND_EDGE) { rad = (Math.max(bounds.width(), bounds.height()) / 2); } else { @@ -6279,10 +6287,10 @@ public class Theme { return createRect(background, calcRippleColor(backgroundColor), radii); } - private static Drawable createRect(int rippleColor, float ...radii) { + public static Drawable createRect(int rippleColor, float ...radii) { return createRect(0, rippleColor, radii); } - private static Drawable createRect(int backgroundColor, int rippleColor, float ...radii) { + public static Drawable createRect(int backgroundColor, int rippleColor, float ...radii) { Drawable background = null; if (backgroundColor != 0) { if (hasNonzeroRadii(radii)) { @@ -6304,6 +6312,9 @@ public class Theme { if (hasNonzeroRadii(radii)) { maskDrawable = new ShapeDrawable(new RoundRectShape(calcRadii(radii), null, null)); ((ShapeDrawable) maskDrawable).getPaint().setColor(0xffffffff); + } else { + maskDrawable = new ShapeDrawable(new RectShape()); + ((ShapeDrawable) maskDrawable).getPaint().setColor(0xffffffff); } return new RippleDrawable( new ColorStateList( @@ -6320,7 +6331,8 @@ public class Theme { ripple = new ShapeDrawable(new RoundRectShape(calcRadii(radii), null, null)); ((ShapeDrawable) ripple).getPaint().setColor(rippleColor); } else { - ripple = new ColorDrawable(rippleColor); + ripple = new ShapeDrawable(new RectShape()); + ((ShapeDrawable) ripple).getPaint().setColor(rippleColor); } Drawable pressed = new LayerDrawable(new Drawable[] { background, ripple }); stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed); @@ -6434,7 +6446,7 @@ public class Theme { } private static float[] tempHSV; - private static int calcRippleColor(int backgroundColor) { + public static int calcRippleColor(int backgroundColor) { if (tempHSV == null) { tempHSV = new float[3]; } @@ -6442,7 +6454,7 @@ public class Theme { if (tempHSV[1] > 0.01f) { // when saturation is too low, hue is ignored // so changing saturation at that point would reveal ignored hue (usually red, hue=0) - tempHSV[1] = Math.min(1, Math.max(0, tempHSV[1] + (isCurrentThemeDark() ? -.25f : .25f))); + tempHSV[1] = Math.min(1, Math.max(0, tempHSV[1] + (isCurrentThemeDark() ? .25f : -.25f))); tempHSV[2] = Math.min(1, Math.max(0, tempHSV[2] + (isCurrentThemeDark() ? .05f : -.05f))); } else { tempHSV[2] = Math.min(1, Math.max(0, tempHSV[2] + (isCurrentThemeDark() ? .1f : -.1f))); @@ -6776,6 +6788,10 @@ public class Theme { applyTheme(themeInfo, true, nightTheme); } + public static void applyThemeInBackground(ThemeInfo themeInfo, boolean nightTheme, Runnable onDone) { + applyThemeInBackground(themeInfo, true, true, nightTheme, onDone); + } + public static void applyTheme(ThemeInfo themeInfo, boolean save, boolean nightTheme) { applyTheme(themeInfo, save, true, nightTheme); } @@ -6905,6 +6921,166 @@ public class Theme { } } + private static void applyThemeInBackground(ThemeInfo themeInfo, boolean save, boolean removeWallpaperOverride, final boolean nightTheme, Runnable onDone) { + if (themeInfo == null) { + if (onDone != null) { + onDone.run(); + } + return; + } + ThemeEditorView editorView = ThemeEditorView.getInstance(); + if (editorView != null) { + editorView.destroy(); + } + try { + if (themeInfo.pathToFile != null || themeInfo.assetName != null) { + if (!nightTheme && save) { + SharedPreferences preferences = MessagesController.getGlobalMainSettings(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("theme", themeInfo.getKey()); + editor.apply(); + } + String[] wallpaperLink = new String[1]; + Runnable next = () -> { + try { + Integer offset = currentColorsNoAccent.get("wallpaperFileOffset"); + themedWallpaperFileOffset = offset != null ? offset : -1; + if (!TextUtils.isEmpty(wallpaperLink[0])) { + themedWallpaperLink = wallpaperLink[0]; + String newPathToFile = new File(ApplicationLoader.getFilesDirFixed(), Utilities.MD5(themedWallpaperLink) + ".wp").getAbsolutePath(); + try { + if (themeInfo.pathToWallpaper != null && !themeInfo.pathToWallpaper.equals(newPathToFile)) { + new File(themeInfo.pathToWallpaper).delete(); + } + } catch (Exception ignore) { + + } + themeInfo.pathToWallpaper = newPathToFile; + try { + Uri data = Uri.parse(themedWallpaperLink); + themeInfo.slug = data.getQueryParameter("slug"); + + String mode = data.getQueryParameter("mode"); + if (mode != null) { + mode = mode.toLowerCase(); + String[] modes = mode.split(" "); + if (modes != null && modes.length > 0) { + for (int a = 0; a < modes.length; a++) { + if ("blur".equals(modes[a])) { + themeInfo.isBlured = true; + } else if ("motion".equals(modes[a])) { + themeInfo.isMotion = true; + } + } + } + } + int intensity = Utilities.parseInt(data.getQueryParameter("intensity")); + themeInfo.patternBgGradientRotation = 45; + try { + String bgColor = data.getQueryParameter("bg_color"); + if (!TextUtils.isEmpty(bgColor)) { + themeInfo.patternBgColor = Integer.parseInt(bgColor.substring(0, 6), 16) | 0xff000000; + if (bgColor.length() >= 13 && AndroidUtilities.isValidWallChar(bgColor.charAt(6))) { + themeInfo.patternBgGradientColor1 = Integer.parseInt(bgColor.substring(7, 13), 16) | 0xff000000; + } + if (bgColor.length() >= 20 && AndroidUtilities.isValidWallChar(bgColor.charAt(13))) { + themeInfo.patternBgGradientColor2 = Integer.parseInt(bgColor.substring(14, 20), 16) | 0xff000000; + } + if (bgColor.length() == 27 && AndroidUtilities.isValidWallChar(bgColor.charAt(20))) { + themeInfo.patternBgGradientColor3 = Integer.parseInt(bgColor.substring(21), 16) | 0xff000000; + } + } + } catch (Exception ignore) { + + } + try { + String rotation = data.getQueryParameter("rotation"); + if (!TextUtils.isEmpty(rotation)) { + themeInfo.patternBgGradientRotation = Utilities.parseInt(rotation); + } + } catch (Exception ignore) { + + } + } catch (Throwable e) { + FileLog.e(e); + } + } else { + try { + if (themeInfo.pathToWallpaper != null) { + new File(themeInfo.pathToWallpaper).delete(); + } + } catch (Exception ignore) { + + } + themeInfo.pathToWallpaper = null; + themedWallpaperLink = null; + } + if (!nightTheme && previousTheme == null) { + currentDayTheme = themeInfo; + if (isCurrentThemeNight()) { + switchNightThemeDelay = 2000; + lastDelayUpdateTime = SystemClock.elapsedRealtime(); + AndroidUtilities.runOnUIThread(Theme::checkAutoNightThemeConditions, 2100); + } + } + currentTheme = themeInfo; + refreshThemeColors(); + } catch (Exception e) { + FileLog.e(e); + } + if (previousTheme == null && save && !switchingNightTheme) { + MessagesController.getInstance(themeInfo.account).saveTheme(themeInfo, themeInfo.getAccent(false), nightTheme, false); + } + if (onDone != null) { + onDone.run(); + } + }; + if (themeInfo.assetName != null) { + getThemeFileValuesInBackground(null, themeInfo.assetName, null, colors -> { + currentColorsNoAccent = colors; + next.run(); + }); + } else { + getThemeFileValuesInBackground(new File(themeInfo.pathToFile), null, wallpaperLink, colors -> { + currentColorsNoAccent = colors; + next.run(); + }); + } + return; + } else { + if (!nightTheme && save) { + SharedPreferences preferences = MessagesController.getGlobalMainSettings(); + SharedPreferences.Editor editor = preferences.edit(); + editor.remove("theme"); + editor.apply(); + } + currentColorsNoAccent.clear(); + themedWallpaperFileOffset = 0; + themedWallpaperLink = null; + wallpaper = null; + themedWallpaper = null; + } + if (!nightTheme && previousTheme == null) { + currentDayTheme = themeInfo; + if (isCurrentThemeNight()) { + switchNightThemeDelay = 2000; + lastDelayUpdateTime = SystemClock.elapsedRealtime(); + AndroidUtilities.runOnUIThread(Theme::checkAutoNightThemeConditions, 2100); + } + } + currentTheme = themeInfo; + refreshThemeColors(); + } catch (Exception e) { + FileLog.e(e); + } + if (previousTheme == null && save && !switchingNightTheme) { + MessagesController.getInstance(themeInfo.account).saveTheme(themeInfo, themeInfo.getAccent(false), nightTheme, false); + } + if (onDone != null) { + onDone.run(); + } + } + private static boolean useBlackText(int color1, int color2) { float r1 = Color.red(color1) / 255.0f; float r2 = Color.red(color2) / 255.0f; @@ -8355,6 +8531,12 @@ public class Theme { } } + public static void getThemeFileValuesInBackground(File file, String assetName, String[] wallpaperLink, Utilities.Callback> onDone) { + Utilities.themeQueue.postRunnable(() -> { + onDone.run(getThemeFileValues(file, assetName, wallpaperLink)); + }); + } + public static HashMap getThemeFileValues(File file, String assetName, String[] wallpaperLink) { FileInputStream stream = null; HashMap stringMap = new HashMap<>(500); @@ -8732,6 +8914,7 @@ public class Theme { if (chat_msgTextPaint == null) { chat_msgTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_msgGameTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + chat_msgTextPaintEmoji = new TextPaint[6]; chat_msgTextPaintOneEmoji = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_msgTextPaintTwoEmoji = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_msgTextPaintThreeEmoji = new TextPaint(Paint.ANTI_ALIAS_FLAG); @@ -8739,9 +8922,14 @@ public class Theme { chat_msgBotButtonPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); } - chat_msgTextPaintOneEmoji.setTextSize(AndroidUtilities.dp(28)); - chat_msgTextPaintTwoEmoji.setTextSize(AndroidUtilities.dp(24)); - chat_msgTextPaintThreeEmoji.setTextSize(AndroidUtilities.dp(20)); + final float[] emojiSizePercents = new float[] {.7f, .52f, .37f, .28f, .25f, .19f}; + for (int i = 0; i < chat_msgTextPaintEmoji.length; ++i) { + chat_msgTextPaintEmoji[i] = new TextPaint(Paint.ANTI_ALIAS_FLAG); + chat_msgTextPaintEmoji[i].setTextSize(AndroidUtilities.dp(emojiSizePercents[i] * 120f)); + } + chat_msgTextPaintOneEmoji.setTextSize(AndroidUtilities.dp(28 + 18)); + chat_msgTextPaintTwoEmoji.setTextSize(AndroidUtilities.dp(24 + 14)); + chat_msgTextPaintThreeEmoji.setTextSize(AndroidUtilities.dp(20 + 10)); chat_msgTextPaint.setTextSize(AndroidUtilities.dp(SharedConfig.fontSize)); chat_msgGameTextPaint.setTextSize(AndroidUtilities.dp(14)); chat_msgBotButtonPaint.setTextSize(AndroidUtilities.dp(15)); @@ -10622,4 +10810,7 @@ public class Theme { } return false; } + + public static Paint DEBUG_RED = new Paint(); static { DEBUG_RED.setColor(0xffff0000); } + public static Paint DEBUG_BLUE = new Paint(); static { DEBUG_BLUE.setColor(0xff0000ff); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java index 5fedea661..0d6249cdf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java @@ -14,6 +14,7 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.location.Location; import android.os.Build; +import android.text.Spanned; import android.text.TextUtils; import android.util.TypedValue; import android.view.View; @@ -52,6 +53,7 @@ import org.telegram.ui.Cells.ContextLinkCell; import org.telegram.ui.Cells.MentionCell; import org.telegram.ui.Cells.StickerCell; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.EmojiView; import org.telegram.ui.Components.RecyclerListView; @@ -793,7 +795,8 @@ public class MentionsAdapter extends RecyclerListView.SelectionAdapter implement } } - public void searchUsernameOrHashtag(String text, int position, ArrayList messageObjects, boolean usernameOnly, boolean forSearch) { + public void searchUsernameOrHashtag(CharSequence charSequence, int position, ArrayList messageObjects, boolean usernameOnly, boolean forSearch) { + final String text = charSequence == null ? null : charSequence.toString(); if (cancelDelayRunnable != null) { AndroidUtilities.cancelRunOnUIThread(cancelDelayRunnable); cancelDelayRunnable = null; @@ -844,6 +847,10 @@ public class MentionsAdapter extends RecyclerListView.SelectionAdapter implement lastSticker = emoji.toString().trim(); } boolean isValidEmoji = searchEmoji && (Emoji.isValidEmoji(originalEmoji) || Emoji.isValidEmoji(lastSticker)); + if (isValidEmoji && charSequence instanceof Spanned) { + AnimatedEmojiSpan[] spans = ((Spanned) charSequence).getSpans(0, charSequence.length(), AnimatedEmojiSpan.class); + isValidEmoji = spans == null || spans.length == 0; + } if (isValidEmoji && parentFragment != null && (parentFragment.getCurrentChat() == null || ChatObject.canSendStickers(parentFragment.getCurrentChat()))) { stickersToLoad.clear(); @@ -1309,7 +1316,7 @@ public class MentionsAdapter extends RecyclerListView.SelectionAdapter implement searchResultCommandsUsers = null; notifyDataSetChanged(); delegate.needChangePanelVisibility(searchResultSuggestions != null && !searchResultSuggestions.isEmpty()); - }); + }, true); } else if (foundType == 4) { searchResultHashtags = null; searchResultUsernames = null; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java index e75f41b52..9b2c599ae 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java @@ -101,7 +101,7 @@ public class StickersAdapter extends RecyclerListView.SelectionAdapter implement notifyDataSetChanged(); delegate.needChangePanelVisibility(visible = !param.isEmpty()); } - }); + }, true); if (keywordResults == null || keywordResults.isEmpty()) { AndroidUtilities.runOnUIThread(searchRunnable, 1000); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java index b920fc6b1..b9e7025b5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java @@ -175,7 +175,7 @@ public class StickersSearchAdapter extends RecyclerListView.SelectionAdapter { if (added) { notifyDataSetChanged(); } - }); + }, false); } ArrayList local = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE); int index; @@ -533,7 +533,7 @@ public class StickersSearchAdapter extends RecyclerListView.SelectionAdapter { } if (unread) { - mediaDataController.markFaturedStickersByIdAsRead(stickerSetCovered.set.id); + mediaDataController.markFeaturedStickersByIdAsRead(false, stickerSetCovered.set.id); } boolean installing = installingStickerSets.indexOfKey(stickerSetCovered.set.id) >= 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ArchivedStickersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ArchivedStickersActivity.java index 6ef15a438..1b36fda9f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ArchivedStickersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ArchivedStickersActivity.java @@ -13,9 +13,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.collection.LongSparseArray; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.MediaDataController; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.tgnet.TLRPC; @@ -34,10 +38,6 @@ import org.telegram.ui.Components.StickersAlert; import java.util.ArrayList; import java.util.List; -import androidx.collection.LongSparseArray; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - public class ArchivedStickersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private final LongSparseArray installingStickerSets = new LongSparseArray<>(); @@ -208,6 +208,7 @@ public class ArchivedStickersActivity extends BaseFragment implements Notificati req.offset_id = sets.isEmpty() ? 0 : sets.get(sets.size() - 1).set.id; req.limit = 15; req.masks = currentType == MediaDataController.TYPE_MASK; + req.emojis = currentType == MediaDataController.TYPE_EMOJIPACKS; int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { processResponse((TLRPC.TL_messages_archivedStickers) response); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AppIconsSelectorCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AppIconsSelectorCell.java index 1c1272095..699f81395 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AppIconsSelectorCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AppIconsSelectorCell.java @@ -207,6 +207,7 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati private final static class IconHolderView extends LinearLayout { private Paint outlinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private AdaptiveIconImageView iconView; private TextView titleView; @@ -231,14 +232,18 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati outlinePaint.setStyle(Paint.Style.STROKE); outlinePaint.setStrokeWidth(Math.max(2, AndroidUtilities.dp(0.5f))); + + fillPaint.setColor(Color.WHITE); } @Override public void draw(Canvas canvas) { - super.draw(canvas); - float stroke = outlinePaint.getStrokeWidth(); AndroidUtilities.rectTmp.set(iconView.getLeft() + stroke, iconView.getTop() + stroke, iconView.getRight() - stroke, iconView.getBottom() - stroke); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(ICONS_ROUND_RADIUS), AndroidUtilities.dp(ICONS_ROUND_RADIUS), fillPaint); + + super.draw(canvas); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(ICONS_ROUND_RADIUS), AndroidUtilities.dp(ICONS_ROUND_RADIUS), outlinePaint); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AvailableReactionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AvailableReactionCell.java index d805ab524..4e42070b6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AvailableReactionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AvailableReactionCell.java @@ -2,22 +2,26 @@ package org.telegram.ui.Cells; import android.content.Context; import android.graphics.Canvas; -import android.text.TextUtils; -import android.util.TypedValue; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; import android.view.Gravity; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; -import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DocumentObject; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; import org.telegram.messenger.SvgHelper; +import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CheckBox2; @@ -25,24 +29,25 @@ import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Switch; public class AvailableReactionCell extends FrameLayout { - private TextView textView; + private SimpleTextView textView; private BackupImageView imageView; private Switch switchView; private CheckBox2 checkBox; private View overlaySelectorView; public TLRPC.TL_availableReaction react; + private boolean canLock; + public boolean locked; - public AvailableReactionCell(@NonNull Context context, boolean checkbox) { + public AvailableReactionCell(@NonNull Context context, boolean checkbox, boolean canLock) { super(context); + this.canLock = canLock; - textView = new TextView(context); + textView = new SimpleTextView(context); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + textView.setTextSize(16); textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - textView.setLines(1); textView.setMaxLines(1); - textView.setSingleLine(true); - textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setMaxLines(1); textView.setGravity(LayoutHelper.getAbsoluteGravityStart() | Gravity.CENTER_VERTICAL); addView(textView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 81, 0, 61, 0)); @@ -78,7 +83,7 @@ public class AvailableReactionCell extends FrameLayout { * @param react Reaction to bind * @param checked If view should be checked */ - public void bind(TLRPC.TL_availableReaction react, boolean checked) { + public void bind(TLRPC.TL_availableReaction react, boolean checked, int currentAccount) { boolean animated = false; if (react != null && this.react != null && react.reaction.equals(this.react.reaction)) { animated = true; @@ -86,7 +91,18 @@ public class AvailableReactionCell extends FrameLayout { this.react = react; textView.setText(react.title); SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(react.static_icon, Theme.key_windowBackgroundGray, 1.0f); - imageView.setImage(ImageLocation.getForDocument(react.center_icon), "40_40_lastframe", "webp", svgThumb, react); + imageView.setImage(ImageLocation.getForDocument(react.center_icon), "32_32_lastframe", "webp", svgThumb, react); + + locked = canLock && react.premium && !UserConfig.getInstance(currentAccount).isPremium(); + if (locked) { + Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.other_lockedfolders2); + drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_stickers_menu), PorterDuff.Mode.MULTIPLY)); + textView.setRightDrawable(drawable); + + } else { + textView.setRightDrawable(null); + } + setChecked(checked, animated); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java index 9e498d045..e599a2278 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java @@ -33,8 +33,8 @@ public abstract class BaseCell extends ViewGroup { public void run() { if (checkingForLongPress && getParent() != null && currentPressCount == pressCount) { checkingForLongPress = false; - performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); if (onLongPress()) { + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0); onTouchEvent(event); event.recycle(); 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 930415ace..4c299fdae 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java @@ -8,6 +8,7 @@ package org.telegram.ui.Cells; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -25,6 +26,8 @@ import android.text.TextUtils; import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; import android.text.style.URLSpan; +import android.util.TypedValue; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.SoundEffectConstants; import android.view.View; @@ -32,6 +35,9 @@ import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.DocumentObject; import org.telegram.messenger.DownloadController; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; @@ -39,26 +45,49 @@ import org.telegram.messenger.ImageLoader; 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; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.Premium.StarParticlesView; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.TypefaceSpan; import org.telegram.ui.Components.URLSpanNoUnderline; import org.telegram.ui.Components.spoilers.SpoilerEffect; +import org.telegram.ui.LaunchActivity; import org.telegram.ui.PhotoViewer; -import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Stack; public class ChatActionCell extends BaseCell implements DownloadController.FileDownloadProgressListener, NotificationCenter.NotificationCenterDelegate { + private final static boolean USE_PREMIUM_GIFT_LOCAL_STICKER = false; + private final static boolean USE_PREMIUM_GIFT_MONTHS_AS_EMOJI_NUMBERS = false; + + private static Map monthsToEmoticon = new HashMap<>(); + + static { + monthsToEmoticon.put(1, 1 + "\u20E3"); + monthsToEmoticon.put(3, 2 + "\u20E3"); + monthsToEmoticon.put(6, 3 + "\u20E3"); + monthsToEmoticon.put(12, 4 + "\u20E3"); + monthsToEmoticon.put(24, 5 + "\u20E3"); + } @Override public void didReceivedNotification(int id, int account, Object... args) { @@ -66,12 +95,25 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD setSpoilersSuppressed(false); } else if (id == NotificationCenter.stopSpoilers) { setSpoilersSuppressed(true); + } else if (id == NotificationCenter.didUpdatePremiumGiftStickers) { + MessageObject messageObject = currentMessageObject; + if (messageObject != null) { + setMessageObject(messageObject, true); + } + } else if (id == NotificationCenter.diceStickersDidLoad) { + if (Objects.equals(args[0], UserConfig.getInstance(currentAccount).premiumGiftsStickerPack)) { + MessageObject messageObject = currentMessageObject; + if (messageObject != null) { + setMessageObject(messageObject, true); + } + } } } public void setSpoilersSuppressed(boolean s) { - for (SpoilerEffect eff : spoilers) + for (SpoilerEffect eff : spoilers) { eff.setSuppressUpdates(s); + } } private boolean canDrawInParent; @@ -80,6 +122,9 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD default void didClickImage(ChatActionCell cell) { } + default void didOpenPremiumGift(ChatActionCell cell, TLRPC.TL_premiumGiftOption giftOption, boolean animateConfetti) { + } + default boolean didLongPress(ChatActionCell cell, float x, float y) { return false; } @@ -94,7 +139,9 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD } default void needOpenInviteLink(TLRPC.TL_chatInviteExported invite) { + } + default void needShowEffectOverlay(ChatActionCell cell, TLRPC.Document document, TLRPC.VideoSize videoSize) { } } @@ -117,9 +164,13 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD private int textXLeft; private int previousWidth; private boolean imagePressed; + private boolean giftButtonPressed; + + private RectF giftButtonRect = new RectF(); public List spoilers = new ArrayList<>(); private Stack spoilersPool = new Stack<>(); + private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiStack; TextPaint textPaint; @@ -155,6 +206,61 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD private ChatActionCellDelegate delegate; private ThemeDelegate themeDelegate; + private int stickerSize; + private int giftRectSize; + private StaticLayout giftPremiumTitleLayout; + private StaticLayout giftPremiumSubtitleLayout; + private StaticLayout giftPremiumButtonLayout; + private float giftPremiumButtonWidth; + + private TextPaint giftTitlePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + private TextPaint giftSubtitlePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + + private TLRPC.Document giftSticker; + private TLRPC.VideoSize giftEffectAnimation; + + private boolean forceWasUnread; + + private ImageReceiver.ImageReceiverDelegate giftStickerDelegate = (imageReceiver1, set, thumb, memCache) -> { + if (set) { + RLottieDrawable drawable = imageReceiver.getLottieAnimation(); + if (drawable != null) { + MessageObject messageObject = currentMessageObject; + if (messageObject != null && !messageObject.playedGiftAnimation) { + messageObject.playedGiftAnimation = true; + drawable.setCurrentFrame(0, false); + AndroidUtilities.runOnUIThread(drawable::start); + + if (messageObject != null && messageObject.wasUnread || forceWasUnread) { + forceWasUnread = messageObject.wasUnread = false; + + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignored) { + } + + if (getContext() instanceof LaunchActivity) { + ((LaunchActivity) getContext()).getFireworksOverlay().start(); + } + + if (giftEffectAnimation != null && delegate != null) { + delegate.needShowEffectOverlay(ChatActionCell.this, giftSticker, giftEffectAnimation); + } + } + } else { + drawable.stop(); + drawable.setCurrentFrame(drawable.getFramesCount() - 1, false); + } + } + } + }; + + private View rippleView; + + private Path starsPath = new Path(); + private StarParticlesView.Drawable starParticlesDrawable; + private int starsSize; + public ChatActionCell(Context context) { this(context, false, null); } @@ -167,6 +273,29 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD imageReceiver.setRoundRadius(AndroidUtilities.roundMessageSize / 2); avatarDrawable = new AvatarDrawable(); TAG = DownloadController.getInstance(currentAccount).generateObserverTag(); + + giftTitlePaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics())); + giftSubtitlePaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, getResources().getDisplayMetrics())); + + rippleView = new View(context); + rippleView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), Theme.RIPPLE_MASK_ROUNDRECT_6DP, AndroidUtilities.dp(16))); + rippleView.setVisibility(GONE); + addView(rippleView); + + starParticlesDrawable = new StarParticlesView.Drawable(10); + starParticlesDrawable.type = 100; + starParticlesDrawable.isCircle = false; + starParticlesDrawable.roundEffect = true; + starParticlesDrawable.useRotate = false; + starParticlesDrawable.useBlur = true; + starParticlesDrawable.checkBounds = true; + starParticlesDrawable.size1 = 1; + starParticlesDrawable.k1 = starParticlesDrawable.k2 = starParticlesDrawable.k3 = 0.98f; + starParticlesDrawable.paused = false; + starParticlesDrawable.speedScale = 0f; + starParticlesDrawable.minLifeTime = 750; + starParticlesDrawable.randLifeTime = 750; + starParticlesDrawable.init(); } public void setDelegate(ChatActionCellDelegate delegate) { @@ -225,32 +354,123 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD } public void setMessageObject(MessageObject messageObject) { - if (currentMessageObject == messageObject && (textLayout == null || TextUtils.equals(textLayout.getText(), messageObject.messageText)) && (hasReplyMessage || messageObject.replyMessageObject == null)) { + setMessageObject(messageObject, false); + } + + public void setMessageObject(MessageObject messageObject, boolean force) { + if (currentMessageObject == messageObject && (textLayout == null || TextUtils.equals(textLayout.getText(), messageObject.messageText)) && (hasReplyMessage || messageObject.replyMessageObject == null) && !force) { return; } + if (BuildVars.DEBUG_PRIVATE_VERSION && Thread.currentThread() != ApplicationLoader.applicationHandler.getLooper().getThread()) { + FileLog.e(new IllegalStateException("Wrong thread!!!")); + } accessibilityText = null; currentMessageObject = messageObject; - if (currentMessageObject != null && currentMessageObject.viewRef != null && (currentMessageObject.viewRef.get() == null || currentMessageObject.viewRef.get().get() != this)) { - currentMessageObject.viewRef.set(new WeakReference<>(this)); - } hasReplyMessage = messageObject.replyMessageObject != null; DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this); previousWidth = 0; - if (currentMessageObject.type == 11) { + if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + imageReceiver.setRoundRadius(0); + + if (USE_PREMIUM_GIFT_LOCAL_STICKER) { + forceWasUnread = messageObject.wasUnread; + imageReceiver.setAllowStartLottieAnimation(false); + imageReceiver.setDelegate(giftStickerDelegate); + imageReceiver.setImageBitmap(new RLottieDrawable(R.raw.premium_gift, messageObject.getId() + "_" + R.raw.premium_gift, AndroidUtilities.dp(160), AndroidUtilities.dp(160))); + } else { + TLRPC.TL_messages_stickerSet set; + TLRPC.Document document = null; + + String packName = UserConfig.getInstance(currentAccount).premiumGiftsStickerPack; + if (packName == null) { + MediaDataController.getInstance(currentAccount).checkPremiumGiftStickers(); + return; + } + set = MediaDataController.getInstance(currentAccount).getStickerSetByName(packName); + if (set == null) { + set = MediaDataController.getInstance(currentAccount).getStickerSetByEmojiOrName(packName); + } + if (set != null) { + int months = messageObject.messageOwner.action.months; + + String monthsEmoticon; + if (USE_PREMIUM_GIFT_MONTHS_AS_EMOJI_NUMBERS) { + StringBuilder monthsEmoticonBuilder = new StringBuilder(); + while (months > 0) { + monthsEmoticonBuilder.insert(0, (months % 10) + "\u20E3"); + months /= 10; + } + monthsEmoticon = monthsEmoticonBuilder.toString(); + } else { + monthsEmoticon = monthsToEmoticon.get(months); + } + for (TLRPC.TL_stickerPack pack : set.packs) { + if (Objects.equals(pack.emoticon, monthsEmoticon)) { + for (long id : pack.documents) { + for (TLRPC.Document doc : set.documents) { + if (doc.id == id) { + document = doc; + break; + } + } + if (document != null) { + break; + } + } + } + if (document != null) { + break; + } + } + + if (document == null && !set.documents.isEmpty()) { + document = set.documents.get(0); + } + } + + forceWasUnread = messageObject.wasUnread; + giftSticker = document; + if (document != null) { + imageReceiver.setAllowStartLottieAnimation(false); + imageReceiver.setDelegate(giftStickerDelegate); + + giftEffectAnimation = null; + for (int i = 0; i < document.video_thumbs.size(); i++) { + if ("f".equals(document.video_thumbs.get(i).type)) { + giftEffectAnimation = document.video_thumbs.get(i); + break; + } + } + + SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document.thumbs, Theme.key_emptyListPlaceholder, 0.2f); + if (svgThumb != null) { + svgThumb.overrideWidthAndHeight(512, 512); + } + + imageReceiver.setAutoRepeat(0); + imageReceiver.setImage(ImageLocation.getForDocument(document), messageObject.getId() + "_130_130", svgThumb, "tgs", set, 1); + } else { + MediaDataController.getInstance(currentAccount).loadStickersByEmojiOrName(packName, false, set == null); + } + } + } else if (messageObject.type == 11) { + imageReceiver.setAllowStartLottieAnimation(true); + imageReceiver.setDelegate(null); + imageReceiver.setRoundRadius(AndroidUtilities.roundMessageSize / 2); long id = messageObject.getDialogId(); avatarDrawable.setInfo(id, null, null); - if (currentMessageObject.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) { - imageReceiver.setImage(null, null, avatarDrawable, null, currentMessageObject, 0); + if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) { + imageReceiver.setImage(null, null, avatarDrawable, null, messageObject, 0); } else { TLRPC.PhotoSize strippedPhotoSize = null; - for (int a = 0, N = currentMessageObject.photoThumbs.size(); a < N; a++) { - TLRPC.PhotoSize photoSize = currentMessageObject.photoThumbs.get(a); + for (int a = 0, N = messageObject.photoThumbs.size(); a < N; a++) { + TLRPC.PhotoSize photoSize = messageObject.photoThumbs.get(a); if (photoSize instanceof TLRPC.TL_photoStrippedSize) { strippedPhotoSize = photoSize; break; } } - TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(currentMessageObject.photoThumbs, 640); + TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 640); if (photoSize != null) { TLRPC.Photo photo = messageObject.messageOwner.action.photo; TLRPC.VideoSize videoSize = null; @@ -259,23 +479,26 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD if (!messageObject.mediaExists && !DownloadController.getInstance(currentAccount).canDownloadMedia(DownloadController.AUTODOWNLOAD_TYPE_VIDEO, videoSize.size)) { currentVideoLocation = ImageLocation.getForPhoto(videoSize, photo); String fileName = FileLoader.getAttachFileName(videoSize); - DownloadController.getInstance(currentAccount).addLoadingFileObserver(fileName, currentMessageObject, this); + DownloadController.getInstance(currentAccount).addLoadingFileObserver(fileName, messageObject, this); videoSize = null; } } if (videoSize != null) { - imageReceiver.setImage(ImageLocation.getForPhoto(videoSize, photo), ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForObject(strippedPhotoSize, currentMessageObject.photoThumbsObject), "50_50_b", avatarDrawable, 0, null, currentMessageObject, 1); + imageReceiver.setImage(ImageLocation.getForPhoto(videoSize, photo), ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForObject(strippedPhotoSize, messageObject.photoThumbsObject), "50_50_b", avatarDrawable, 0, null, messageObject, 1); } else { - imageReceiver.setImage(ImageLocation.getForObject(photoSize, currentMessageObject.photoThumbsObject), "150_150", ImageLocation.getForObject(strippedPhotoSize, currentMessageObject.photoThumbsObject), "50_50_b", avatarDrawable, 0, null, currentMessageObject, 1); + imageReceiver.setImage(ImageLocation.getForObject(photoSize, messageObject.photoThumbsObject), "150_150", ImageLocation.getForObject(strippedPhotoSize, messageObject.photoThumbsObject), "50_50_b", avatarDrawable, 0, null, messageObject, 1); } } else { imageReceiver.setImageBitmap(avatarDrawable); } } - imageReceiver.setVisible(!PhotoViewer.isShowingImage(currentMessageObject), false); + imageReceiver.setVisible(!PhotoViewer.isShowingImage(messageObject), false); } else { + imageReceiver.setAllowStartLottieAnimation(true); + imageReceiver.setDelegate(null); imageReceiver.setImageBitmap((Bitmap) null); } + rippleView.setVisibility(messageObject.type == MessageObject.TYPE_GIFT_PREMIUM ? VISIBLE : GONE); requestLayout(); } @@ -303,7 +526,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - + rippleView.layout((int) giftButtonRect.left, (int) giftButtonRect.top, (int) giftButtonRect.right, (int) giftButtonRect.bottom); } @Override @@ -311,18 +534,45 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD super.onDetachedFromWindow(); DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this); imageReceiver.onDetachedFromWindow(); + setStarsPaused(true); wasLayout = false; + AnimatedEmojiSpan.release(this, animatedEmojiStack); + + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.didUpdatePremiumGiftStickers); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.diceStickersDidLoad); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); imageReceiver.onAttachedToWindow(); + setStarsPaused(false); + + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack, textLayout); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.didUpdatePremiumGiftStickers); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.diceStickersDidLoad); } + private void setStarsPaused(boolean paused) { + if (paused == starParticlesDrawable.paused) { + return; + } + starParticlesDrawable.paused = paused; + if (paused) { + starParticlesDrawable.pausedTime = System.currentTimeMillis(); + } else { + for (int i = 0; i < starParticlesDrawable.particles.size(); i++) { + starParticlesDrawable.particles.get(i).lifeTime += System.currentTimeMillis() - starParticlesDrawable.pausedTime; + } + invalidate(); + } + } + + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { - if (currentMessageObject == null) { + MessageObject messageObject = currentMessageObject; + if (messageObject == null) { return super.onTouchEvent(event); } float x = lastTouchX = event.getX(); @@ -331,10 +581,14 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD boolean result = false; if (event.getAction() == MotionEvent.ACTION_DOWN) { if (delegate != null) { - if (currentMessageObject.type == 11 && imageReceiver.isInsideImage(x, y)) { + if ((messageObject.type == 11 || messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) && imageReceiver.isInsideImage(x, y)) { imagePressed = true; result = true; } + if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM && giftButtonRect.contains(x, y)) { + rippleView.setPressed(giftButtonPressed = true); + result = true; + } if (result) { startCheckLongPress(); } @@ -344,18 +598,42 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD cancelCheckLongPress(); } if (imagePressed) { - if (event.getAction() == MotionEvent.ACTION_UP) { - imagePressed = false; - if (delegate != null) { - delegate.didClickImage(this); - playSoundEffect(SoundEffectConstants.CLICK); - } - } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { - imagePressed = false; - } else if (event.getAction() == MotionEvent.ACTION_MOVE) { - if (!imageReceiver.isInsideImage(x, y)) { + switch (event.getAction()) { + case MotionEvent.ACTION_UP: imagePressed = false; - } + if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + openPremiumGiftPreview(); + } else if (delegate != null) { + delegate.didClickImage(this); + playSoundEffect(SoundEffectConstants.CLICK); + } + break; + case MotionEvent.ACTION_CANCEL: + imagePressed = false; + break; + case MotionEvent.ACTION_MOVE: + if (!imageReceiver.isInsideImage(x, y)) { + imagePressed = false; + } + break; + } + } else if (giftButtonPressed) { + switch (event.getAction()) { + case MotionEvent.ACTION_UP: + rippleView.setPressed(giftButtonPressed = false); + if (delegate != null) { + playSoundEffect(SoundEffectConstants.CLICK); + openPremiumGiftPreview(); + } + break; + case MotionEvent.ACTION_CANCEL: + rippleView.setPressed(giftButtonPressed = false); + break; + case MotionEvent.ACTION_MOVE: + if (!giftButtonRect.contains(x, y)) { + rippleView.setPressed(giftButtonPressed = false); + } + break; } } } @@ -368,8 +646,8 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD final int line = textLayout.getLineForVertical((int) y); final int off = textLayout.getOffsetForHorizontal(line, x); final float left = textLayout.getLineLeft(line); - if (left <= x && left + textLayout.getLineWidth(line) >= x && currentMessageObject.messageText instanceof Spannable) { - Spannable buffer = (Spannable) currentMessageObject.messageText; + if (left <= x && left + textLayout.getLineWidth(line) >= x && messageObject.messageText instanceof Spannable) { + Spannable buffer = (Spannable) messageObject.messageText; URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); if (link.length != 0) { @@ -401,6 +679,18 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD return result; } + private void openPremiumGiftPreview() { + TLRPC.TL_premiumGiftOption giftOption = new TLRPC.TL_premiumGiftOption(); + TLRPC.MessageAction action = currentMessageObject.messageOwner.action; + giftOption.amount = action.amount; + giftOption.months = action.months; + giftOption.currency = action.currency; + + if (delegate != null) { + AndroidUtilities.runOnUIThread(() -> delegate.didOpenPremiumGift(ChatActionCell.this, giftOption, false)); + } + } + private void openLink(CharacterStyle link) { if (delegate != null && link instanceof URLSpan) { String url = ((URLSpan) link).getURL(); @@ -450,6 +740,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD spoilers.clear(); if (text instanceof Spannable) SpoilerEffect.addSpoilers(this, textLayout, (Spannable) text, spoilersPool, spoilers); + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack, textLayout); textHeight = 0; textWidth = 0; @@ -480,49 +771,118 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (currentMessageObject == null && customText == null) { + MessageObject messageObject = currentMessageObject; + if (messageObject == null && customText == null) { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), textHeight + AndroidUtilities.dp(14)); return; } + if (messageObject != null && messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + giftRectSize = Math.min((int) (AndroidUtilities.isTablet() ? AndroidUtilities.getMinTabletSide() * 0.6f : AndroidUtilities.displaySize.x * 0.6f), AndroidUtilities.displaySize.y - ActionBar.getCurrentActionBarHeight() - AndroidUtilities.statusBarHeight - AndroidUtilities.dp(64)); + stickerSize = giftRectSize - AndroidUtilities.dp(106); + } int width = Math.max(AndroidUtilities.dp(30), MeasureSpec.getSize(widthMeasureSpec)); if (previousWidth != width) { wasLayout = true; previousWidth = width; buildLayout(); } - setMeasuredDimension(width, textHeight + (currentMessageObject != null && currentMessageObject.type == 11 ? AndroidUtilities.roundMessageSize + AndroidUtilities.dp(10) : 0) + AndroidUtilities.dp(14)); + int additionalHeight = 0; + if (messageObject != null) { + if (messageObject.type == 11) { + additionalHeight = AndroidUtilities.roundMessageSize + AndroidUtilities.dp(10); + } else if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + additionalHeight = giftRectSize + AndroidUtilities.dp(12); + } + } + setMeasuredDimension(width, textHeight + additionalHeight + AndroidUtilities.dp(14)); + + if (messageObject != null && messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + float y = textY + textHeight + giftRectSize * 0.075f + stickerSize + AndroidUtilities.dp(4) + giftPremiumTitleLayout.getHeight() + AndroidUtilities.dp(4) + giftPremiumSubtitleLayout.getHeight(); + y += (getMeasuredHeight() - y - giftPremiumButtonLayout.getHeight() - AndroidUtilities.dp(8)) / 2f; + float rectX = (previousWidth - giftPremiumButtonWidth) / 2f; + giftButtonRect.set(rectX - AndroidUtilities.dp(18), y - AndroidUtilities.dp(8), rectX + giftPremiumButtonWidth + AndroidUtilities.dp(18), y + giftPremiumButtonLayout.getHeight() + AndroidUtilities.dp(8)); + + int sizeInternal = getMeasuredWidth() << 16 + getMeasuredHeight(); + starParticlesDrawable.rect.set(giftButtonRect); + starParticlesDrawable.rect2.set(giftButtonRect); + if (starsSize != sizeInternal) { + starsSize = sizeInternal; + starParticlesDrawable.resetPositions(); + } + } } private void buildLayout() { CharSequence text; - if (currentMessageObject != null) { - if (currentMessageObject.messageOwner != null && currentMessageObject.messageOwner.media != null && currentMessageObject.messageOwner.media.ttl_seconds != 0) { - if (currentMessageObject.messageOwner.media.photo instanceof TLRPC.TL_photoEmpty) { + MessageObject messageObject = currentMessageObject; + if (messageObject != null) { + if (messageObject.messageOwner != null && messageObject.messageOwner.media != null && messageObject.messageOwner.media.ttl_seconds != 0) { + if (messageObject.messageOwner.media.photo instanceof TLRPC.TL_photoEmpty) { text = LocaleController.getString("AttachPhotoExpired", R.string.AttachPhotoExpired); - } else if (currentMessageObject.messageOwner.media.document instanceof TLRPC.TL_documentEmpty) { + } else if (messageObject.messageOwner.media.document instanceof TLRPC.TL_documentEmpty) { text = LocaleController.getString("AttachVideoExpired", R.string.AttachVideoExpired); } else { - text = currentMessageObject.messageText; + text = AnimatedEmojiSpan.cloneSpans(messageObject.messageText); } } else { - text = currentMessageObject.messageText; + text = AnimatedEmojiSpan.cloneSpans(messageObject.messageText); } } else { text = customText; } createLayout(text, previousWidth); - if (currentMessageObject != null && currentMessageObject.type == 11) { - imageReceiver.setImageCoords((previousWidth - AndroidUtilities.roundMessageSize) / 2, textHeight + AndroidUtilities.dp(19), AndroidUtilities.roundMessageSize, AndroidUtilities.roundMessageSize); + if (messageObject != null) { + if (messageObject.type == 11) { + imageReceiver.setImageCoords((previousWidth - AndroidUtilities.roundMessageSize) / 2f, textHeight + AndroidUtilities.dp(19), AndroidUtilities.roundMessageSize, AndroidUtilities.roundMessageSize); + } else if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + createGiftPremiumLayouts(LocaleController.getString(R.string.ActionGiftPremiumTitle), LocaleController.formatString(R.string.ActionGiftPremiumSubtitle, LocaleController.formatPluralString("Months", messageObject.messageOwner.action.months)), LocaleController.getString(R.string.ActionGiftPremiumView), giftRectSize); + } } } + private void createGiftPremiumLayouts(CharSequence title, CharSequence subtitle, CharSequence button, int width) { + SpannableStringBuilder titleBuilder = SpannableStringBuilder.valueOf(title); + titleBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, titleBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + giftPremiumTitleLayout = new StaticLayout(titleBuilder, giftTitlePaint, width, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + giftPremiumSubtitleLayout = new StaticLayout(subtitle, giftSubtitlePaint, width, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + SpannableStringBuilder buttonBuilder = SpannableStringBuilder.valueOf(button); + buttonBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, buttonBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + giftPremiumButtonLayout = new StaticLayout(buttonBuilder, (TextPaint) getThemedPaint(Theme.key_paint_chatActionText), width, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + giftPremiumButtonWidth = measureLayoutWidth(giftPremiumButtonLayout); + } + + private float measureLayoutWidth(Layout layout) { + float maxWidth = 0; + for (int i = 0; i < layout.getLineCount(); i++) { + int lineWidth = (int) Math.ceil(layout.getLineWidth(i)); + if (lineWidth > maxWidth) { + maxWidth = lineWidth; + } + } + return maxWidth; + } + public int getCustomDate() { return customDate; } @Override protected void onDraw(Canvas canvas) { - if (currentMessageObject != null && currentMessageObject.type == 11) { + MessageObject messageObject = currentMessageObject; + if (messageObject != null && messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + stickerSize = giftRectSize - AndroidUtilities.dp(106); + imageReceiver.setImageCoords((previousWidth - stickerSize) / 2f, textY + textHeight + giftRectSize * 0.075f, stickerSize, stickerSize); + + if (textPaint != null && giftTitlePaint != null && giftSubtitlePaint != null) { + if (giftTitlePaint.getColor() != textPaint.getColor()) { + giftTitlePaint.setColor(textPaint.getColor()); + } + if (giftSubtitlePaint.getColor() != textPaint.getColor()) { + giftSubtitlePaint.setColor(textPaint.getColor()); + } + } + } + if (messageObject != null && (messageObject.type == 11 || messageObject.type == MessageObject.TYPE_GIFT_PREMIUM)) { imageReceiver.draw(canvas); } @@ -540,6 +900,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD } canvas.save(); SpoilerEffect.clipOutCanvas(canvas, spoilers); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, textLayout, animatedEmojiStack, 0, spoilers, 0, 0, 0, 1f); textLayout.draw(canvas); canvas.restore(); @@ -550,6 +911,46 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD canvas.restore(); } + + if (messageObject != null && messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + canvas.save(); + float x = (previousWidth - giftRectSize) / 2f, y = textY + textHeight + giftRectSize * 0.075f + stickerSize + AndroidUtilities.dp(4); + canvas.translate(x, y); + giftPremiumTitleLayout.draw(canvas); + canvas.restore(); + + y += giftPremiumTitleLayout.getHeight(); + y += AndroidUtilities.dp(4); + canvas.save(); + canvas.translate(x, y); + giftPremiumSubtitleLayout.draw(canvas); + canvas.restore(); + + y += giftPremiumSubtitleLayout.getHeight(); + y += (getHeight() - y - giftPremiumButtonLayout.getHeight() - AndroidUtilities.dp(8)) / 2f; + + Paint backgroundPaint = getThemedPaint(Theme.key_paint_chatActionBackground); + canvas.drawRoundRect(giftButtonRect, AndroidUtilities.dp(16), AndroidUtilities.dp(16), backgroundPaint); + + if (hasGradientService()) { + canvas.drawRoundRect(giftButtonRect, AndroidUtilities.dp(16), AndroidUtilities.dp(16), Theme.chat_actionBackgroundGradientDarkenPaint); + } + + starsPath.rewind(); + starsPath.addRoundRect(giftButtonRect, AndroidUtilities.dp(16), AndroidUtilities.dp(16), Path.Direction.CW); + canvas.save(); + canvas.clipPath(starsPath); + starParticlesDrawable.onDraw(canvas); + if (!starParticlesDrawable.paused) { + invalidate(); + } + canvas.restore(); + + canvas.save(); + canvas.translate(x, y); + giftPremiumButtonLayout.draw(canvas); + canvas.restore(); + } } public void drawBackground(Canvas canvas, boolean fromParent) { @@ -569,7 +970,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD overrideBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); overrideBackgroundPaint.setColor(color); overrideTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); - overrideTextPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + overrideTextPaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); overrideTextPaint.setTextSize(AndroidUtilities.dp(Math.max(16, SharedConfig.fontSize) - 2)); overrideTextPaint.setColor(getThemedColor(overrideText)); } @@ -727,6 +1128,17 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD canvas.drawPath(backgroundPath, Theme.chat_actionBackgroundGradientDarkenPaint); } + MessageObject messageObject = currentMessageObject; + if (messageObject != null && messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) { + float x = (getWidth() - giftRectSize) / 2f, y = textY + textHeight + AndroidUtilities.dp(12); + AndroidUtilities.rectTmp.set(x, y, x + giftRectSize, y + giftRectSize); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(16), AndroidUtilities.dp(16), backgroundPaint); + + if (hasGradientService()) { + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(16), AndroidUtilities.dp(16), Theme.chat_actionBackgroundGradientDarkenPaint); + } + } + if (oldAlpha >= 0) { backgroundPaint.setAlpha(oldAlpha); Theme.chat_actionBackgroundGradientDarkenPaint.setAlpha(oldAlpha2); @@ -744,16 +1156,17 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD @Override public void onSuccessDownload(String fileName) { - if (currentMessageObject != null && currentMessageObject.type == 11) { + MessageObject messageObject = currentMessageObject; + if (messageObject != null && messageObject.type == 11) { TLRPC.PhotoSize strippedPhotoSize = null; - for (int a = 0, N = currentMessageObject.photoThumbs.size(); a < N; a++) { - TLRPC.PhotoSize photoSize = currentMessageObject.photoThumbs.get(a); + for (int a = 0, N = messageObject.photoThumbs.size(); a < N; a++) { + TLRPC.PhotoSize photoSize = messageObject.photoThumbs.get(a); if (photoSize instanceof TLRPC.TL_photoStrippedSize) { strippedPhotoSize = photoSize; break; } } - imageReceiver.setImage(currentVideoLocation, ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForObject(strippedPhotoSize, currentMessageObject.photoThumbsObject), "50_50_b", avatarDrawable, 0, null, currentMessageObject, 1); + imageReceiver.setImage(currentVideoLocation, ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForObject(strippedPhotoSize, messageObject.photoThumbsObject), "50_50_b", avatarDrawable, 0, null, messageObject, 1); DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this); } } @@ -778,11 +1191,12 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); - if (TextUtils.isEmpty(customText) && currentMessageObject == null) { + MessageObject messageObject = currentMessageObject; + if (TextUtils.isEmpty(customText) && messageObject == null) { return; } if (accessibilityText == null) { - CharSequence text = !TextUtils.isEmpty(customText) ? customText : currentMessageObject.messageText; + CharSequence text = !TextUtils.isEmpty(customText) ? customText : messageObject.messageText; SpannableStringBuilder sb = new SpannableStringBuilder(text); CharacterStyle[] links = sb.getSpans(0, sb.length(), ClickableSpan.class); for (CharacterStyle link : links) { 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 c3a73afd5..f18509549 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -107,6 +107,8 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AnimatedFileDrawable; import org.telegram.ui.Components.AnimatedNumberLayout; import org.telegram.ui.Components.AnimationProperties; @@ -150,7 +152,6 @@ import org.telegram.ui.PinchToZoomHelper; import org.telegram.ui.SecretMediaViewer; import java.io.File; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -163,9 +164,12 @@ import java.util.concurrent.atomic.AtomicReference; public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate, ImageReceiver.ImageReceiverDelegate, DownloadController.FileDownloadProgressListener, TextSelectionHelper.SelectableView, NotificationCenter.NotificationCenterDelegate { public boolean clipToGroupBounds; + public boolean drawForBlur; private boolean flipImage; private boolean visibleOnScreen; public boolean shouldCheckVisibleOnScreen; + float parentBoundsTop; + int parentBoundsBottom; public RadialProgress2 getRadialProgress() { return radialProgress; @@ -341,6 +345,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } + public void setParentBounds(float chatListViewPaddingTop, int blurredViewBottomOffset) { + parentBoundsTop = chatListViewPaddingTop; + parentBoundsBottom = blurredViewBottomOffset; + if (photoImageOutOfBounds) { + float top = getY() + photoImage.getImageY(); + float bottom = top + photoImage.getImageHeight(); + if (bottom >= parentBoundsTop && top <= parentBoundsBottom) { + invalidate(); + } + } + } + public interface ChatMessageCellDelegate { default void didPressUserAvatar(ChatMessageCell cell, TLRPC.User user, float touchX, float touchY) { } @@ -966,6 +982,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private boolean replyPanelIsForward; private boolean animationRunning; private boolean willRemoved; + public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiStack; + public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiReplyStack; + public AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiDescriptionStack; private ChatMessageCellDelegate delegate; @@ -992,6 +1011,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private final TransitionParams transitionParams = new TransitionParams(); private boolean edited; private boolean imageDrawn; + private boolean photoImageOutOfBounds; private Runnable unregisterFlagSecure; @@ -3100,6 +3120,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate firstVisibleBlockNum = newFirst; totalVisibleBlocksCount = newCount; invalidate(); + } else if (animatedEmojiStack != null) { + for (int i = 0; i < animatedEmojiStack.holders.size(); i++) { + AnimatedEmojiSpan.AnimatedEmojiHolder holder = animatedEmojiStack.holders.get(i); + if (holder != null && holder.skipDraw) { + float top = parentBoundsTop - getY() - holder.drawingYOffset; + float bottom = parentBoundsBottom - getY() - holder.drawingYOffset; + if (!holder.outOfBounds(top, bottom)) { + invalidate(); + break; + } + } + } } } @@ -3305,6 +3337,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate return null; } + public void updateAnimatedEmojis() { + if (!imageReceiversAttachState) { + return; + } + int cache = currentMessageObject.wasJustSent ? AnimatedEmojiDrawable.getCacheTypeForEnterView() : AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES; + if (captionLayout != null) { + animatedEmojiStack = AnimatedEmojiSpan.update(cache, this, false, animatedEmojiStack, captionLayout); + } else { + animatedEmojiStack = AnimatedEmojiSpan.update(cache, this, delegate == null || !delegate.canDrawOutboundsContent(), animatedEmojiStack, currentMessageObject.textLayoutBlocks); + } + } + private void updateCaptionSpoilers() { captionSpoilersPool.addAll(captionSpoilers); captionSpoilers.clear(); @@ -3476,6 +3520,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.stopSpoilers); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.userInfoDidLoad); +// if (currentMessageObject != null) { +// currentMessageObject.onAttachedWindow(this); +// } if (currentMessageObject != null) { currentMessageObject.animateComments = false; } @@ -3529,7 +3576,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate toSeekBarProgress = showSeekbar ? 1f : 0f; } reactionsLayoutInBubble.onAttachToWindow(); - updateFlagSecure(); } @@ -3585,6 +3631,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate updateButtonState(false, false, false); } } + animatedEmojiReplyStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, false, animatedEmojiReplyStack, replyTextLayout); + animatedEmojiDescriptionStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, false, animatedEmojiDescriptionStack, descriptionLayout); + updateAnimatedEmojis(); } else { radialProgress.onDetachedFromWindow(); videoRadialProgress.onDetachedFromWindow(); @@ -3602,7 +3651,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate locationImageReceiver.onDetachedFromWindow(); photoImage.onDetachedFromWindow(); - if (currentMessageObject != null && !currentMessageObject.mediaExists && !currentMessageObject.putInDownloadsStore) { + if (currentMessageObject != null && !currentMessageObject.mediaExists && !currentMessageObject.putInDownloadsStore && !DownloadController.getInstance(currentAccount).isDownloading(currentMessageObject.messageOwner.id)) { TLRPC.Document document = currentMessageObject.getDocument(); boolean loadDocumentFromImageReceiver = MessageObject.isStickerDocument(document) || MessageObject.isAnimatedStickerDocument(document, true) || MessageObject.isGifDocument(document) || MessageObject.isRoundVideoDocument(document); if (!loadDocumentFromImageReceiver) { @@ -3616,6 +3665,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } } + AnimatedEmojiSpan.release(this, animatedEmojiDescriptionStack); + AnimatedEmojiSpan.release(this, animatedEmojiReplyStack); + AnimatedEmojiSpan.release(this, animatedEmojiStack); } } @@ -3771,6 +3823,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate adminLayout = null; checkOnlyButtonPressed = false; replyTextLayout = null; + AnimatedEmojiSpan.release(this, animatedEmojiReplyStack); lastReplyMessage = null; hasEmbed = false; autoPlayingMedia = false; @@ -4238,13 +4291,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate int linkPreviewMaxWidth; if (AndroidUtilities.isTablet()) { if (drawAvatar) { - linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(132); + linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80 + 52); } else { linkPreviewMaxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80); } } else { if (drawAvatar) { - linkPreviewMaxWidth = getParentWidth() - AndroidUtilities.dp(132); + linkPreviewMaxWidth = getParentWidth() - AndroidUtilities.dp(80 + 52); } else { linkPreviewMaxWidth = getParentWidth() - AndroidUtilities.dp(80); } @@ -4486,6 +4539,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate restLines = restLinesCount; descriptionLayout = generateStaticLayout(messageObject.linkDescription, Theme.chat_replyTextPaint, linkPreviewMaxWidth, linkPreviewMaxWidth - smallImageSide - smallSideMargin, restLinesCount, allowAllLines ? 100 : 6); } + animatedEmojiDescriptionStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, false, animatedEmojiDescriptionStack, descriptionLayout); int height = descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1); linkPreviewHeight += height; totalHeight += height; @@ -5855,20 +5909,43 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } additionHeight += reactionsLayoutInBubble.totalHeight; } + } else if (messageObject.type == MessageObject.TYPE_EMOJIS) { + drawBackground = false; + photoWidth = (int) messageObject.textWidth; + photoHeight = (int) messageObject.textHeight + AndroidUtilities.dp(32); + backgroundWidth = photoWidth + AndroidUtilities.dp(14); + availableTimeWidth = photoWidth - AndroidUtilities.dp(12); + int maxWidth; + if (AndroidUtilities.isTablet()) { + maxWidth = (int) (AndroidUtilities.getMinTabletSide() * 0.4f); + } else { + maxWidth = (int) (Math.min(getParentWidth(), AndroidUtilities.displaySize.y) * 0.5f); + } + if (!reactionsLayoutInBubble.isSmall) { + reactionsLayoutInBubble.measure(maxWidth, currentMessageObject.isOutOwner() ? Gravity.RIGHT : Gravity.LEFT); + reactionsLayoutInBubble.drawServiceShaderBackground = true; + reactionsLayoutInBubble.totalHeight = reactionsLayoutInBubble.height;// + AndroidUtilities.dp(8); + additionHeight += reactionsLayoutInBubble.totalHeight; + reactionsLayoutInBubble.positionOffsetY += AndroidUtilities.dp(12); + } + additionHeight -= AndroidUtilities.dp(17); } else if (messageObject.isAnyKindOfSticker()) { drawBackground = false; boolean isWebpSticker = messageObject.type == MessageObject.TYPE_STICKER; - for (int a = 0; a < messageObject.getDocument().attributes.size(); a++) { - TLRPC.DocumentAttribute attribute = messageObject.getDocument().attributes.get(a); - if (attribute instanceof TLRPC.TL_documentAttributeImageSize) { - photoWidth = attribute.w; - photoHeight = attribute.h; - break; - } - if (attribute instanceof TLRPC.TL_documentAttributeVideo) { - photoWidth = attribute.w; - photoHeight = attribute.h; - break; + TLRPC.Document stickerDocument = messageObject.getDocument(); + if (stickerDocument != null) { + for (int a = 0; a < stickerDocument.attributes.size(); a++) { + TLRPC.DocumentAttribute attribute = stickerDocument.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeImageSize) { + photoWidth = attribute.w; + photoHeight = attribute.h; + break; + } + if (attribute instanceof TLRPC.TL_documentAttributeVideo) { + photoWidth = attribute.w; + photoHeight = attribute.h; + break; + } } } if ((messageObject.isAnimatedSticker() || messageObject.isVideoSticker()) && photoWidth == 0 && photoHeight == 0) { @@ -5908,6 +5985,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate currentPhotoObjectThumbStripped = currentMessageObject.strippedThumb; } photoParentObject = messageObject.photoThumbsObject; + Drawable thumb = null; if (messageObject.isDice()) { filter = String.format(Locale.US, "%d_%d_dice_%s_%s", w, h, messageObject.getDiceEmoji(), messageObject.toString()); photoImage.setAutoRepeat(2); @@ -5928,9 +6006,23 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } } else if (messageObject.isAnimatedEmoji()) { - filter = String.format(Locale.US, "%d_%d_nr_messageId=%d" + messageObject.emojiAnimatedStickerColor, w, h, messageObject.stableId); - photoImage.setAutoRepeat(shouldRepeatSticker ? 2 : 3); - parentObject = MessageObject.getInputStickerSet(messageObject.emojiAnimatedSticker); + if (messageObject.emojiAnimatedSticker == null && messageObject.emojiAnimatedStickerId != null) { + filter = String.format(Locale.US, "%d_%d_nr_messageId=%d", w, h, messageObject.stableId); + thumb = DocumentObject.getCircleThumb(.4f, Theme.key_chat_serviceBackground, resourcesProvider, 0.65f); + photoImage.setAutoRepeat(1); + messageObject.loadAnimatedEmojiDocument(); + } else { + filter = String.format(Locale.US, "%d_%d_nr_messageId=%d" + messageObject.emojiAnimatedStickerColor, w, h, messageObject.stableId); + if (MessageObject.isAnimatedEmoji(messageObject.emojiAnimatedSticker)) { + photoImage.setAutoRepeat(1); + } else { + photoImage.setAutoRepeat(shouldRepeatSticker ? 2 : 3); + } + parentObject = MessageObject.getInputStickerSet(messageObject.emojiAnimatedSticker); + if (messageObject.emojiAnimatedStickerId != null) { + photoImage.setCrossfadeWithOldImage(true); + } + } } else if (SharedConfig.loopStickers || (isWebpSticker && !messageObject.isVideoSticker())) { filter = String.format(Locale.US, "%d_%d", w, h); photoImage.setAutoRepeat(1); @@ -5947,35 +6039,41 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (!messageObject.isOutOwner() && MessageObject.isPremiumSticker(messageObject.getDocument())) { flipImage = true; } - if (messageObject.isVideoSticker()) { - if (!SharedConfig.loopStickers) { - photoImage.animatedFileDrawableRepeatMaxCount = 1; + if (messageObject.getDocument() != null) { + if (messageObject.isVideoSticker()) { + if (!SharedConfig.loopStickers) { + photoImage.animatedFileDrawableRepeatMaxCount = 1; + } + photoImage.setImage(ImageLocation.getForDocument(messageObject.getDocument()), ImageLoader.AUTOPLAY_FILTER, + null, null, + messageObject.pathThumb, + messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); + } else if (messageObject.pathThumb != null) { + photoImage.setImage(ImageLocation.getForDocument(messageObject.getDocument()), filter, + messageObject.pathThumb, + messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); + } else if (messageObject.attachPathExists) { + photoImage.setImage(ImageLocation.getForPath(messageObject.messageOwner.attachPath), filter, + ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), "b1", thumb != null ? thumb : currentPhotoObjectThumbStripped, + messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); + } else if (messageObject.getDocument().id != 0) { + photoImage.setImage(ImageLocation.getForDocument(messageObject.getDocument()), filter, + 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(ImageLocation.getForDocument(messageObject.getDocument()), ImageLoader.AUTOPLAY_FILTER, - null, null, - messageObject.pathThumb, - messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); - } else if (messageObject.pathThumb != null) { - photoImage.setImage(ImageLocation.getForDocument(messageObject.getDocument()), filter, - messageObject.pathThumb, - messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); - } else if (messageObject.attachPathExists) { - photoImage.setImage(ImageLocation.getForPath(messageObject.messageOwner.attachPath), filter, - ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), "b1", currentPhotoObjectThumbStripped, - messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); - } else if (messageObject.getDocument().id != 0) { - photoImage.setImage(ImageLocation.getForDocument(messageObject.getDocument()), filter, - ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), "b1", currentPhotoObjectThumbStripped, - messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); } else { - photoImage.setImage(null, null, null, null, messageObject, 0); + photoImage.setImage(null, null, thumb, null, messageObject, 0); } if (!reactionsLayoutInBubble.isSmall) { - reactionsLayoutInBubble.measure(maxWidth, Gravity.LEFT); + reactionsLayoutInBubble.measure(maxWidth, currentMessageObject.isOutOwner() && currentMessageObject.isAnimatedEmoji() ? Gravity.RIGHT : Gravity.LEFT); reactionsLayoutInBubble.drawServiceShaderBackground = true; reactionsLayoutInBubble.totalHeight = reactionsLayoutInBubble.height + AndroidUtilities.dp(8); additionHeight += reactionsLayoutInBubble.totalHeight; - reactionsLayoutInBubble.positionOffsetY += AndroidUtilities.dp(4); + if (!currentMessageObject.isAnimatedEmoji()) { + reactionsLayoutInBubble.positionOffsetY += AndroidUtilities.dp(4); + } } } else { currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize()); @@ -6082,25 +6180,28 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } if ((w == 0 || h == 0) && messageObject.type == 8) { - for (int a = 0; a < messageObject.getDocument().attributes.size(); a++) { - TLRPC.DocumentAttribute attribute = messageObject.getDocument().attributes.get(a); - if (attribute instanceof TLRPC.TL_documentAttributeImageSize || attribute instanceof TLRPC.TL_documentAttributeVideo) { - float scale = (float) attribute.w / (float) photoWidth; - w = (int) (attribute.w / scale); - h = (int) (attribute.h / scale); - if (h > photoHeight) { - float scale2 = h; - h = photoHeight; - scale2 /= h; - w = (int) (w / scale2); - } else if (h < AndroidUtilities.dp(120)) { - h = AndroidUtilities.dp(120); - float hScale = (float) attribute.h / h; - if (attribute.w / hScale < photoWidth) { - w = (int) (attribute.w / hScale); + TLRPC.Document document = messageObject.getDocument(); + if (document != null) { + for (int a = 0; a < document.attributes.size(); a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeImageSize || attribute instanceof TLRPC.TL_documentAttributeVideo) { + float scale = (float) attribute.w / (float) photoWidth; + w = (int) (attribute.w / scale); + h = (int) (attribute.h / scale); + if (h > photoHeight) { + float scale2 = h; + h = photoHeight; + scale2 /= h; + w = (int) (w / scale2); + } else if (h < AndroidUtilities.dp(120)) { + h = AndroidUtilities.dp(120); + float hScale = (float) attribute.h / h; + if (attribute.w / hScale < photoWidth) { + w = (int) (attribute.w / hScale); + } } + break; } - break; } } } @@ -6447,10 +6548,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photoImage.startAnimation(); TLRPC.Document document = messageObject.getDocument(); - if (currentMessageObject.videoEditedInfo != null && currentMessageObject.videoEditedInfo.canAutoPlaySourceVideo()) { + if (currentMessageObject.videoEditedInfo != null && currentMessageObject.videoEditedInfo.canAutoPlaySourceVideo() && messageObject.getDocument() != null) { photoImage.setImage(ImageLocation.getForPath(currentMessageObject.videoEditedInfo.originalPath), ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForObject(currentPhotoObject, photoParentObject), currentPhotoFilter, ImageLocation.getForDocument(currentPhotoObjectThumb, document), currentPhotoFilterThumb, currentPhotoObjectThumbStripped, messageObject.getDocument().size, null, messageObject, 0); photoImage.setMediaStartEndTime(currentMessageObject.videoEditedInfo.startTime / 1000, currentMessageObject.videoEditedInfo.endTime / 1000); - } else { + } else if (messageObject.getDocument() != null) { if (!messageIdChanged && !dataChanged) { photoImage.setCrossfadeWithOldImage(true); } @@ -6557,7 +6658,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate namesOffset += AndroidUtilities.dp(7); } totalHeight = photoHeight + AndroidUtilities.dp(14) + namesOffset + additionHeight; - if (currentPosition != null && (currentPosition.flags & MessageObject.POSITION_FLAG_BOTTOM) == 0 && !currentMessageObject.isDocument()) { + if (currentPosition != null && (currentPosition.flags & MessageObject.POSITION_FLAG_BOTTOM) == 0 && !currentMessageObject.isDocument() && currentMessageObject.type != MessageObject.TYPE_EMOJIS) { totalHeight -= AndroidUtilities.dp(3); } if (currentMessageObject.isDice()) { @@ -6577,17 +6678,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } - if (drawPinnedTop) { - namesOffset -= AndroidUtilities.dp(1); - } - - int y; - if (namesOffset > 0) { - y = AndroidUtilities.dp(7); - totalHeight -= AndroidUtilities.dp(2); - } else { - y = AndroidUtilities.dp(5); - totalHeight -= AndroidUtilities.dp(4); + int y = 0; + if (currentMessageObject.type != MessageObject.TYPE_EMOJIS) { + if (drawPinnedTop) { + namesOffset -= AndroidUtilities.dp(1); + } + if (namesOffset > 0) { + y = AndroidUtilities.dp(7); + totalHeight -= AndroidUtilities.dp(2); + } else { + y = AndroidUtilities.dp(5); + totalHeight -= AndroidUtilities.dp(4); + } } if (currentPosition != null && currentMessagesGroup.isDocuments && currentMessagesGroup.messages.size() > 1) { if ((currentPosition.flags & MessageObject.POSITION_FLAG_TOP) == 0) { @@ -6672,7 +6774,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } if ((currentPosition == null || (currentPosition.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0) && captionLayout == null && widthBeforeNewTimeLine != -1 && availableTimeWidth - widthBeforeNewTimeLine < timeWidth) { - totalHeight += AndroidUtilities.dp(14); +// totalHeight += AndroidUtilities.dp(14); } if (currentMessageObject.eventId != 0 && !currentMessageObject.isMediaEmpty() && currentMessageObject.messageOwner.media.webpage != null) { @@ -6868,12 +6970,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } else if (drawPinnedTop && pinnedBottom && currentPosition != null && currentPosition.siblingHeights == null) { totalHeight -= AndroidUtilities.dp(1); } - if (messageObject.isAnyKindOfSticker() && totalHeight < AndroidUtilities.dp(70)) { - additionalTimeOffsetY = AndroidUtilities.dp(70) - totalHeight; - totalHeight += additionalTimeOffsetY; - } else if (messageObject.isAnimatedEmoji()) { - additionalTimeOffsetY = AndroidUtilities.dp(16); - totalHeight += AndroidUtilities.dp(16); + if (messageObject.type != MessageObject.TYPE_EMOJIS) { + if (messageObject.isAnyKindOfSticker() && totalHeight < AndroidUtilities.dp(70)) { + additionalTimeOffsetY = AndroidUtilities.dp(70) - totalHeight; + totalHeight += additionalTimeOffsetY; + } else if (messageObject.isAnimatedEmoji()) { + additionalTimeOffsetY = AndroidUtilities.dp(16); + totalHeight += AndroidUtilities.dp(16); + } } if (!drawPhotoImage) { photoImage.setImageBitmap((Drawable) null); @@ -6954,9 +7058,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } photoImage.setRoundRadius(tl, tr, br, bl); } - if (currentMessageObject != null && currentMessageObject.viewRef != null && (currentMessageObject.viewRef.get() == null || currentMessageObject.viewRef.get().get() != this)) { - currentMessageObject.viewRef.set(new WeakReference<>(this)); - } + updateAnimatedEmojis(); } if (messageIdChanged) { currentUrl = null; @@ -7252,6 +7354,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate parent.invalidate((int) getX() + l, (int) getY() + t, (int) getX() + r, (int) getY() + b); } } + if (isBlurred && delegate != null) { + delegate.invalidateBlur(); + } } public boolean isHighlightedAnimated() { @@ -8374,7 +8479,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate imageDrawn = false; radialProgress.setCircleCrossfadeColor(null, 0.0f, 1.0f); - if (currentMessageObject.type == 0) { + if (currentMessageObject.type == 0 || currentMessageObject.type == MessageObject.TYPE_EMOJIS) { if (currentMessageObject.isOutOwner()) { textX = getCurrentBackgroundLeft() + AndroidUtilities.dp(11) + getExtraTextX(); } else { @@ -8391,8 +8496,15 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (siteNameLayout != null) { textY += siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1); } + } else if (currentMessageObject.type == MessageObject.TYPE_EMOJIS) { + textY = AndroidUtilities.dp(6) + namesOffset; + if (!currentMessageObject.isOut()) { + textX = getCurrentBackgroundLeft(); + } else { + textX -= AndroidUtilities.dp(4); + } } else { - textY = AndroidUtilities.dp(10) + namesOffset; + textY = AndroidUtilities.dp(8) + namesOffset; } unmovedTextX = textX; if (currentMessageObject.textXOffset != 0 && replyNameLayout != null) { @@ -8405,6 +8517,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } if (!enterTransitionInProgress && currentMessageObject != null && !currentMessageObject.preview) { + if (!drawForBlur && animatedEmojiStack != null && ((currentMessageObject.textLayoutBlocks != null && !currentMessageObject.textLayoutBlocks.isEmpty()) || (transitionParams.animateOutTextBlocks != null && !transitionParams.animateOutTextBlocks.isEmpty()))) { + animatedEmojiStack.clearPositions(); + } if (transitionParams.animateChangeProgress != 1.0f && transitionParams.animateMessageText) { canvas.save(); if (currentBackgroundDrawable != null) { @@ -8489,13 +8604,23 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photoImage.setSideClip(0); } if (delegate == null || delegate.getPinchToZoomHelper() == null || !delegate.getPinchToZoomHelper().isInOverlayModeFor(this)) { - if (flipImage) { - canvas.save(); - canvas.scale(-1f, 1, photoImage.getCenterX(), photoImage.getCenterY()); - photoImage.draw(canvas); - canvas.restore(); - } else { - imageDrawn = photoImage.draw(canvas); + float top = getY() + photoImage.getImageY(); + float bottom = top + photoImage.getImageHeight(); + photoImageOutOfBounds = false; + if ((parentBoundsTop != 0 || parentBoundsBottom != 0) && (bottom < parentBoundsTop || top > parentBoundsBottom)) { + photoImageOutOfBounds = true; + } + if (!photoImageOutOfBounds || drawForBlur) { + photoImage.setSkipUpdateFrame(drawForBlur); + if (flipImage) { + canvas.save(); + canvas.scale(-1f, 1, photoImage.getCenterX(), photoImage.getCenterY()); + imageDrawn = photoImage.draw(canvas); + canvas.restore(); + } else { + imageDrawn = photoImage.draw(canvas); + } + photoImage.setSkipUpdateFrame(false); } } boolean drawTimeOld = drawTime; @@ -8731,7 +8856,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate updateCaptionLayout(); } updateReactionLayoutPosition(); - if (!currentMessageObject.preview && (currentPosition == null || (currentMessagesGroup != null && currentMessagesGroup.isDocuments && (currentPosition.flags & MessageObject.POSITION_FLAG_BOTTOM) == 0)) && !transitionParams.animateBackgroundBoundsInner && !(enterTransitionInProgress && currentMessageObject.isVoice())) { + if (shouldDrawCaptionLayout()) { drawCaptionLayout(canvas, false, 1f); } @@ -8777,6 +8902,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.save(); canvas.translate(linkX + AndroidUtilities.dp(10) + descriptionX, descriptionY); descriptionLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, descriptionLayout, animatedEmojiDescriptionStack, 0, null, 0, 0, 0, 1f); canvas.restore(); } drawTime = true; @@ -8910,12 +9036,26 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private void updateReactionLayoutPosition() { if (!reactionsLayoutInBubble.isEmpty && (currentPosition == null || ((currentPosition.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0 && (currentPosition.flags & MessageObject.POSITION_FLAG_LEFT) != 0)) && !reactionsLayoutInBubble.isSmall) { - if (currentMessageObject.isOutOwner()) { - reactionsLayoutInBubble.x = getCurrentBackgroundLeft() + AndroidUtilities.dp(11); + if (currentMessageObject.type == MessageObject.TYPE_EMOJIS || currentMessageObject.isAnimatedEmoji()) { + if (currentMessageObject.isOutOwner()) { + int maxWidth; + if (AndroidUtilities.isTablet()) { + maxWidth = (int) (AndroidUtilities.getMinTabletSide() * 0.4f); + } else { + maxWidth = (int) (Math.min(getParentWidth(), AndroidUtilities.displaySize.y) * 0.5f); + } + reactionsLayoutInBubble.x = AndroidUtilities.displaySize.x - maxWidth - AndroidUtilities.dp(17); + } else { + reactionsLayoutInBubble.x = getCurrentBackgroundLeft(); + } } else { - reactionsLayoutInBubble.x = getCurrentBackgroundLeft() + AndroidUtilities.dp(!mediaBackground && drawPinnedBottom ? 11 : 17); - if (mediaBackground) { - reactionsLayoutInBubble.x -= AndroidUtilities.dp(9); + if (currentMessageObject.isOutOwner()) { + reactionsLayoutInBubble.x = getCurrentBackgroundLeft() + AndroidUtilities.dp(11); + } else { + reactionsLayoutInBubble.x = getCurrentBackgroundLeft() + AndroidUtilities.dp(!mediaBackground && drawPinnedBottom ? 11 : 17); + if (mediaBackground) { + reactionsLayoutInBubble.x -= AndroidUtilities.dp(9); + } } } reactionsLayoutInBubble.y = getBackgroundDrawableBottom() - AndroidUtilities.dp(10) - reactionsLayoutInBubble.height; @@ -9135,6 +9275,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate delegate.getTextSelectionHelper().drawDescription(currentMessageObject.isOutOwner(), descriptionLayout, canvas); } descriptionLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, descriptionLayout, animatedEmojiDescriptionStack, 0, null, 0, 0, 0, 1f); canvas.restore(); linkPreviewY += descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1); } @@ -9445,7 +9586,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.drawPath(urlPathSelection.get(b), Theme.chat_textSearchSelectionPaint); } } - if (delegate.getTextSelectionHelper() != null && transitionParams.animateChangeProgress == 1f && !drawOnlyText) { delegate.getTextSelectionHelper().draw(currentMessageObject, block, canvas); } @@ -9469,6 +9609,27 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } + public AnimatedEmojiSpan[] getAnimatedEmojiSpans() { + AnimatedEmojiSpan[] messageTextSpans = currentMessageObject != null && currentMessageObject.messageText instanceof Spanned ? ((Spanned) currentMessageObject.messageText).getSpans(0, currentMessageObject.messageText.length(), AnimatedEmojiSpan.class) : null; + AnimatedEmojiSpan[] captionTextSpans = currentMessageObject != null && currentMessageObject.caption instanceof Spanned ? ((Spanned) currentMessageObject.caption).getSpans(0, currentMessageObject.caption.length(), AnimatedEmojiSpan.class) : null; + if ((messageTextSpans == null || messageTextSpans.length == 0) && (captionTextSpans == null || captionTextSpans.length == 0)) { + return null; + } + AnimatedEmojiSpan[] array = new AnimatedEmojiSpan[(messageTextSpans == null ? 0 : messageTextSpans.length) + (captionTextSpans == null ? 0 : captionTextSpans.length)]; + int j = 0; + if (messageTextSpans != null) { + for (int i = 0; i < messageTextSpans.length; ++i, ++j) { + array[j] = messageTextSpans[i]; + } + } + if (captionTextSpans != null) { + for (int i = 0; i < captionTextSpans.length; ++i, ++j) { + array[j] = captionTextSpans[i]; + } + } + return array; + } + public void updateCaptionLayout() { if (currentMessageObject.type == MessageObject.TYPE_PHOTO || documentAttachType == DOCUMENT_ATTACH_TYPE_VIDEO || currentMessageObject.type == 8) { float x, y, h; @@ -9631,6 +9792,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } return firstLineWidth - AndroidUtilities.dp(31 + (isAvatarVisible ? 48 : 0)); + } else if (currentMessageObject.type == MessageObject.TYPE_EMOJIS) { + return AndroidUtilities.displaySize.x - (currentMessageObject.textWidth + AndroidUtilities.dp(14)) - AndroidUtilities.dp(52) - (isAvatarVisible ? AndroidUtilities.dp(48) : 0); } else { return backgroundWidth - AndroidUtilities.dp(mediaBackground ? 22 : 31); } @@ -10592,6 +10755,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } } + edited = edited && !currentMessageObject.isVoiceTranscriptionOpen(); if (currentMessageObject.isSponsored()) { timeString = LocaleController.getString("SponsoredMessage", R.string.SponsoredMessage); } else if (currentMessageObject.scheduled && currentMessageObject.messageOwner.date == 0x7FFFFFFE) { @@ -11085,8 +11249,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } mess = mess.replace('\n', ' '); stringFinalText = Emoji.replaceEmoji(mess, Theme.chat_replyTextPaint.getFontMetricsInt(), AndroidUtilities.dp(14), false); + if (messageObject.replyMessageObject.messageOwner != null) { + stringFinalText = MessageObject.replaceAnimatedEmoji(stringFinalText, messageObject.replyMessageObject.messageOwner.entities, Theme.chat_replyTextPaint.getFontMetricsInt()); + } stringFinalText = TextUtils.ellipsize(stringFinalText, Theme.chat_replyTextPaint, maxWidth, TextUtils.TruncateAt.END); - if (stringFinalText instanceof Spannable) { + if (stringFinalText instanceof Spannable && messageObject.replyMessageObject.messageOwner != null) { MediaDataController.addTextStyleRuns(messageObject.replyMessageObject.messageOwner.entities, messageObject.replyMessageObject.caption, (Spannable) stringFinalText); } } else if (messageObject.replyMessageObject.messageText != null && messageObject.replyMessageObject.messageText.length() > 0) { @@ -11096,6 +11263,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } mess = mess.replace('\n', ' '); stringFinalText = Emoji.replaceEmoji(mess, Theme.chat_replyTextPaint.getFontMetricsInt(), AndroidUtilities.dp(14), false); + if (messageObject.replyMessageObject.messageOwner != null) { + stringFinalText = MessageObject.replaceAnimatedEmoji(stringFinalText, messageObject.replyMessageObject.messageOwner.entities, Theme.chat_replyTextPaint.getFontMetricsInt()); + } stringFinalText = TextUtils.ellipsize(stringFinalText, Theme.chat_replyTextPaint, maxWidth, TextUtils.TruncateAt.END); if (stringFinalText instanceof Spannable) { MediaDataController.addTextStyleRuns(messageObject.replyMessageObject, (Spannable) stringFinalText); @@ -11133,13 +11303,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate String fromFormattedString = LocaleController.getString("FromFormatted", R.string.FromFormatted); int idx = fromFormattedString.indexOf("%1$s"); int fromWidth = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(from + " ")); - CharSequence n = TextUtils.ellipsize(currentForwardNameString == null ? "" : currentForwardNameString.replace('\n', ' '), Theme.chat_replyNamePaint, maxWidth - fromWidth, TextUtils.TruncateAt.END); - SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format(fromFormattedString, n)); + CharSequence text = currentForwardNameString == null ? "" : currentForwardNameString.replace('\n', ' '); + CharSequence ellipsizedText = TextUtils.ellipsize(text, Theme.chat_replyNamePaint, maxWidth - fromWidth, TextUtils.TruncateAt.END); + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(String.format(fromFormattedString, ellipsizedText)); if (idx >= 0 && (currentForwardName == null || messageObject.messageOwner.fwd_from.from_id != null)) { - stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), idx, idx + n.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + stringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), idx, idx + ellipsizedText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } stringFinalText = TextUtils.ellipsize(stringBuilder, Theme.chat_replyTextPaint, maxWidth, TextUtils.TruncateAt.END); - forwardNameCenterX = fromWidth + (int) Math.ceil(Theme.chat_replyNamePaint.measureText(n, 0, n.length())) / 2; + forwardNameCenterX = fromWidth + (int) Math.ceil(Theme.chat_replyNamePaint.measureText(ellipsizedText, 0, ellipsizedText.length())) / 2; } } CharSequence stringFinalName = name == null ? "" : TextUtils.ellipsize(name.replace('\n', ' '), Theme.chat_replyNamePaint, maxWidth, TextUtils.TruncateAt.END); @@ -11182,6 +11353,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate replySpoilers.clear(); if (getMessageObject().replyMessageObject != null && !getMessageObject().replyMessageObject.isSpoilersRevealed) SpoilerEffect.addSpoilers(this, replyTextLayout, replySpoilersPool, replySpoilers); + animatedEmojiReplyStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, false, animatedEmojiReplyStack, replyTextLayout); } } catch (Exception e) { FileLog.e(e); @@ -11357,6 +11529,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate onLayout(false, getLeft(), getTop(), getRight(), getBottom()); } + if (enterTransitionInProgress && currentMessageObject.isAnimatedEmojiStickers()) { + return; + } + if (currentMessageObject.isOutOwner()) { Theme.chat_msgTextPaint.setColor(getThemedColor(Theme.key_chat_messageTextOut)); Theme.chat_msgGameTextPaint.setColor(getThemedColor(Theme.key_chat_messageTextOut)); @@ -11470,7 +11646,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.restore(); } - if (delegate == null || delegate.canDrawOutboundsContent() || getAlpha() != 1f) { + if (delegate == null || delegate.canDrawOutboundsContent() || transitionParams.messageEntering || getAlpha() != 1f) { drawOutboundsContent(canvas); } @@ -11993,10 +12169,22 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (getAlpha() != 1f) { return false; } - return (!transitionParams.transitionBotButtons.isEmpty() && transitionParams.animateBotButtonsChanged) || !botButtons.isEmpty() || drawSideButton != 0; + return ( + (!transitionParams.transitionBotButtons.isEmpty() && transitionParams.animateBotButtonsChanged) || + !botButtons.isEmpty() || + drawSideButton != 0 || + animatedEmojiStack != null && !animatedEmojiStack.holders.isEmpty() || + currentMessagesGroup == null && + (transitionParams.animateReplaceCaptionLayout && transitionParams.animateChangeProgress != 1f || transitionParams.animateChangeProgress != 1.0f && transitionParams.animateMessageText) && + transitionParams.animateOutAnimateEmoji != null && !transitionParams.animateOutAnimateEmoji.holders.isEmpty() + ); } public void drawOutboundsContent(Canvas canvas) { + if (!enterTransitionInProgress) { + drawAnimatedEmojis(canvas, 1f); + } + if (!transitionParams.transitionBotButtons.isEmpty() && transitionParams.animateBotButtonsChanged) { drawBotButtons(canvas, transitionParams.transitionBotButtons, 1f - transitionParams.animateChangeProgress); } @@ -12006,6 +12194,127 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate drawSideButton(canvas); } + public void drawAnimatedEmojis(Canvas canvas, float alpha) { + drawAnimatedEmojiMessageText(canvas, alpha); +// if (shouldDrawCaptionLayout()) { +// drawAnimatedEmojiCaption(canvas, 1f); +// } + } + + private void drawAnimatedEmojiMessageText(Canvas canvas, float alpha) { + if (transitionParams.animateChangeProgress != 1.0f && transitionParams.animateMessageText) { + canvas.save(); + if (currentBackgroundDrawable != null) { + Rect r = currentBackgroundDrawable.getBounds(); + if (currentMessageObject.isOutOwner() && !mediaBackground && !pinnedBottom) { + canvas.clipRect( + r.left + AndroidUtilities.dp(4), r.top + AndroidUtilities.dp(4), + r.right - AndroidUtilities.dp(10), r.bottom - AndroidUtilities.dp(4) + ); + } else { + canvas.clipRect( + r.left + AndroidUtilities.dp(4), r.top + AndroidUtilities.dp(4), + r.right - AndroidUtilities.dp(4), r.bottom - AndroidUtilities.dp(4) + ); + } + } + drawAnimatedEmojiMessageText(canvas, transitionParams.animateOutTextBlocks, transitionParams.animateOutAnimateEmoji, false, alpha * (1.0f - transitionParams.animateChangeProgress)); + drawAnimatedEmojiMessageText(canvas, currentMessageObject.textLayoutBlocks, animatedEmojiStack, true, alpha * transitionParams.animateChangeProgress); + canvas.restore(); + } else { + drawAnimatedEmojiMessageText(canvas, currentMessageObject.textLayoutBlocks, animatedEmojiStack, true, alpha); + } + } + + private void drawAnimatedEmojiMessageText(Canvas canvas, ArrayList textLayoutBlocks, AnimatedEmojiSpan.EmojiGroupedSpans stack, boolean origin, float alpha) { + if (textLayoutBlocks == null || textLayoutBlocks.isEmpty() || alpha == 0) { + return; + } + int firstVisibleBlockNum; + int lastVisibleBlockNum; + if (origin) { + if (fullyDraw) { + this.firstVisibleBlockNum = 0; + this.lastVisibleBlockNum = textLayoutBlocks.size(); + } + firstVisibleBlockNum = this.firstVisibleBlockNum; + lastVisibleBlockNum = this.lastVisibleBlockNum; + } else { + firstVisibleBlockNum = 0; + lastVisibleBlockNum = textLayoutBlocks.size(); + } + + float textY = this.textY; + if (transitionParams.animateText) { + textY = transitionParams.animateFromTextY * (1f - transitionParams.animateChangeProgress) + this.textY * transitionParams.animateChangeProgress; + } + for (int a = firstVisibleBlockNum; a <= lastVisibleBlockNum; a++) { + if (a >= textLayoutBlocks.size()) { + break; + } + if (a < 0) { + continue; + } + MessageObject.TextLayoutBlock block = textLayoutBlocks.get(a); + canvas.save(); + canvas.translate(textX - (block.isRtl() ? (int) Math.ceil(currentMessageObject.textXOffset) : 0), textY + block.textYOffset + transitionYOffsetForDrawables); + float drawingYOffset = textY + block.textYOffset + transitionYOffsetForDrawables; + float top = 0; // parentBoundsTop - getY() - drawingYOffset + AndroidUtilities.dp(20); + float bottom = 0; // parentBoundsBottom - getY() - drawingYOffset - AndroidUtilities.dp(20); + if (transitionParams.messageEntering) { + top = bottom = 0; + } + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, block.textLayout, stack, 0, block.spoilers, top, bottom, drawingYOffset, alpha); + canvas.restore(); + } + } + + public void drawAnimatedEmojiCaption(Canvas canvas, float alpha) { + if (transitionParams.animateReplaceCaptionLayout && transitionParams.animateChangeProgress != 1f) { + drawAnimatedEmojiCaption(canvas, transitionParams.animateOutCaptionLayout, transitionParams.animateOutAnimateEmoji, alpha * (1f - transitionParams.animateChangeProgress)); + drawAnimatedEmojiCaption(canvas, captionLayout, animatedEmojiStack, alpha * transitionParams.animateChangeProgress); + } else { + drawAnimatedEmojiCaption(canvas, captionLayout, animatedEmojiStack, alpha); + } + } + + private void drawAnimatedEmojiCaption(Canvas canvas, Layout layout, AnimatedEmojiSpan.EmojiGroupedSpans stack, float alpha) { + if (layout == null || currentMessageObject.deleted && currentPosition != null || alpha <= 0) { + return; + } + canvas.save(); + float renderingAlpha = alpha; + if (currentMessagesGroup != null) { + renderingAlpha = currentMessagesGroup.transitionParams.captionEnterProgress * alpha; + } + if (renderingAlpha == 0) { + return; + } + + float captionY = this.captionY; + float captionX = this.captionX; + + if (transitionParams.animateBackgroundBoundsInner) { + if (transitionParams.transformGroupToSingleMessage) { + captionY -= getTranslationY(); + captionX += transitionParams.deltaLeft; + } else if (transitionParams.moveCaption) { + captionX = this.captionX * transitionParams.animateChangeProgress + transitionParams.captionFromX * (1f - transitionParams.animateChangeProgress); + captionY = this.captionY * transitionParams.animateChangeProgress + transitionParams.captionFromY * (1f - transitionParams.animateChangeProgress); + } else if (!currentMessageObject.isVoice() || !TextUtils.isEmpty(currentMessageObject.caption)) { + captionX += transitionParams.deltaLeft; + } + } + + canvas.translate(captionX, captionY); + try { + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, layout, stack, 0, captionSpoilers, 0, 0, captionY, renderingAlpha); + } catch (Exception e) { + FileLog.e(e); + } + canvas.restore(); + } + private void drawSideButton(Canvas canvas) { if (drawSideButton != 0) { if (currentMessageObject.isOutOwner()) { @@ -12613,9 +12922,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (replyTextLayout != null) { canvas.save(); canvas.translate(forwardNameX, replyStartY + AndroidUtilities.dp(19)); - int spoilersColor = currentMessageObject.isOut() && !ChatObject.isChannelAndNotMegaGroup(currentMessageObject.getChatId(), currentAccount) ? getThemedColor(Theme.key_chat_outTimeText) : replyTextLayout.getPaint().getColor(); SpoilerEffect.renderWithRipple(this, invalidateSpoilersParent, spoilersColor, -AndroidUtilities.dp(2), spoilersPatchedReplyTextLayout, replyTextLayout, replySpoilers, canvas, false); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, replyTextLayout, animatedEmojiReplyStack, 0, replySpoilers, 0, 0, 0, alpha); canvas.restore(); } } @@ -12728,7 +13037,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate return currentBackgroundDrawable; } + private boolean shouldDrawCaptionLayout() { + return !currentMessageObject.preview && (currentPosition == null || (currentMessagesGroup != null && currentMessagesGroup.isDocuments && (currentPosition.flags & MessageObject.POSITION_FLAG_BOTTOM) == 0)) && !transitionParams.animateBackgroundBoundsInner && !(enterTransitionInProgress && currentMessageObject.isVoice()); + } + public void drawCaptionLayout(Canvas canvas, boolean selectionOnly, float alpha) { + if (animatedEmojiStack != null && (captionLayout != null || transitionParams.animateOutCaptionLayout != null)) { + animatedEmojiStack.clearPositions(); + } if (transitionParams.animateReplaceCaptionLayout && transitionParams.animateChangeProgress != 1f) { drawCaptionLayout(canvas, transitionParams.animateOutCaptionLayout, selectionOnly, alpha * (1f - transitionParams.animateChangeProgress)); drawCaptionLayout(canvas, captionLayout, selectionOnly, alpha * transitionParams.animateChangeProgress); @@ -12736,6 +13052,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate drawCaptionLayout(canvas, captionLayout, selectionOnly, alpha); } + if (!selectionOnly) { + drawAnimatedEmojiCaption(canvas, alpha); + } + if (currentMessageObject != null && currentMessageObject.messageOwner != null && currentMessageObject.isVoiceTranscriptionOpen() && !currentMessageObject.messageOwner.voiceTranscriptionFinal && TranscribeButton.isTranscribing(currentMessageObject)) { invalidate(); } @@ -13062,6 +13382,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (getDelegate() != null && getDelegate().getTextSelectionHelper() != null && getDelegate().getTextSelectionHelper().isSelected(currentMessageObject)) { getDelegate().getTextSelectionHelper().drawCaption(currentMessageObject.isOutOwner(), captionLayout, canvas); } + float top = parentBoundsTop - getY() - captionY; + float bottom = parentBoundsBottom - getY() - captionY; + Emoji.emojiDrawingYOffset = -transitionYOffsetForDrawables; int spoilersColor = currentMessageObject.isOut() && !ChatObject.isChannelAndNotMegaGroup(currentMessageObject.getChatId(), currentAccount) ? getThemedColor(Theme.key_chat_outTimeText) : captionLayout.getPaint().getColor(); @@ -13212,7 +13535,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate Theme.chat_timePaint.setAlpha((int) (255 * timeAlpha * alpha)); int r; - if (documentAttachType != DOCUMENT_ATTACH_TYPE_ROUND && documentAttachType != DOCUMENT_ATTACH_TYPE_STICKER) { + if (documentAttachType != DOCUMENT_ATTACH_TYPE_ROUND && documentAttachType != DOCUMENT_ATTACH_TYPE_STICKER && currentMessageObject.type != MessageObject.TYPE_EMOJIS) { int[] rad = photoImage.getRoundRadius(); r = Math.min(AndroidUtilities.dp(8), Math.max(rad[2], rad[3])); bigRadius = SharedConfig.bubbleRadius >= 10; @@ -13222,7 +13545,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate float x1 = timeX - AndroidUtilities.dp(bigRadius ? 6 : 4); float timeY = photoImage.getImageY2() + additionalTimeOffsetY; float y1 = timeY - AndroidUtilities.dp(23); - rect.set(x1, y1, x1 + timeWidth + AndroidUtilities.dp((bigRadius ? 12 : 8) + (currentMessageObject.isOutOwner() ? 20 : 0)), y1 + AndroidUtilities.dp(17)); + rect.set(x1, y1, x1 + timeWidth + AndroidUtilities.dp((bigRadius ? 12 : 8) + (currentMessageObject.isOutOwner() ? 20 + (currentMessageObject.type == MessageObject.TYPE_EMOJIS ? 4 : 0) : 0)), y1 + AndroidUtilities.dp(17)); applyServiceShaderMatrix(); canvas.drawRoundRect(rect, r, r, paint); @@ -14622,6 +14945,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (!reactionsLayoutInBubble.isEmpty && !reactionsLayoutInBubble.isSmall) { instantY -= reactionsLayoutInBubble.totalHeight; } + if (drawCommentButton) { + instantY -= AndroidUtilities.dp(shouldDrawTimeOnMedia() ? 39.3f : 41); + } Paint backPaint = Theme.chat_instantViewRectPaint; if (currentMessageObject.isOutOwner()) { Theme.chat_instantViewPaint.setColor(getThemedColor(Theme.key_chat_outPreviewInstantText)); @@ -16055,6 +16381,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private ArrayList animateOutTextBlocks; private ArrayList lastDrawingTextBlocks; + private AnimatedEmojiSpan.EmojiGroupedSpans animateOutAnimateEmoji; + private boolean animateEditedEnter; private StaticLayout animateEditedLayout; private StaticLayout animateTimeLayout; @@ -16220,6 +16548,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if ((newText == null && oldText != null) || (newText != null && oldText == null) || !newText.equals(oldText)) { sameText = false; break; + } else { + if (animatedEmojiStack != null) { + animatedEmojiStack.replaceLayout(currentMessageObject.textLayoutBlocks.get(i).textLayout, lastDrawingTextBlocks.get(i).textLayout); + } } } } else { @@ -16228,7 +16560,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (!sameText) { animateMessageText = true; animateOutTextBlocks = lastDrawingTextBlocks; + animateOutAnimateEmoji = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, ChatMessageCell.this, animateOutAnimateEmoji, lastDrawingTextBlocks, true); + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, ChatMessageCell.this, animatedEmojiStack, currentMessageObject.textLayoutBlocks); changed = true; + } else { + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, ChatMessageCell.this, animatedEmojiStack, currentMessageObject.textLayoutBlocks); } } if (edited && !lastDrawingEdited && timeLayout != null) { @@ -16255,6 +16591,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate shouldAnimateTimeX = true; changed = true; } + } else if (!edited && lastDrawingEdited && timeLayout != null) { + animateTimeLayout = lastTimeLayout; + animateEditedWidthDiff = timeWidth - lastTimeWidth; + animateEditedEnter = true; + animateTimeWidth = lastTimeWidth; + animateFromTimeX = lastTimeX; + shouldAnimateTimeX = true; + changed = true; } if (captionLayout != lastDrawingCaptionLayout) { @@ -16263,6 +16607,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if ((currentCaption == null) != (oldCaption == null) || (oldCaption != null && !oldCaption.equals(currentCaption))) { animateReplaceCaptionLayout = true; animateOutCaptionLayout = lastDrawingCaptionLayout; + animateOutAnimateEmoji = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, ChatMessageCell.this, null, animateOutCaptionLayout); + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, ChatMessageCell.this, animatedEmojiStack, captionLayout); changed = true; } else { updateCaptionLayout(); @@ -16466,6 +16812,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate animateReplaceCaptionLayout = false; transformGroupToSingleMessage = false; animateOutCaptionLayout = null; + AnimatedEmojiSpan.release(ChatMessageCell.this, animateOutAnimateEmoji); + animateOutAnimateEmoji = null; moveCaption = false; animateDrawingTimeAlpha = false; transitionBotButtons.clear(); 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 cc206642b..aff8e4e2d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -62,6 +62,8 @@ import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Adapters.DialogsAdapter; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -244,6 +246,7 @@ public class DialogCell extends BaseCell { private Stack spoilersPool = new Stack<>(); private List spoilers = new ArrayList<>(); + private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiStack; private int messageNameTop; private int messageNameLeft; @@ -493,6 +496,7 @@ public class DialogCell extends BaseCell { if (preloader != null) { preloader.remove(currentDialogId); } + AnimatedEmojiSpan.release(this, animatedEmojiStack); } @Override @@ -501,6 +505,7 @@ public class DialogCell extends BaseCell { avatarImage.onAttachedToWindow(); thumbImage.onAttachedToWindow(); resetPinnedArchiveState(); + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack, messageLayout); } public void resetPinnedArchiveState() { @@ -901,6 +906,9 @@ public class DialogCell extends BaseCell { } Spannable messSpan = new SpannableStringBuilder(mess); MediaDataController.addTextStyleRuns(draftMessage, messSpan, TextStyleSpan.FLAG_STYLE_SPOILER); + if (draftMessage != null && draftMessage.entities != null) { + MediaDataController.addAnimatedEmojiSpans(draftMessage.entities, messSpan, currentMessagePaint == null ? null : currentMessagePaint.getFontMetricsInt()); + } SpannableStringBuilder stringBuilder = AndroidUtilities.formatSpannable(messageFormat, AndroidUtilities.replaceNewLines(messSpan), messageNameString); if (!useForceThreeLines && !SharedConfig.useThreeLinesLayout) { @@ -1083,6 +1091,9 @@ public class DialogCell extends BaseCell { } SpannableStringBuilder msgBuilder = new SpannableStringBuilder(mess); MediaDataController.addTextStyleRuns(message.messageOwner.entities, mess, msgBuilder, TextStyleSpan.FLAG_STYLE_SPOILER); + if (message != null && message.messageOwner != null) { + MediaDataController.addAnimatedEmojiSpans(message.messageOwner.entities, msgBuilder, currentMessagePaint == null ? null : currentMessagePaint.getFontMetricsInt()); + } stringBuilder = AndroidUtilities.formatSpannable(messageFormat, new SpannableStringBuilder(emoji).append(AndroidUtilities.replaceNewLines(msgBuilder)), messageNameString); } } else if (message.messageOwner.media != null && !message.isMediaEmpty()) { @@ -1143,6 +1154,9 @@ public class DialogCell extends BaseCell { } mess = new SpannableStringBuilder(mess); MediaDataController.addTextStyleRuns(message, (Spannable) mess, TextStyleSpan.FLAG_STYLE_SPOILER); + if (message != null && message.messageOwner != null) { + MediaDataController.addAnimatedEmojiSpans(message.messageOwner.entities, mess, currentMessagePaint == null ? null : currentMessagePaint.getFontMetricsInt()); + } stringBuilder = AndroidUtilities.formatSpannable(messageFormat, mess, messageNameString); } else { stringBuilder = SpannableStringBuilder.valueOf(""); @@ -1217,7 +1231,10 @@ public class DialogCell extends BaseCell { messageString = emoji + str; } else { SpannableStringBuilder msgBuilder = new SpannableStringBuilder(message.caption); - MediaDataController.addTextStyleRuns(message.messageOwner.entities, message.caption, msgBuilder, TextStyleSpan.FLAG_STYLE_SPOILER); + if (message != null && message.messageOwner != null) { + MediaDataController.addTextStyleRuns(message.messageOwner.entities, message.caption, msgBuilder, TextStyleSpan.FLAG_STYLE_SPOILER); + MediaDataController.addAnimatedEmojiSpans(message.messageOwner.entities, msgBuilder, currentMessagePaint == null ? null : currentMessagePaint.getFontMetricsInt()); + } messageString = new SpannableStringBuilder(emoji).append(msgBuilder); } } else { @@ -1241,6 +1258,9 @@ public class DialogCell extends BaseCell { } else { SpannableStringBuilder stringBuilder = new SpannableStringBuilder(msgText); MediaDataController.addTextStyleRuns(message, stringBuilder, TextStyleSpan.FLAG_STYLE_SPOILER); + if (message != null && message.messageOwner != null) { + MediaDataController.addAnimatedEmojiSpans(message.messageOwner.entities, stringBuilder, currentMessagePaint == null ? null : currentMessagePaint.getFontMetricsInt()); + } messageString = stringBuilder; } AndroidUtilities.highlightText(messageString, message.highlightedWords, resourcesProvider); @@ -1741,6 +1761,7 @@ public class DialogCell extends BaseCell { spoilersPool.addAll(spoilers); spoilers.clear(); SpoilerEffect.addSpoilers(this, messageLayout, spoilersPool, spoilers); + animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack, messageLayout); } catch (Exception e) { messageLayout = null; FileLog.e(e); @@ -2710,6 +2731,7 @@ public class DialogCell extends BaseCell { canvas.save(); SpoilerEffect.clipOutCanvas(canvas, spoilers); messageLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageLayout, animatedEmojiStack, -.075f, spoilers, 0, 0, 0, 1f); canvas.restore(); for (int i = 0; i < spoilers.size(); i++) { @@ -2722,6 +2744,7 @@ public class DialogCell extends BaseCell { } } else { messageLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageLayout, animatedEmojiStack, -.075f, null, 0, 0, 0, 1f); } canvas.restore(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/EmojiReplacementCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/EmojiReplacementCell.java index d749e2c11..8ec40bd98 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/EmojiReplacementCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/EmojiReplacementCell.java @@ -9,6 +9,7 @@ package org.telegram.ui.Cells; import android.content.Context; +import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; @@ -19,7 +20,9 @@ import android.widget.ImageView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.LayoutHelper; public class EmojiReplacementCell extends FrameLayout { @@ -28,6 +31,8 @@ public class EmojiReplacementCell extends FrameLayout { private String emoji; private final Theme.ResourcesProvider resourcesProvider; + private AnimatedEmojiDrawable emojiDrawable; + public EmojiReplacementCell(Context context, Theme.ResourcesProvider resourcesProvider) { super(context); this.resourcesProvider = resourcesProvider; @@ -44,7 +49,26 @@ public class EmojiReplacementCell extends FrameLayout { public void setEmoji(String e, int side) { emoji = e; - imageView.setImageDrawable(Emoji.getEmojiBigDrawable(e)); + if (emoji != null && emoji.startsWith("animated_")) { + try { + long documentId = Long.parseLong(emoji.substring(9)); + if (emojiDrawable == null || emojiDrawable.getDocumentId() != documentId) { + emojiDrawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, AnimatedEmojiDrawable.CACHE_TYPE_KEYBOARD, documentId); + emojiDrawable.addView(this); + } + } catch (Exception ignore) {} + } else { + if (emojiDrawable != null) { + emojiDrawable.removeView(this); + emojiDrawable = null; + } + } + if (emojiDrawable == null) { + imageView.setImageDrawable(Emoji.getEmojiBigDrawable(e)); + } else { + imageView.setImageDrawable(null); + } + if (side == -1) { setBackgroundResource(R.drawable.stickers_back_left); setPadding(AndroidUtilities.dp(7), 0, 0, 0); @@ -65,6 +89,32 @@ public class EmojiReplacementCell extends FrameLayout { } } + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (emojiDrawable != null) { + final int sz = AndroidUtilities.dp(38); + emojiDrawable.setBounds((getWidth() - sz) / 2, (getHeight() - sz) / 2, (getWidth() + sz) / 2, (getHeight() + sz) / 2); + emojiDrawable.draw(canvas); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (emojiDrawable != null) { + emojiDrawable.removeView(this); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (emojiDrawable != null) { + emojiDrawable.addView(this); + } + } + public String getEmoji() { return emoji; } 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 0c35a0b5b..eb76b42e5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java @@ -42,9 +42,11 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.Premium.PremiumButtonView; import org.telegram.ui.Components.ProgressButton; import org.telegram.ui.Components.RecyclerListView; +import java.util.ArrayList; import java.util.List; public class FeaturedStickerSetCell2 extends FrameLayout { @@ -56,10 +58,12 @@ public class FeaturedStickerSetCell2 extends FrameLayout { private final BackupImageView imageView; private final ProgressButton addButton; private final TextView delButton; + private final PremiumButtonView unlockButton; private AnimatorSet currentAnimation; private TLRPC.StickerSetCovered stickersSet; private boolean isInstalled; + private boolean isLocked; private boolean needDivider; private final Theme.ResourcesProvider resourcesProvider; @@ -105,6 +109,21 @@ public class FeaturedStickerSetCell2 extends FrameLayout { delButton.setText(LocaleController.getString("StickersRemove", R.string.StickersRemove)); addView(delButton, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.TOP | Gravity.END, 0, 16, 14, 0)); + unlockButton = new PremiumButtonView(context, AndroidUtilities.dp(4), false); + unlockButton.setIcon(R.raw.unlock_icon); + unlockButton.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> onPremiumButtonClick()); + unlockButton.setVisibility(View.GONE); + try { + MarginLayoutParams iconLayout = (MarginLayoutParams) unlockButton.getIconView().getLayoutParams(); + iconLayout.leftMargin = AndroidUtilities.dp(1); + iconLayout.topMargin = AndroidUtilities.dp(1); + iconLayout.width = iconLayout.height = AndroidUtilities.dp(20); + MarginLayoutParams layout = (MarginLayoutParams) unlockButton.getTextView().getLayoutParams(); + layout.leftMargin = AndroidUtilities.dp(3); + unlockButton.getChildAt(0).setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); + } catch (Exception ev) {} + addView(unlockButton, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.TOP | Gravity.END, 0, 16, 10, 0)); + updateColors(); } @@ -112,6 +131,10 @@ public class FeaturedStickerSetCell2 extends FrameLayout { return textView; } + protected void onPremiumButtonClick() { + + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY)); @@ -180,13 +203,28 @@ public class FeaturedStickerSetCell2 extends FrameLayout { textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); } - valueTextView.setText(LocaleController.formatPluralString("Stickers", set.set.count)); + valueTextView.setText(LocaleController.formatPluralString(set.set.emojis ? "EmojiCount" : "Stickers", set.set.count)); TLRPC.Document sticker; if (set.cover != null) { sticker = set.cover; } else if (!set.covers.isEmpty()) { sticker = set.covers.get(0); + for (int i = 0; i < set.covers.size(); ++i) { + if (set.covers.get(i).id == set.set.thumb_document_id) { + sticker = set.covers.get(i); + break; + } + } + } else if ((set instanceof TLRPC.TL_stickerSetFullCovered && !((TLRPC.TL_stickerSetFullCovered) set).documents.isEmpty())) { + ArrayList documents = ((TLRPC.TL_stickerSetFullCovered) set).documents; + sticker = documents.get(0); + for (int i = 0; i < documents.size(); ++i) { + if (documents.get(i).id == set.set.thumb_document_id) { + sticker = documents.get(i); + break; + } + } } else { sticker = null; } @@ -232,52 +270,86 @@ public class FeaturedStickerSetCell2 extends FrameLayout { addButton.setVisibility(VISIBLE); isInstalled = forceInstalled || MediaDataController.getInstance(currentAccount).isStickerPackInstalled(set.set.id); + isLocked = !UserConfig.getInstance(currentAccount).isPremium() && MessageObject.isPremiumEmojiPack(set); if (animated) { - if (isInstalled) { + if (isLocked) { delButton.setVisibility(VISIBLE); - } else { addButton.setVisibility(VISIBLE); + } else { + unlockButton.setVisibility(VISIBLE); + if (isInstalled) { + delButton.setVisibility(VISIBLE); + } else { + addButton.setVisibility(VISIBLE); + } } currentAnimation = new AnimatorSet(); currentAnimation.setDuration(250); currentAnimation.playTogether( - ObjectAnimator.ofFloat(delButton, View.ALPHA, isInstalled ? 1.0f : 0.0f), - ObjectAnimator.ofFloat(delButton, View.SCALE_X, isInstalled ? 1.0f : 0.0f), - ObjectAnimator.ofFloat(delButton, View.SCALE_Y, isInstalled ? 1.0f : 0.0f), - ObjectAnimator.ofFloat(addButton, View.ALPHA, isInstalled ? 0.0f : 1.0f), - ObjectAnimator.ofFloat(addButton, View.SCALE_X, isInstalled ? 0.0f : 1.0f), - ObjectAnimator.ofFloat(addButton, View.SCALE_Y, isInstalled ? 0.0f : 1.0f)); + ObjectAnimator.ofFloat(delButton, View.ALPHA, isInstalled && !isLocked ? 1.0f : 0.0f), + ObjectAnimator.ofFloat(delButton, View.SCALE_X, isInstalled && !isLocked ? 1.0f : 0.0f), + ObjectAnimator.ofFloat(delButton, View.SCALE_Y, isInstalled && !isLocked ? 1.0f : 0.0f), + ObjectAnimator.ofFloat(addButton, View.ALPHA, isInstalled || isLocked ? 0.0f : 1.0f), + ObjectAnimator.ofFloat(addButton, View.SCALE_X, isInstalled || isLocked ? 0.0f : 1.0f), + ObjectAnimator.ofFloat(unlockButton, View.SCALE_Y, !isLocked ? 0.0f : 1.0f), + ObjectAnimator.ofFloat(unlockButton, View.SCALE_X, !isLocked ? 0.0f : 1.0f), + ObjectAnimator.ofFloat(unlockButton, View.SCALE_Y, !isLocked ? 0.0f : 1.0f)); currentAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - if (isInstalled) { + if (isLocked) { addButton.setVisibility(INVISIBLE); - } else { delButton.setVisibility(INVISIBLE); + unlockButton.setVisibility(INVISIBLE); + } else { + if (isInstalled) { + addButton.setVisibility(INVISIBLE); + } else { + delButton.setVisibility(INVISIBLE); + } } } }); currentAnimation.setInterpolator(new OvershootInterpolator(1.02f)); currentAnimation.start(); } else { - if (isInstalled) { - delButton.setVisibility(VISIBLE); - delButton.setAlpha(1.0f); - delButton.setScaleX(1.0f); - delButton.setScaleY(1.0f); + if (isLocked) { + unlockButton.setVisibility(VISIBLE); + unlockButton.setAlpha(1.0f); + unlockButton.setScaleX(1.0f); + unlockButton.setScaleY(1.0f); addButton.setVisibility(INVISIBLE); addButton.setAlpha(0.0f); addButton.setScaleX(0.0f); addButton.setScaleY(0.0f); - } else { - addButton.setVisibility(VISIBLE); - addButton.setAlpha(1.0f); - addButton.setScaleX(1.0f); - addButton.setScaleY(1.0f); delButton.setVisibility(INVISIBLE); delButton.setAlpha(0.0f); delButton.setScaleX(0.0f); delButton.setScaleY(0.0f); + } else { + unlockButton.setVisibility(INVISIBLE); + unlockButton.setAlpha(0.0f); + unlockButton.setScaleX(0.0f); + unlockButton.setScaleY(0.0f); + if (isInstalled) { + delButton.setVisibility(VISIBLE); + delButton.setAlpha(1.0f); + delButton.setScaleX(1.0f); + delButton.setScaleY(1.0f); + addButton.setVisibility(INVISIBLE); + addButton.setAlpha(0.0f); + addButton.setScaleX(0.0f); + addButton.setScaleY(0.0f); + } else { + addButton.setVisibility(VISIBLE); + addButton.setAlpha(1.0f); + addButton.setScaleX(1.0f); + addButton.setScaleY(1.0f); + delButton.setVisibility(INVISIBLE); + delButton.setAlpha(0.0f); + delButton.setScaleX(0.0f); + delButton.setScaleY(0.0f); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java index bf06cc94e..6b551a532 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java @@ -10,7 +10,9 @@ package org.telegram.ui.Cells; import android.content.Context; import android.graphics.Canvas; +import android.graphics.drawable.Drawable; import android.text.TextUtils; +import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.widget.LinearLayout; @@ -19,10 +21,11 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.Emoji; -import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.LayoutHelper; @@ -35,8 +38,11 @@ public class MentionCell extends LinearLayout { private AvatarDrawable avatarDrawable; private Theme.ResourcesProvider resourcesProvider; + private Drawable emojiDrawable; + public MentionCell(Context context, Theme.ResourcesProvider resourcesProvider) { super(context); + this.resourcesProvider = resourcesProvider; setOrientation(HORIZONTAL); @@ -70,6 +76,7 @@ public class MentionCell extends LinearLayout { } public void setUser(TLRPC.User user) { + resetEmojiSuggestion(); if (user == null) { nameTextView.setText(""); usernameTextView.setText(""); @@ -133,6 +140,7 @@ public class MentionCell extends LinearLayout { } public void setText(String text) { + resetEmojiSuggestion(); imageView.setVisibility(INVISIBLE); usernameTextView.setVisibility(INVISIBLE); nameTextView.setText(text); @@ -144,17 +152,65 @@ public class MentionCell extends LinearLayout { nameTextView.invalidate(); } + public void resetEmojiSuggestion() { + nameTextView.setPadding(0, 0, 0, 0); + if (emojiDrawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) emojiDrawable).removeView(this); + emojiDrawable = null; + } + } + public void setEmojiSuggestion(MediaDataController.KeywordResult suggestion) { imageView.setVisibility(INVISIBLE); usernameTextView.setVisibility(INVISIBLE); - StringBuilder stringBuilder = new StringBuilder(suggestion.emoji.length() + suggestion.keyword.length() + 4); - stringBuilder.append(suggestion.emoji); - stringBuilder.append(" :"); - stringBuilder.append(suggestion.keyword); - nameTextView.setText(Emoji.replaceEmoji(stringBuilder, nameTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false)); + if (suggestion.emoji != null && suggestion.emoji.startsWith("animated_")) { + try { + if (emojiDrawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) emojiDrawable).removeView(this); + emojiDrawable = null; + } + long documentId = Long.parseLong(suggestion.emoji.substring(9)); + emojiDrawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, documentId); + if (attached) { + ((AnimatedEmojiDrawable) emojiDrawable).addView(this); + } + } catch (Exception ignore) { + emojiDrawable = Emoji.getEmojiDrawable(suggestion.emoji); + } + } else { + emojiDrawable = Emoji.getEmojiDrawable(suggestion.emoji); + } + if (emojiDrawable == null) { + nameTextView.setPadding(0, 0, 0, 0); + nameTextView.setText(new StringBuilder().append(suggestion.emoji).append(": ").append(suggestion.keyword)); + } else { + nameTextView.setPadding(AndroidUtilities.dp(22), 0, 0, 0); + nameTextView.setText(new StringBuilder().append(": ").append(suggestion.keyword)); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + + if (emojiDrawable != null) { + final int sz = AndroidUtilities.dp(emojiDrawable instanceof AnimatedEmojiDrawable ? 24 : 20); + final int offsetX = AndroidUtilities.dp(emojiDrawable instanceof AnimatedEmojiDrawable ? -2 : 0); + emojiDrawable.setBounds( + nameTextView.getLeft() + offsetX, + (nameTextView.getTop() + nameTextView.getBottom() - sz) / 2, + nameTextView.getLeft() + offsetX + sz, + (nameTextView.getTop() + nameTextView.getBottom() + sz) / 2 + ); + if (emojiDrawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) emojiDrawable).setTime(System.currentTimeMillis()); + } + emojiDrawable.draw(canvas); + } } public void setBotCommand(String command, String help, TLRPC.User user) { + resetEmojiSuggestion(); if (user != null) { imageView.setVisibility(VISIBLE); avatarDrawable.setInfo(user); @@ -185,4 +241,24 @@ public class MentionCell extends LinearLayout { Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null; return color != null ? color : Theme.getColor(key); } + + private boolean attached; + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + attached = false; + if (emojiDrawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) emojiDrawable).removeView(this); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + attached = true; + if (emojiDrawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) emojiDrawable).addView(this); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharingLiveLocationCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharingLiveLocationCell.java index 873806452..785048b37 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharingLiveLocationCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharingLiveLocationCell.java @@ -19,12 +19,10 @@ import android.text.TextUtils; import android.view.Gravity; import android.widget.FrameLayout; -import com.google.android.gms.maps.model.LatLng; - import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; -import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.IMapsProvider; import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocationController; import org.telegram.messenger.MessageObject; @@ -224,7 +222,7 @@ public class SharingLiveLocationCell extends FrameLayout { } } - LatLng position = info.marker.getPosition(); + IMapsProvider.LatLng position = info.marker.getPosition(); location.setLatitude(position.latitude); location.setLongitude(position.longitude); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StatisticPostInfoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StatisticPostInfoCell.java index 5bb527256..6360a6e0d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StatisticPostInfoCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StatisticPostInfoCell.java @@ -1,7 +1,9 @@ package org.telegram.ui.Cells; import android.content.Context; +import android.graphics.Canvas; import android.graphics.Color; +import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; @@ -17,6 +19,8 @@ import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +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.LayoutHelper; @@ -44,7 +48,32 @@ public class StatisticPostInfoCell extends FrameLayout { LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.HORIZONTAL); - message = new TextView(context); + message = new TextView(context) { + AnimatedEmojiSpan.EmojiGroupedSpans stack; + @Override + public void setText(CharSequence text, BufferType type) { + super.setText(text, type); + 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); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, getLayout(), stack, 0, null, 0, 0, 0, 1f); + } + }; message.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); message.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); message.setTextColor(Color.BLACK); @@ -98,14 +127,14 @@ public class StatisticPostInfoCell extends FrameLayout { imageView.setRoundRadius(AndroidUtilities.dp(46) >> 1); } - String text; + CharSequence text; if (messageObject.isMusic()) { text = String.format("%s, %s", messageObject.getMusicTitle().trim(), messageObject.getMusicAuthor().trim()); } else { - text = messageObject.caption != null ? messageObject.caption.toString() : messageObject.messageText.toString(); + text = messageObject.caption != null ? messageObject.caption : messageObject.messageText; } - message.setText(text.replace("\n", " ").trim()); + message.setText(AndroidUtilities.trim(AndroidUtilities.replaceNewLines(new SpannableStringBuilder(text)), null)); views.setText(String.format(LocaleController.getPluralString("Views", postInfo.counters.views), AndroidUtilities.formatCount(postInfo.counters.views))); date.setText(LocaleController.formatDateAudio(postInfo.message.messageOwner.date, false)); shares.setText(String.format(LocaleController.getPluralString("Shares", postInfo.counters.forwards), AndroidUtilities.formatCount(postInfo.counters.forwards))); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java index a9675910b..be7d90d7b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerCell.java @@ -27,11 +27,13 @@ import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.messenger.SvgHelper; +import org.telegram.ui.Components.Premium.PremiumLockIconView; public class StickerCell extends FrameLayout { @@ -44,6 +46,10 @@ public class StickerCell extends FrameLayout { private long time = 0; private boolean clearsInputField; private static AccelerateInterpolator interpolator = new AccelerateInterpolator(0.5f); + private PremiumLockIconView premiumIconView; + private float premiumAlpha = 1f; + private boolean showPremiumLock; + private boolean isPremiumSticker; public StickerCell(Context context) { super(context); @@ -53,6 +59,11 @@ public class StickerCell extends FrameLayout { imageView.setLayerNum(1); addView(imageView, LayoutHelper.createFrame(66, 66, Gravity.CENTER_HORIZONTAL, 0, 5, 0, 0)); setFocusable(true); + + premiumIconView = new PremiumLockIconView(context, PremiumLockIconView.TYPE_STICKERS_PREMIUM_LOCKED); + premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4)); + premiumIconView.setImageReceiver(imageView.getImageReceiver()); + addView(premiumIconView, LayoutHelper.createFrame(24, 24, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0 ,0, 0, 0)); } @Override @@ -79,6 +90,11 @@ public class StickerCell extends FrameLayout { public void setSticker(TLRPC.Document document, Object parent) { parentObject = parent; + isPremiumSticker = MessageObject.isPremiumSticker(document); + if (isPremiumSticker) { + premiumIconView.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + premiumIconView.setWaitingImage(); + } if (document != null) { TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document, Theme.key_windowBackgroundGray, 1.0f); @@ -108,6 +124,7 @@ public class StickerCell extends FrameLayout { background.setAlpha(230); background.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel), PorterDuff.Mode.MULTIPLY)); } + updatePremiumStatus(false); } public TLRPC.Document getSticker() { @@ -187,4 +204,28 @@ public class StickerCell extends FrameLayout { info.setText(LocaleController.getString("AttachSticker", R.string.AttachSticker)); info.setEnabled(true); } + + private void updatePremiumStatus(boolean animated) { + if (isPremiumSticker) { + showPremiumLock = true; + } else { + showPremiumLock = false; + } + FrameLayout.LayoutParams layoutParams = (LayoutParams) premiumIconView.getLayoutParams(); + if (!UserConfig.getInstance(UserConfig.selectedAccount).isPremium()) { + layoutParams.height = layoutParams.width = AndroidUtilities.dp(24); + layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + layoutParams.bottomMargin = layoutParams.rightMargin = 0; + premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4)); + } else { + layoutParams.height = layoutParams.width = AndroidUtilities.dp(16); + layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT; + layoutParams.bottomMargin = AndroidUtilities.dp(8); + layoutParams.rightMargin = AndroidUtilities.dp(8); + premiumIconView.setPadding(AndroidUtilities.dp(1), AndroidUtilities.dp(1), AndroidUtilities.dp(1), AndroidUtilities.dp(1)); + } + premiumIconView.setLocked(!UserConfig.getInstance(UserConfig.selectedAccount).isPremium()); + AndroidUtilities.updateViewVisibilityAnimated(premiumIconView, showPremiumLock, 0.9f, animated); + invalidate(); + } } 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 fea8b2d3a..eb220b8ff 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java @@ -36,13 +36,13 @@ 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.BackupImageView; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.ListView.RecyclerListViewWithOverlayDraw; import org.telegram.ui.Components.Premium.PremiumLockIconView; -public class StickerEmojiCell extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { +public class StickerEmojiCell extends FrameLayout implements NotificationCenter.NotificationCenterDelegate, RecyclerListViewWithOverlayDraw.OverlayView { - private BackupImageView imageView; + private ImageReceiver imageView; private PremiumLockIconView premiumIconView; private TLRPC.Document sticker; private SendMessagesHelper.ImportingSticker stickerPath; @@ -65,15 +65,17 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. int stickerColor; + private final static int STICKER_SIZE = 66; + private boolean drawInParentView; + public StickerEmojiCell(Context context, boolean isEmojiPanel) { super(context); fromEmojiPanel = isEmojiPanel; - imageView = new BackupImageView(context); + imageView = new ImageReceiver(); imageView.setAspectFit(true); imageView.setLayerNum(1); - addView(imageView, LayoutHelper.createFrame(66, 66, Gravity.CENTER)); emojiTextView = new TextView(context); emojiTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); @@ -83,9 +85,9 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. paint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton)); premiumIconView = new PremiumLockIconView(context, PremiumLockIconView.TYPE_STICKERS_PREMIUM_LOCKED); - premiumIconView.setImageReceiver(imageView.getImageReceiver()); + premiumIconView.setImageReceiver(imageView); premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4)); - premiumIconView.setImageReceiver(imageView.getImageReceiver()); + premiumIconView.setImageReceiver(imageView); addView(premiumIconView, LayoutHelper.createFrame(24, 24, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0 ,0, 0, 0)); setFocusable(true); } @@ -123,13 +125,13 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } public MessageObject.SendAnimationData getSendAnimationData() { - ImageReceiver imageReceiver = imageView.getImageReceiver(); + ImageReceiver imageReceiver = imageView; if (!imageReceiver.hasNotThumb()) { return null; } MessageObject.SendAnimationData data = new MessageObject.SendAnimationData(); int[] position = new int[2]; - imageView.getLocationInWindow(position); + getLocationInWindow(position); data.x = imageReceiver.getCenterX() + position[0]; data.y = imageReceiver.getCenterY() + position[1]; data.width = imageReceiver.getImageWidth(); @@ -140,6 +142,7 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. public void setSticker(TLRPC.Document document, SendMessagesHelper.ImportingSticker path, Object parent, String emoji, boolean showEmoji) { currentEmoji = emoji; isPremiumSticker = MessageObject.isPremiumSticker(document); + drawInParentView = false; if (isPremiumSticker) { premiumIconView.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); premiumIconView.setWaitingImage(); @@ -147,9 +150,9 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. if (path != null) { stickerPath = path; if (path.validated) { - imageView.setImage(ImageLocation.getForPath(path.path), "80_80", null, null, DocumentObject.getSvgRectThumb(Theme.key_dialogBackgroundGray, 1.0f), null, path.animated ? "tgs" : null, 0, null); + imageView.setImage(ImageLocation.getForPath(path.path), "80_80", null, null, DocumentObject.getSvgRectThumb(Theme.key_dialogBackgroundGray, 1.0f), 0, path.animated ? "tgs" : null, 0, 1); } else { - imageView.setImage(null, null, null, null, DocumentObject.getSvgRectThumb(Theme.key_dialogBackgroundGray, 1.0f), null, path.animated ? "tgs" : null, 0, null); + imageView.setImage(null, null, null, null, DocumentObject.getSvgRectThumb(Theme.key_dialogBackgroundGray, 1.0f), 0, path.animated ? "tgs" : null, 0, 1); } if (emoji != null) { emojiTextView.setText(Emoji.replaceEmoji(emoji, emojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16), false)); @@ -160,28 +163,33 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } else if (document != null) { sticker = document; parentObject = parent; - boolean isVideoSticker = MessageObject.isVideoSticker(document); - TLRPC.PhotoSize thumb = (isVideoSticker && MessageObject.canAutoplayAnimatedSticker(document)) ? null : FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); + //boolean isVideoSticker = MessageObject.isVideoSticker(document); + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document, fromEmojiPanel ? Theme.key_emptyListPlaceholder : Theme.key_windowBackgroundGray, fromEmojiPanel ? 0.2f : 1.0f); + String imageFilter = fromEmojiPanel ? "66_66_pcache_compress" : "66_66"; if (MessageObject.canAutoplayAnimatedSticker(document)) { + if (fromEmojiPanel) { + drawInParentView = true; + } if (svgThumb != null) { - imageView.setImage(ImageLocation.getForDocument(document), "66_66", null, svgThumb, parentObject); + imageView.setImage(ImageLocation.getForDocument(document), imageFilter, ImageLocation.getForDocument(thumb, document), null, null, null, svgThumb, 0, null, parentObject, 1); + //imageView.setImage(ImageLocation.getForDocument(document), imageFilter, svgThumb, null, parentObject, 1); } else if (thumb != null) { - imageView.setImage(ImageLocation.getForDocument(document), "66_66", ImageLocation.getForDocument(thumb, document), null, 0, parentObject); + imageView.setImage(ImageLocation.getForDocument(document), imageFilter, ImageLocation.getForDocument(thumb, document), null, (String) null, parentObject, 1); } else { - imageView.setImage(ImageLocation.getForDocument(document), "66_66", null, null, parentObject); + imageView.setImage(ImageLocation.getForDocument(document), imageFilter, null, null, parentObject, 1); } } else { if (svgThumb != null) { if (thumb != null) { - imageView.setImage(ImageLocation.getForDocument(thumb, document), "66_66", "webp", svgThumb, parentObject); + imageView.setImage(ImageLocation.getForDocument(thumb, document), imageFilter, svgThumb, "webp", parentObject, 1); } else { - imageView.setImage(ImageLocation.getForDocument(document), "66_66", "webp", svgThumb, parentObject); + imageView.setImage(ImageLocation.getForDocument(document), imageFilter, svgThumb, "webp", parentObject, 1); } } else if (thumb != null) { - imageView.setImage(ImageLocation.getForDocument(thumb, document), "66_66", "webp", null, parentObject); + imageView.setImage(ImageLocation.getForDocument(thumb, document), imageFilter, null, "webp", parentObject, 1); } else { - imageView.setImage(ImageLocation.getForDocument(document), "66_66", "webp", null, parentObject); + imageView.setImage(ImageLocation.getForDocument(document), imageFilter, null, "webp", parentObject, 1); } } @@ -209,7 +217,12 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } } updatePremiumStatus(false); - imageView.getImageReceiver().setAlpha(alpha * premiumAlpha); + imageView.setAlpha(alpha * premiumAlpha); + if (drawInParentView) { + imageView.setParentView((View) getParent()); + } else { + imageView.setParentView(this); + } } private void updatePremiumStatus(boolean animated) { @@ -240,7 +253,7 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. changingAlpha = true; alpha = 0.5f; time = 0; - imageView.getImageReceiver().setAlpha(alpha * premiumAlpha); + imageView.setAlpha(alpha * premiumAlpha); imageView.invalidate(); lastUpdateTime = System.currentTimeMillis(); invalidate(); @@ -257,77 +270,22 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } public boolean showingBitmap() { - return imageView.getImageReceiver().getBitmap() != null; + return imageView.getBitmap() != null; } - public BackupImageView getImageView() { + public ImageReceiver getImageView() { return imageView; } @Override public void invalidate() { + if (drawInParentView && getParent() != null) { + ((View) getParent()).invalidate(); + } emojiTextView.invalidate(); super.invalidate(); } - @Override - protected void dispatchDraw(Canvas canvas) { -// if (showPremiumLock && premiumAlpha > 0.5f) { -// premiumAlpha -= 16 / 150f; -// if (premiumAlpha < 0.5f) { -// premiumAlpha = 0.5f; -// } -// invalidate(); -// imageView.invalidate(); -// } else if (!showPremiumLock && premiumAlpha < 1f) { -// premiumAlpha += 16 / 150f; -// if (premiumAlpha > 1f) { -// premiumAlpha = 1f; -// } -// invalidate(); -// imageView.invalidate(); -// } - imageView.getImageReceiver().setAlpha(alpha * premiumAlpha); - - super.dispatchDraw(canvas); - } - - @Override - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - boolean result = super.drawChild(canvas, child, drawingTime); - if (child == imageView && (changingAlpha || scaled && scale != 0.8f || !scaled && scale != 1.0f)) { - long newTime = System.currentTimeMillis(); - long dt = (newTime - lastUpdateTime); - lastUpdateTime = newTime; - if (changingAlpha) { - time += dt; - if (time > 1050) { - time = 1050; - } - alpha = 0.5f + interpolator.getInterpolation(time / 150.0f) * 0.5f; - if (alpha >= 1.0f) { - changingAlpha = false; - alpha = 1.0f; - } - imageView.getImageReceiver().setAlpha(alpha * premiumAlpha); - } else if (scaled && scale != 0.8f) { - scale -= dt / 400.0f; - if (scale < 0.8f) { - scale = 0.8f; - } - } else { - scale += dt / 400.0f; - if (scale > 1.0f) { - scale = 1.0f; - } - } - imageView.setScaleX(scale); - imageView.setScaleY(scale); - imageView.invalidate(); - invalidate(); - } - return result; - } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { @@ -362,12 +320,19 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + if (drawInParentView) { + imageView.setParentView((View) getParent()); + } else { + imageView.setParentView(this); + } + imageView.onAttachedToWindow(); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.currentUserPremiumStatusChanged); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); + imageView.onDetachedFromWindow(); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.currentUserPremiumStatusChanged); } @@ -377,4 +342,64 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. updatePremiumStatus(true); } } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (!drawInParentView) { + drawInternal(this, canvas); + } + super.dispatchDraw(canvas); + } + + @Override + public void preDraw(View view, Canvas canvas) { + if (drawInParentView) { + drawInternal(view, canvas); + } + } + + private void drawInternal(View view, Canvas canvas) { + if (changingAlpha || scaled && scale != 0.8f || !scaled && scale != 1.0f) { + long newTime = System.currentTimeMillis(); + long dt = (newTime - lastUpdateTime); + lastUpdateTime = newTime; + if (changingAlpha) { + time += dt; + if (time > 1050) { + time = 1050; + } + alpha = 0.5f + interpolator.getInterpolation(time / 150.0f) * 0.5f; + if (alpha >= 1.0f) { + changingAlpha = false; + alpha = 1.0f; + } + imageView.setAlpha(alpha * premiumAlpha); + } else if (scaled && scale != 0.8f) { + scale -= dt / 400.0f; + if (scale < 0.8f) { + scale = 0.8f; + } + } else { + scale += dt / 400.0f; + if (scale > 1.0f) { + scale = 1.0f; + } + } + view.invalidate(); + } + 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.setAlpha(alpha * premiumAlpha); + if (scale != 1f) { + canvas.save(); + canvas.scale(scale, scale, cX, cY); + imageView.draw(canvas); + canvas.restore(); + } else { + 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 f99ca5175..0e6bae2b9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java @@ -10,6 +10,8 @@ package org.telegram.ui.Cells; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; @@ -22,7 +24,9 @@ import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; +import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; @@ -32,7 +36,9 @@ 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.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SvgHelper; import org.telegram.tgnet.TLObject; @@ -43,13 +49,18 @@ import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.Easings; import org.telegram.ui.Components.ForegroundColorSpanThemable; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.Premium.PremiumButtonView; +import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.Components.RadialProgressView; +import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PremiumPreviewFragment; import java.util.ArrayList; import java.util.Locale; public class StickerSetCell extends FrameLayout { private final static String LINK_PREFIX = "t.me/addstickers/"; + private final static String LINK_PREFIX_EMOJI = "t.me/addemoji/"; private final int option; @@ -64,7 +75,17 @@ public class StickerSetCell extends FrameLayout { private TLRPC.TL_messages_stickerSet stickersSet; private Rect rect = new Rect(); + private boolean emojis; + private FrameLayout sideButtons; + private TextView addButtonView; + private TextView removeButtonView; + private PremiumButtonView premiumButtonView; + public StickerSetCell(Context context, int option) { + this(context, null, option); + } + + public StickerSetCell(Context context, Theme.ResourcesProvider resourcesProvider, int option) { super(context); this.option = option; @@ -130,6 +151,70 @@ public class StickerSetCell extends FrameLayout { addView(optionsButton, LayoutHelper.createFrame(40, 40, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP, (LocaleController.isRTL ? 10 : 0), 9, (LocaleController.isRTL ? 0 : 10), 0)); } } + + sideButtons = new FrameLayout(getContext()); + + addButtonView = new TextView(context); + addButtonView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + addButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addButtonView.setText(LocaleController.getString("Add", R.string.Add)); + addButtonView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText, resourcesProvider)); + addButtonView.setBackground(Theme.AdaptiveRipple.createRect(Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider), Theme.getColor(Theme.key_featuredStickers_addButtonPressed, resourcesProvider), 4)); + addButtonView.setPadding(AndroidUtilities.dp(14), 0, AndroidUtilities.dp(14), 0); + addButtonView.setGravity(Gravity.CENTER); + addButtonView.setOnClickListener(e -> onAddButtonClick()); + sideButtons.addView(addButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL)); + + removeButtonView = new TextView(context); + removeButtonView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + removeButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + removeButtonView.setText(LocaleController.getString("StickersRemove", R.string.StickersRemove)); + removeButtonView.setTextColor(Theme.getColor(Theme.key_featuredStickers_removeButtonText, resourcesProvider)); + removeButtonView.setBackground(Theme.AdaptiveRipple.createRect(0, Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider) & 0x1affffff, 4)); + removeButtonView.setPadding(AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12), 0); + removeButtonView.setGravity(Gravity.CENTER); + removeButtonView.setOnClickListener(e -> onRemoveButtonClick()); + sideButtons.addView(removeButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 32, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 0, -2, 0, 0)); + + premiumButtonView = new PremiumButtonView(context, AndroidUtilities.dp(4), false); + premiumButtonView.setIcon(R.raw.unlock_icon); + premiumButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> onPremiumButtonClick()); + try { + MarginLayoutParams iconLayout = (MarginLayoutParams) premiumButtonView.getIconView().getLayoutParams(); + iconLayout.leftMargin = AndroidUtilities.dp(1); + iconLayout.topMargin = AndroidUtilities.dp(1); + iconLayout.width = iconLayout.height = AndroidUtilities.dp(20); + MarginLayoutParams layout = (MarginLayoutParams) premiumButtonView.getTextView().getLayoutParams(); + layout.leftMargin = AndroidUtilities.dp(3); + premiumButtonView.getChildAt(0).setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); + } catch (Exception ev) {} + sideButtons.addView(premiumButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL)); + + sideButtons.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), 0); + addView(sideButtons, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT), 0, 0, 0, 0)); + sideButtons.setOnClickListener(e -> { + if (premiumButtonView.getVisibility() == View.VISIBLE && premiumButtonView.isEnabled()) { + premiumButtonView.performClick(); + } else if (addButtonView.getVisibility() == View.VISIBLE && addButtonView.isEnabled()) { + addButtonView.performClick(); + } else if (removeButtonView.getVisibility() == View.VISIBLE && removeButtonView.isEnabled()) { + removeButtonView.performClick(); + } + }); + + updateButtonState(BUTTON_STATE_EMPTY, false); + } + + protected void onAddButtonClick() { + + } + + protected void onRemoveButtonClick() { + + } + + protected void onPremiumButtonClick() { + } @Override @@ -179,8 +264,12 @@ public class StickerSetCell extends FrameLayout { } int linkIndex = set.short_name.toLowerCase(Locale.ROOT).indexOf(query); if (linkIndex != -1) { - linkIndex += LINK_PREFIX.length(); - SpannableString spannableString = new SpannableString(LINK_PREFIX + set.short_name); + String linkPrefix = LINK_PREFIX; + if (set.emojis) { + linkPrefix = LINK_PREFIX_EMOJI; + } + linkIndex += linkPrefix.length(); + SpannableString spannableString = new SpannableString(linkPrefix + set.short_name); spannableString.setSpan(new ForegroundColorSpanThemable(Theme.key_windowBackgroundWhiteBlueText4, resourcesProvider), linkIndex, linkIndex + query.length(), 0); valueTextView.setText(spannableString); } @@ -208,9 +297,13 @@ public class StickerSetCell extends FrameLayout { imageView.setAlpha(1.0f); } + emojis = set.set.emojis; + sideButtons.setVisibility(emojis ? View.VISIBLE : View.GONE); + optionsButton.setVisibility(emojis ? View.GONE : View.VISIBLE); + ArrayList documents = set.documents; if (documents != null && !documents.isEmpty()) { - valueTextView.setText(LocaleController.formatPluralString("Stickers", documents.size())); + valueTextView.setText(LocaleController.formatPluralString(emojis ? "EmojiCount" : "Stickers", documents.size())); TLRPC.Document sticker = documents.get(0); TLObject object = FileLoader.getClosestPhotoSizeWithSize(set.set.thumbs, 90); @@ -240,11 +333,11 @@ public class StickerSetCell extends FrameLayout { imageView.setImage(imageLocation, "50_50", "webp", svgThumb, set); } } else { - valueTextView.setText(LocaleController.formatPluralString("Stickers", 0)); + valueTextView.setText(LocaleController.formatPluralString(set.set.emojis ? "EmojiCount" : "Stickers", 0)); imageView.setImageDrawable(null); } if (groupSearch) { - valueTextView.setText(LINK_PREFIX + set.set.short_name); + valueTextView.setText((set.set.emojis ? LINK_PREFIX_EMOJI : LINK_PREFIX) + set.set.short_name); } } @@ -253,40 +346,71 @@ public class StickerSetCell extends FrameLayout { } public boolean isChecked() { - return option == 1 ? checkBox.isChecked() : option == 3 && optionsButton.getVisibility() == VISIBLE; + if (option == 1) { + return checkBox.isChecked(); + } + if (option == 3) { + return optionsButton.getVisibility() == VISIBLE; + } + if (emojis) { + return sideButtons.getVisibility() == VISIBLE; + } + return false; } public void setChecked(boolean checked, boolean animated) { - switch (option) { - case 1: - checkBox.setChecked(checked, animated); - break; - case 3: - if (animated) { - optionsButton.animate().cancel(); - optionsButton.animate().setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (!checked) { - optionsButton.setVisibility(INVISIBLE); - } + if (option == 1) { + checkBox.setChecked(checked, animated); + } else if (emojis) { + if (animated) { + sideButtons.animate().cancel(); + sideButtons.animate().setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (!checked) { + sideButtons.setVisibility(INVISIBLE); } - - @Override - public void onAnimationStart(Animator animation) { - if (checked) { - optionsButton.setVisibility(VISIBLE); - } - } - }).alpha(checked ? 1 : 0).scaleX(checked ? 1 : 0.1f).scaleY(checked ? 1 : 0.1f).setDuration(150).start(); - } else { - optionsButton.setVisibility(checked ? VISIBLE : INVISIBLE); - if (!checked) { - optionsButton.setScaleX(0.1f); - optionsButton.setScaleY(0.1f); } + + @Override + public void onAnimationStart(Animator animation) { + if (checked) { + sideButtons.setVisibility(VISIBLE); + } + } + }).alpha(checked ? 1 : 0).scaleX(checked ? 1 : 0.1f).scaleY(checked ? 1 : 0.1f).setDuration(150).start(); + } else { + sideButtons.setVisibility(checked ? VISIBLE : INVISIBLE); + if (!checked) { + sideButtons.setScaleX(0.1f); + sideButtons.setScaleY(0.1f); } - break; + } + } else if (option == 3) { + if (animated) { + optionsButton.animate().cancel(); + optionsButton.animate().setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (!checked) { + optionsButton.setVisibility(INVISIBLE); + } + } + + @Override + public void onAnimationStart(Animator animation) { + if (checked) { + optionsButton.setVisibility(VISIBLE); + } + } + }).alpha(checked ? 1 : 0).scaleX(checked ? 1 : 0.1f).scaleY(checked ? 1 : 0.1f).setDuration(150).start(); + } else { + optionsButton.setVisibility(checked ? VISIBLE : INVISIBLE); + if (!checked) { + optionsButton.setScaleX(0.1f); + optionsButton.setScaleY(0.1f); + } + } } } @@ -314,8 +438,22 @@ public class StickerSetCell extends FrameLayout { } }).start(); - optionsButton.setVisibility(VISIBLE); - optionsButton.animate() + if (emojis) { + sideButtons.setVisibility(VISIBLE); + sideButtons.animate() + .alpha(alphaValues[1]) + .scaleX(scaleValues[1]) + .scaleY(scaleValues[1]) + .setDuration(200) + .setInterpolator(Easings.easeOutSine) + .withEndAction(() -> { + if (reorderable) { + sideButtons.setVisibility(GONE); + } + }).start(); + } else { + optionsButton.setVisibility(VISIBLE); + optionsButton.animate() .alpha(alphaValues[1]) .scaleX(scaleValues[1]) .scaleY(scaleValues[1]) @@ -326,16 +464,26 @@ public class StickerSetCell extends FrameLayout { optionsButton.setVisibility(GONE); } }).start(); + } + } else { reorderButton.setVisibility(reorderable ? VISIBLE : GONE); reorderButton.setAlpha(alphaValues[0]); reorderButton.setScaleX(scaleValues[0]); reorderButton.setScaleY(scaleValues[0]); - optionsButton.setVisibility(reorderable ? GONE : VISIBLE); - optionsButton.setAlpha(alphaValues[1]); - optionsButton.setScaleX(scaleValues[1]); - optionsButton.setScaleY(scaleValues[1]); + if (emojis) { + sideButtons.setVisibility(reorderable ? GONE : VISIBLE); + sideButtons.setAlpha(alphaValues[1]); + sideButtons.setScaleX(scaleValues[1]); + sideButtons.setScaleY(scaleValues[1]); + } else { + optionsButton.setVisibility(reorderable ? GONE : VISIBLE); + optionsButton.setAlpha(alphaValues[1]); + optionsButton.setScaleX(scaleValues[1]); + optionsButton.setScaleY(scaleValues[1]); + } + } } } @@ -364,6 +512,12 @@ public class StickerSetCell extends FrameLayout { return true; } } + if (Build.VERSION.SDK_INT >= 21 && getBackground() != null && emojis && sideButtons != null) { + sideButtons.getHitRect(rect); + if (rect.contains((int) event.getX(), (int) event.getY())) { + return true; + } + } return super.onTouchEvent(event); } @@ -374,6 +528,73 @@ public class StickerSetCell extends FrameLayout { } } + public static final int BUTTON_STATE_EMPTY = 0; + public static final int BUTTON_STATE_LOCKED = 1; + public static final int BUTTON_STATE_LOCKED_RESTORE = 2; + public static final int BUTTON_STATE_ADD = 3; + public static final int BUTTON_STATE_REMOVE = 4; + + private AnimatorSet stateAnimator; + public void updateButtonState(int state, boolean animated) { + if (stateAnimator != null) { + stateAnimator.cancel(); + stateAnimator = null; + } + if (state == BUTTON_STATE_LOCKED) { + premiumButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> onPremiumButtonClick()); + } else if (state == BUTTON_STATE_LOCKED_RESTORE) { + premiumButtonView.setButton(LocaleController.getString("Restore", R.string.Restore), e -> onPremiumButtonClick()); + } + premiumButtonView.setEnabled(state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE); + addButtonView.setEnabled(state == BUTTON_STATE_ADD); + removeButtonView.setEnabled(state == BUTTON_STATE_REMOVE); + if (animated) { + stateAnimator = new AnimatorSet(); + stateAnimator.playTogether( + ObjectAnimator.ofFloat(premiumButtonView, ALPHA, state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? 1 : 0), + ObjectAnimator.ofFloat(premiumButtonView, SCALE_X, state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? 1 : .6f), + ObjectAnimator.ofFloat(premiumButtonView, SCALE_Y, state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? 1 : .6f), + ObjectAnimator.ofFloat(addButtonView, ALPHA, state == BUTTON_STATE_ADD ? 1 : 0), + ObjectAnimator.ofFloat(addButtonView, SCALE_X, state == BUTTON_STATE_ADD ? 1 : .6f), + ObjectAnimator.ofFloat(addButtonView, SCALE_Y, state == BUTTON_STATE_ADD ? 1 : .6f), + ObjectAnimator.ofFloat(removeButtonView, ALPHA, state == BUTTON_STATE_REMOVE ? 1 : 0), + ObjectAnimator.ofFloat(removeButtonView, SCALE_X, state == BUTTON_STATE_REMOVE ? 1 : .6f), + ObjectAnimator.ofFloat(removeButtonView, SCALE_Y, state == BUTTON_STATE_REMOVE ? 1 : .6f) + ); + stateAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + premiumButtonView.setVisibility(View.VISIBLE); + addButtonView.setVisibility(View.VISIBLE); + removeButtonView.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationEnd(Animator animation) { + premiumButtonView.setVisibility(state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? View.VISIBLE : View.GONE); + addButtonView.setVisibility(state == BUTTON_STATE_ADD ? View.VISIBLE : View.GONE); + removeButtonView.setVisibility(state == BUTTON_STATE_REMOVE ? View.VISIBLE : View.GONE); + } + }); + stateAnimator.setDuration(250); + stateAnimator.setInterpolator(new OvershootInterpolator(1.02f)); + stateAnimator.start(); + } else { + premiumButtonView.setAlpha(state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? 1 : 0); + premiumButtonView.setScaleX(state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? 1 : .6f); + premiumButtonView.setScaleY(state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? 1 : .6f); + premiumButtonView.setVisibility(state == BUTTON_STATE_LOCKED || state == BUTTON_STATE_LOCKED_RESTORE ? View.VISIBLE : View.GONE); + addButtonView.setAlpha(state == BUTTON_STATE_ADD ? 1 : 0); + addButtonView.setScaleX(state == BUTTON_STATE_ADD ? 1 : .6f); + addButtonView.setScaleY(state == BUTTON_STATE_ADD ? 1 : .6f); + addButtonView.setVisibility(state == BUTTON_STATE_ADD ? View.VISIBLE : View.GONE); + removeButtonView.setAlpha(state == BUTTON_STATE_REMOVE ? 1 : 0); + removeButtonView.setScaleX(state == BUTTON_STATE_REMOVE ? 1 : .6f); + removeButtonView.setScaleY(state == BUTTON_STATE_REMOVE ? 1 : .6f); + removeButtonView.setVisibility(state == BUTTON_STATE_REMOVE ? View.VISIBLE : View.GONE); + } + } + @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); 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 1baecce37..cdd874190 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetNameCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetNameCell.java @@ -11,6 +11,7 @@ package org.telegram.ui.Cells; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.os.Build; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -33,6 +34,7 @@ import org.telegram.ui.Components.RecyclerListView; import java.util.List; public class StickerSetNameCell extends FrameLayout { + public int position; private TextView textView; private TextView urlTextView; @@ -58,7 +60,7 @@ public class StickerSetNameCell extends FrameLayout { isEmoji = emoji; - FrameLayout.LayoutParams lp; + LayoutParams lp; textView = new TextView(context); textView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); @@ -66,10 +68,16 @@ public class StickerSetNameCell extends FrameLayout { textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setSingleLine(true); + if (emoji) { + textView.setGravity(Gravity.CENTER); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + textView.setTextAlignment(TEXT_ALIGNMENT_CENTER); + } + } if (supportRtl) { - lp = LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.START, emoji ? 15 : 17, 2, 57, 0); + lp = LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.TOP, emoji ? 5 : 17, emoji ? 10 : 2, emoji ? 15 : 57, 0); } else { - lp = LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, emoji ? 15 : 17, 2, 57, 0); + lp = LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, emoji ? 5 : 17, emoji ? 10 : 2, emoji ? 15 : 57, 0); } addView(textView, lp); @@ -80,9 +88,9 @@ public class StickerSetNameCell extends FrameLayout { urlTextView.setSingleLine(true); urlTextView.setVisibility(INVISIBLE); if (supportRtl) { - lp = LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.END, 17, 6, 17, 0); + lp = LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.END, 12, 6, 17, 0); } else { - lp = LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.RIGHT, 17, 6, 17, 0); + lp = LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.RIGHT, 12, 6, 17, 0); } addView(urlTextView, lp); @@ -90,9 +98,9 @@ public class StickerSetNameCell extends FrameLayout { buttonView.setScaleType(ImageView.ScaleType.CENTER); buttonView.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_emojiPanelStickerSetNameIcon), PorterDuff.Mode.MULTIPLY)); if (supportRtl) { - lp = LayoutHelper.createFrameRelatively(24, 24, Gravity.TOP | Gravity.END, 0, 0, 16, 0); + lp = LayoutHelper.createFrameRelatively(24, 24, Gravity.TOP | Gravity.END, 0, 0, 11, 0); } else { - lp = LayoutHelper.createFrame(24, 24, Gravity.TOP | Gravity.RIGHT, 0, 0, 16, 0); + lp = LayoutHelper.createFrame(24, 24, Gravity.TOP | Gravity.RIGHT, 0, 0, 11, 0); } addView(buttonView, lp); } @@ -141,6 +149,7 @@ public class StickerSetNameCell extends FrameLayout { textView.setText(""); buttonView.setVisibility(INVISIBLE); } else { + empty = false; if (searchLength != 0) { updateTextSearchSpan(); } else { @@ -182,7 +191,7 @@ 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(isEmoji ? 28 : 24), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(isEmoji ? 32 : 24), MeasureSpec.EXACTLY)); } } @@ -211,4 +220,8 @@ public class StickerSetNameCell extends FrameLayout { Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null; return color != null ? color : Theme.getColor(key); } + + public TextView getTextView() { + return textView; + } } 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 cb222380e..91d838193 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java @@ -75,6 +75,8 @@ public class TextInfoPrivacyCell extends FrameLayout { textView.setLinkTextColor(getThemedColor(linkTextColorKey)); textView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, padding, 0, padding, 0)); + + setWillNotDraw(false); } @Override 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 06110f73a..1cfc6b39c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java @@ -49,11 +49,13 @@ import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.Utilities; import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.FloatingActionMode; import org.telegram.ui.ActionBar.FloatingToolbar; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ArticleViewer; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.RestrictedLanguagesSelectActivity; @@ -216,6 +218,7 @@ public abstract class TextSelectionHelper= s && offset <= e) { selectionStart = s; selectionEnd = e; + found = true; break; } } + if (!found) { + AnimatedEmojiSpan[] spans2 = ((Spanned) text).getSpans(0, text.length(), AnimatedEmojiSpan.class); + for (AnimatedEmojiSpan emojiSpan : spans2) { + int s = ((Spanned) text).getSpanStart(emojiSpan); + int e = ((Spanned) text).getSpanEnd(emojiSpan); + if (offset >= s && offset <= e) { + selectionStart = s; + selectionEnd = e; + break; + } + } + } } if (selectionStart == selectionEnd) { @@ -730,6 +746,7 @@ public abstract class TextSelectionHelper textLen) { end = textLen; @@ -1126,8 +1143,9 @@ public abstract class TextSelectionHelper layout.getText().length()) { + int blockOffset = offset - layoutBlock.charOffset; + if (layout == null || blockOffset < 0 || blockOffset > layout.getText().length()) { return tmpCoord; } - int line = layout.getLineForOffset(offset); - tmpCoord[0] = (int) (layout.getPrimaryHorizontal(offset) + layoutBlock.xOffset); + + int line = layout.getLineForOffset(blockOffset); + tmpCoord[0] = (int) (layout.getPrimaryHorizontal(blockOffset) + layoutBlock.xOffset); tmpCoord[1] = layout.getLineBottom(line); tmpCoord[1] += layoutBlock.yOffset; return tmpCoord; @@ -1590,6 +1608,7 @@ public abstract class TextSelectionHelper 1) { - if (selectionStart < block.charactersOffset) { - selectionStart = block.charactersOffset; - } - if (selectionStart > block.charactersEnd) { - selectionStart = block.charactersEnd; - } - if (selectionEnd < block.charactersOffset) { - selectionEnd = block.charactersOffset; - } - if (selectionEnd > block.charactersEnd) { - selectionEnd = block.charactersEnd; - } - } + int selectionStart = this.selectionStart - block.charactersOffset; + int selectionEnd = this.selectionEnd - block.charactersOffset; + selectionStart = Utilities.clamp(selectionStart, block.textLayout.getText().length(), 0); + selectionEnd = Utilities.clamp(selectionEnd, block.textLayout.getText().length(), 0); + if (selectionStart != selectionEnd) { if (selectedMessageObject.isOutOwner()) { @@ -1814,7 +1824,8 @@ public abstract class TextSelectionHelper= 0) { - return layout.getOffsetForHorizontal(line, x); + int k = layoutBlock.charOffset + layout.getOffsetForHorizontal(line, x);; + return k; } return -1; @@ -1830,11 +1841,13 @@ public abstract class TextSelectionHelper= block.charactersOffset && offset <= block.charactersEnd) { - layoutBlock.layout = messageObject.textLayoutBlocks.get(i).textLayout; - layoutBlock.yOffset = messageObject.textLayoutBlocks.get(i).textYOffset; + int blockOffset = offset - block.charactersOffset; + if (blockOffset >= 0 && blockOffset <= block.textLayout.getText().length()) { + layoutBlock.layout = block.textLayout; + layoutBlock.yOffset = block.textYOffset; layoutBlock.xOffset = -(block.isRtl() ? (int) Math.ceil(messageObject.textXOffset) : 0); + layoutBlock.charOffset = block.charactersOffset; return; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java index efdb15ac8..7c40ebda2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSettingsCell.java @@ -104,6 +104,10 @@ public class TextSettingsCell extends FrameLayout { addView(valueImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, padding, 0, padding, 0)); } + public ImageView getValueImageView() { + return valueImageView; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(50) + (needDivider ? 1 : 0)); @@ -124,6 +128,15 @@ public class TextSettingsCell extends FrameLayout { if (valueTextView.getVisibility() == VISIBLE) { valueTextView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); width = availableWidth - valueTextView.getMeasuredWidth() - AndroidUtilities.dp(8); + + if (valueImageView.getVisibility() == VISIBLE) { + MarginLayoutParams params = (MarginLayoutParams) valueImageView.getLayoutParams(); + if (LocaleController.isRTL) { + params.leftMargin = AndroidUtilities.dp(padding + 4) + valueTextView.getMeasuredWidth(); + } else { + params.rightMargin = AndroidUtilities.dp(padding + 4) + valueTextView.getMeasuredWidth(); + } + } } else { width = availableWidth; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ThemePreviewMessagesCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ThemePreviewMessagesCell.java index 9730f8f99..b6735fd8b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ThemePreviewMessagesCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ThemePreviewMessagesCell.java @@ -94,6 +94,15 @@ public class ThemePreviewMessagesCell extends LinearLayout { } else { message.message = LocaleController.getString("NewThemePreviewReply", R.string.NewThemePreviewReply); } + String greeting = "\uD83D\uDC4B"; + int index = message.message.indexOf(greeting); + if (index >= 0) { + TLRPC.TL_messageEntityCustomEmoji entity = new TLRPC.TL_messageEntityCustomEmoji(); + entity.offset = index; + entity.length = greeting.length(); + entity.document_id = 5386654653003864312L; + message.entities.add(entity); + } message.date = date + 60; message.dialog_id = 1; message.flags = 259; @@ -125,6 +134,15 @@ public class ThemePreviewMessagesCell extends LinearLayout { } message.message = builder.toString(); } + String cool = "\uD83D\uDE0E"; + int index1 = message.message.indexOf(cool); + if (index1 >= 0) { + TLRPC.TL_messageEntityCustomEmoji entity = new TLRPC.TL_messageEntityCustomEmoji(); + entity.offset = index1; + entity.length = cool.length(); + entity.document_id = 5373141891321699086L; + message.entities.add(entity); + } message.date = date + 960; message.dialog_id = 1; message.flags = 259; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java index 002c8e639..89e94afa0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java @@ -29,6 +29,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.TextUtils; import android.text.style.CharacterStyle; import android.text.style.URLSpan; @@ -57,7 +58,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildConfig; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; @@ -1249,30 +1250,28 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio return true; } - private String getMessageContent(MessageObject messageObject, int previousUid, boolean name) { - String str = ""; + private CharSequence getMessageContent(MessageObject messageObject, int previousUid, boolean name) { + SpannableStringBuilder str = new SpannableStringBuilder(); if (name) { long fromId = messageObject.getFromChatId(); if (previousUid != fromId) { if (fromId > 0) { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(fromId); if (user != null) { - str = ContactsController.formatName(user.first_name, user.last_name) + ":\n"; + str.append(ContactsController.formatName(user.first_name, user.last_name)).append(":\n"); } } else if (fromId < 0) { TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-fromId); if (chat != null) { - str = chat.title + ":\n"; + str.append(chat.title).append(":\n"); } } } } - if (messageObject.type == 0 && messageObject.messageOwner.message != null) { - str += messageObject.messageOwner.message; - } else if (messageObject.messageOwner.media != null && messageObject.messageOwner.message != null) { - str += messageObject.messageOwner.message; + if (TextUtils.isEmpty(messageObject.messageText)) { + str.append(messageObject.messageOwner.message); } else { - str += messageObject.messageText; + str.append(messageObject.messageText); } return str; } @@ -1474,7 +1473,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio intent.setType(selectedObject.getDocument().mime_type); if (Build.VERSION.SDK_INT >= 24) { try { - intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", new File(path))); + intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", new File(path))); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (Exception ignore) { intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path))); @@ -1482,7 +1481,11 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } else { intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path))); } - getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500); + try { + getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500); + } catch (Exception e) { + + } break; } case 7: { @@ -2045,6 +2048,12 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } ChatMessageCell chatMessageCell = (ChatMessageCell) view; chatMessageCell.setDelegate(new ChatMessageCell.ChatMessageCellDelegate() { + + @Override + public boolean canDrawOutboundsContent() { + return true; + } + @Override public void didPressSideButton(ChatMessageCell cell) { if (getParentActivity() == null) { @@ -2259,7 +2268,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= 24) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setDataAndType(FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", f), "video/mp4"); + intent.setDataAndType(FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", f), "video/mp4"); } else { intent.setDataAndType(Uri.fromFile(f), "video/mp4"); } @@ -2268,7 +2277,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio alertUserOpenError(message); } } else if (message.type == 4) { - if (!AndroidUtilities.isGoogleMapsInstalled(ChannelAdminLogActivity.this)) { + if (!AndroidUtilities.isMapsInstalled(ChannelAdminLogActivity.this)) { return; } LocationActivity fragment = new LocationActivity(0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java index 523c508ab..ac623dc0f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java @@ -272,8 +272,12 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC cancelDialog = builder.show(); } + private Runnable enableDoneLoading = () -> updateDoneProgress(true); private ValueAnimator doneButtonDrawableAnimator; private void updateDoneProgress(boolean loading) { + if (!loading) { + AndroidUtilities.cancelRunOnUIThread(enableDoneLoading); + } if (doneButtonDrawable != null) { if (doneButtonDrawableAnimator != null) { doneButtonDrawableAnimator.cancel(); @@ -325,7 +329,7 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC return; } donePressed = true; - updateDoneProgress(true); + AndroidUtilities.runOnUIThread(enableDoneLoading, 200); if (imageUpdater.isUploadingImage()) { createAfterUpload = true; return; @@ -594,7 +598,7 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC showAvatarProgress(false, false); - nameTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT); + nameTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT, false); nameTextView.setHint(LocaleController.getString("EnterChannelName", R.string.EnterChannelName)); if (nameToSet != null) { nameTextView.setText(nameToSet); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index a3ddd6d13..37b16497d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -109,7 +109,6 @@ import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ChatThemeController; @@ -161,7 +160,6 @@ import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Adapters.MessagesSearchAdapter; -import org.telegram.ui.Adapters.StickersAdapter; import org.telegram.ui.Cells.BotHelpCell; import org.telegram.ui.Cells.BotSwitchCell; import org.telegram.ui.Cells.ChatActionCell; @@ -175,6 +173,8 @@ import org.telegram.ui.Cells.MentionCell; import org.telegram.ui.Cells.StickerCell; import org.telegram.ui.Cells.TextSelectionHelper; import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AnimatedFileDrawable; import org.telegram.ui.Components.AnimationProperties; import org.telegram.ui.Components.AttachBotIntroTopView; @@ -207,6 +207,7 @@ import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.EditTextCaption; import org.telegram.ui.Components.EmbedBottomSheet; +import org.telegram.ui.Components.EmojiPacksAlert; import org.telegram.ui.Components.EmojiView; import org.telegram.ui.Components.ExtendedGridLayoutManager; import org.telegram.ui.Components.FireworksOverlay; @@ -222,6 +223,7 @@ import org.telegram.ui.Components.JoinGroupAlert; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.MentionsContainerView; import org.telegram.ui.Components.MessageBackgroundDrawable; +import org.telegram.ui.Components.MessageContainsEmojiButton; import org.telegram.ui.Components.MotionBackgroundDrawable; import org.telegram.ui.Components.NumberTextView; import org.telegram.ui.Components.PhonebookShareAlert; @@ -229,7 +231,9 @@ import org.telegram.ui.Components.PinnedLineView; import org.telegram.ui.Components.PipRoundVideoView; import org.telegram.ui.Components.PollVotesAlert; import org.telegram.ui.Components.PopupSwipeBackLayout; +import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet; import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; +import org.telegram.ui.Components.Premium.PremiumPreviewBottomSheet; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.ReactedHeaderView; @@ -246,6 +250,7 @@ import org.telegram.ui.Components.ShareAlert; import org.telegram.ui.Components.SharedMediaLayout; import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.StickersAlert; +import org.telegram.ui.Components.SuggestEmojiView; import org.telegram.ui.Components.TextSelectionHint; import org.telegram.ui.Components.TextStyleSpan; import org.telegram.ui.Components.ThemeEditorView; @@ -284,8 +289,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; @SuppressWarnings("unchecked") -public class -ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate, LocationActivity.LocationActivityDelegate, ChatAttachAlertDocumentLayout.DocumentSelectActivityDelegate { +public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate, LocationActivity.LocationActivityDelegate, ChatAttachAlertDocumentLayout.DocumentSelectActivityDelegate { protected TLRPC.Chat currentChat; protected TLRPC.User currentUser; @@ -339,12 +343,8 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent private ChatAvatarContainer avatarContainer; private TextView bottomOverlayText; private NumberTextView selectedMessagesCountTextView; - private RecyclerListView stickersListView; - private ImageView stickersPanelArrow; - private RecyclerListView.OnItemClickListener stickersOnItemClickListener; private RecyclerListView.OnItemClickListener mentionsOnItemClickListener; - private StickersAdapter stickersAdapter; - private FrameLayout stickersPanel; + private SuggestEmojiView suggestEmojiPanel; private ActionBarMenuSubItem muteItem; private View muteItemGap; private ChatNotificationsPopupWrapper chatNotificationsPopupWrapper; @@ -374,7 +374,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent private ImageView replyCloseImageView; public MentionsContainerView mentionContainer; private AnimatorSet mentionListAnimation; - private ChatAttachAlert chatAttachAlert; + public ChatAttachAlert chatAttachAlert; private BlurredFrameLayout topChatPanelView; private AnimatorSet reportSpamViewAnimator; private TextView addToContactsButton; @@ -530,7 +530,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent private AnimatorSet editButtonAnimation; private AnimatorSet forwardButtonAnimation; - private int lastStableId = 10; + private static int lastStableId = 10; private boolean openSearchKeyboard; @@ -806,8 +806,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } }; - private KeyboardHideHelper keyboardHideHelper = new KeyboardHideHelper(); - private boolean isPauseOnThemePreview; private ChatThemeBottomSheet chatThemeBottomSheet; public ThemeDelegate themeDelegate; @@ -1316,9 +1314,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent RecyclerListView.OnItemLongClickListenerExtended onItemLongClickListener = new RecyclerListView.OnItemLongClickListenerExtended() { @Override public boolean onItemClick(View view, int position, float x, float y) { - if (keyboardHideHelper.disableScrolling()) { - return false; - } if (textSelectionHelper.isTryingSelect() || textSelectionHelper.isSelectionMode() || inPreviewMode) { return false; } @@ -1749,6 +1744,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent getNotificationCenter().addObserver(this, NotificationCenter.messagePlayingDidStart); getNotificationCenter().addObserver(this, NotificationCenter.updateMessageMedia); getNotificationCenter().addObserver(this, NotificationCenter.voiceTranscriptionUpdate); + getNotificationCenter().addObserver(this, NotificationCenter.animatedEmojiDocumentLoaded); getNotificationCenter().addObserver(this, NotificationCenter.replaceMessagesObjects); getNotificationCenter().addObserver(this, NotificationCenter.notificationsSettingsUpdated); getNotificationCenter().addObserver(this, NotificationCenter.replyMessagesDidLoad); @@ -1770,6 +1766,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent getNotificationCenter().addObserver(this, NotificationCenter.dialogDeleted); getNotificationCenter().addObserver(this, NotificationCenter.chatAvailableReactionsUpdated); getNotificationCenter().addObserver(this, NotificationCenter.dialogsUnreadReactionsCounterChanged); + getNotificationCenter().addObserver(this, NotificationCenter.groupStickersDidLoad); super.onFragmentCreate(); @@ -2053,6 +2050,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent getNotificationCenter().removeObserver(this, NotificationCenter.messagePlayingGoingToStop); getNotificationCenter().removeObserver(this, NotificationCenter.updateMessageMedia); getNotificationCenter().removeObserver(this, NotificationCenter.voiceTranscriptionUpdate); + getNotificationCenter().removeObserver(this, NotificationCenter.animatedEmojiDocumentLoaded); getNotificationCenter().removeObserver(this, NotificationCenter.replaceMessagesObjects); getNotificationCenter().removeObserver(this, NotificationCenter.notificationsSettingsUpdated); getNotificationCenter().removeObserver(this, NotificationCenter.replyMessagesDidLoad); @@ -2088,6 +2086,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent getNotificationCenter().removeObserver(this, NotificationCenter.didLoadSponsoredMessages); getNotificationCenter().removeObserver(this, NotificationCenter.didLoadSendAsPeers); getNotificationCenter().removeObserver(this, NotificationCenter.dialogsUnreadReactionsCounterChanged); + getNotificationCenter().removeObserver(this, NotificationCenter.groupStickersDidLoad); if (currentEncryptedChat != null) { getNotificationCenter().removeObserver(this, NotificationCenter.didVerifyMessagesStickers); } @@ -2112,9 +2111,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent getMessagesController().cancelLoadFullUser(currentUser.id); } AndroidUtilities.removeAdjustResize(getParentActivity(), classGuid); - if (stickersAdapter != null) { - stickersAdapter.onDestroy(); - } if (chatAttachAlert != null) { chatAttachAlert.onDestroy(); } @@ -2227,11 +2223,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent chatAttachAlert = null; } - if (stickersAdapter != null) { - stickersAdapter.onDestroy(); - stickersAdapter = null; - } - Theme.createChatResources(context, false); actionBar.setAddToContainer(false); @@ -2252,7 +2243,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } } else if (id == copy) { - String str = ""; + SpannableStringBuilder str = new SpannableStringBuilder(); long previousUid = 0; for (int a = 1; a >= 0; a--) { ArrayList ids = new ArrayList<>(); @@ -2268,9 +2259,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent Integer messageId = ids.get(b); MessageObject messageObject = selectedMessagesCanCopyIds[a].get(messageId); if (str.length() != 0) { - str += "\n\n"; + str.append("\n\n"); } - str += getMessageContent(messageObject, previousUid, ids.size() != 1 && (currentUser == null || !currentUser.self)); + str.append(getMessageContent(messageObject, previousUid, ids.size() != 1 && (currentUser == null || !currentUser.self))); previousUid = messageObject.getFromChatId(); } } @@ -3015,6 +3006,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } if (child instanceof ChatMessageCell) { ChatMessageCell cell = (ChatMessageCell) child; + cell.drawForBlur = true; if (cell.drawBackgroundInParent()) { cell.drawBackgroundInternal(blurCanvas, true); } @@ -3022,6 +3014,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (cell.hasOutboundsContent()) { ((ChatMessageCell) child).drawOutboundsContent(blurCanvas); } + cell.drawForBlur = false; } else { child.draw(blurCanvas); } @@ -3056,6 +3049,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (mentionContainer != null) { mentionContainer.onPanTransitionStart(); } + if (mediaBanTooltip != null) { + mediaBanTooltip.hide(false); + } } @Override @@ -3172,7 +3168,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent return false; } - keyboardHideHelper.onTouch(adjustPanLayoutHelper, this, chatListView, chatActivityEnterView, ChatActivity.this, ev); lastTouchY = ev.getY(); TextSelectionHelper.TextSelectionOverlay selectionOverlay = textSelectionHelper.getOverlayView(context); ev.offsetLocation(-selectionOverlay.getX(), -selectionOverlay.getY()); @@ -3569,6 +3564,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (cell != null && cell.hasOutboundsContent()) { cell.drawOutboundsContent(canvas); } + canvas.restore(); if (cell != null) { @@ -4259,6 +4255,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent private long lastReplyButtonAnimationTime; private boolean ignoreLayout; + private boolean invalidated; int lastH = 0; @@ -4345,9 +4342,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent @Override public boolean onInterceptTouchEvent(MotionEvent e) { textSelectionHelper.checkSelectionCancel(e); - if (keyboardHideHelper.disableScrolling()) { - return false; - } if (isFastScrollAnimationRunning()) { return false; } @@ -4516,9 +4510,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent @Override public boolean onTouchEvent(MotionEvent e) { textSelectionHelper.checkSelectionCancel(e); - if (keyboardHideHelper.disableScrolling()) { - return false; - } if (e.getAction() == MotionEvent.ACTION_DOWN) { scrollByTouch = true; } @@ -4692,6 +4683,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent @Override protected void dispatchDraw(Canvas canvas) { drawLaterRoundProgressCell = null; + invalidated = false; canvas.save(); if (fragmentTransition == null || (fromPullingDownTransition && !toPullingDownTransition)) { @@ -4707,14 +4699,86 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent canvas.translate(0, drawingChatLisViewYoffset = -pullingDownOffset - transitionOffset); drawChatBackgroundElements(canvas); super.dispatchDraw(canvas); + drawChatForegroundElements(canvas); canvas.restore(); } else { drawChatBackgroundElements(canvas); super.dispatchDraw(canvas); + drawChatForegroundElements(canvas); } canvas.restore(); } + private void drawChatForegroundElements(Canvas canvas) { + int size = drawTimeAfter.size(); + if (size > 0) { + for (int a = 0; a < size; a++) { + ChatMessageCell cell = drawTimeAfter.get(a); + canvas.save(); + canvas.translate(cell.getLeft() + cell.getNonAnimationTranslationX(false), cell.getY()); + cell.drawTime(canvas, cell.shouldDrawAlphaLayer() ? cell.getAlpha() : 1f, true); + canvas.restore(); + } + drawTimeAfter.clear(); + } + size = drawNamesAfter.size(); + if (size > 0) { + for (int a = 0; a < size; a++) { + ChatMessageCell cell = drawNamesAfter.get(a); + float canvasOffsetX = cell.getLeft() + cell.getNonAnimationTranslationX(false); + float canvasOffsetY = cell.getY(); + float alpha = cell.shouldDrawAlphaLayer() ? cell.getAlpha() : 1f; + + canvas.save(); + canvas.translate(canvasOffsetX, canvasOffsetY); + cell.setInvalidatesParent(true); + cell.drawNamesLayout(canvas, alpha); + cell.setInvalidatesParent(false); + canvas.restore(); + } + drawNamesAfter.clear(); + } + size = drawCaptionAfter.size(); + if (size > 0) { + for (int a = 0; a < size; a++) { + ChatMessageCell cell = drawCaptionAfter.get(a); + boolean selectionOnly = false; + if (cell.getCurrentPosition() != null) { + selectionOnly = (cell.getCurrentPosition().flags & MessageObject.POSITION_FLAG_LEFT) == 0; + } + float alpha = cell.shouldDrawAlphaLayer() ? cell.getAlpha() : 1f; + float canvasOffsetX = cell.getLeft() + cell.getNonAnimationTranslationX(false); + float canvasOffsetY = cell.getY(); + canvas.save(); + MessageObject.GroupedMessages groupedMessages = cell.getCurrentMessagesGroup(); + if (groupedMessages != null && groupedMessages.transitionParams.backgroundChangeBounds) { + float x = cell.getNonAnimationTranslationX(true); + float l = (groupedMessages.transitionParams.left + x + groupedMessages.transitionParams.offsetLeft); + float t = (groupedMessages.transitionParams.top + groupedMessages.transitionParams.offsetTop); + float r = (groupedMessages.transitionParams.right + x + groupedMessages.transitionParams.offsetRight); + float b = (groupedMessages.transitionParams.bottom + groupedMessages.transitionParams.offsetBottom); + + if (!groupedMessages.transitionParams.backgroundChangeBounds) { + t += cell.getTranslationY(); + b += cell.getTranslationY(); + } + canvas.clipRect( + l + AndroidUtilities.dp(8), t + AndroidUtilities.dp(8), + r - AndroidUtilities.dp(8), b - AndroidUtilities.dp(8) + ); + } + if (cell.getTransitionParams().wasDraw) { + canvas.translate(canvasOffsetX, canvasOffsetY); + cell.setInvalidatesParent(true); + cell.drawCaptionLayout(canvas, selectionOnly, alpha); + cell.setInvalidatesParent(false); + canvas.restore(); + } + } + drawCaptionAfter.clear(); + } + } + private void drawChatBackgroundElements(Canvas canvas) { int count = getChildCount(); MessageObject.GroupedMessages lastDrawnGroup = null; @@ -5072,173 +5136,48 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (child.getTranslationY() != 0) { canvas.restore(); } - int num = 0; - int count = getChildCount(); - for (int a = 0; a < count; a++) { - if (getChildAt(a) == child) { - num = a; - break; - } - } - if (num == count - 1) { - int size = drawTimeAfter.size(); - if (size > 0) { - for (int a = 0; a < size; a++) { - cell = drawTimeAfter.get(a); - canvas.save(); - canvas.translate(cell.getLeft() + cell.getNonAnimationTranslationX(false), cell.getY()); - cell.drawTime(canvas, cell.shouldDrawAlphaLayer() ? cell.getAlpha() : 1f, true); - canvas.restore(); - } - drawTimeAfter.clear(); - } - size = drawNamesAfter.size(); - if (size > 0) { - for (int a = 0; a < size; a++) { - cell = drawNamesAfter.get(a); - float canvasOffsetX = cell.getLeft() + cell.getNonAnimationTranslationX(false); - float canvasOffsetY = cell.getY(); - float alpha = cell.shouldDrawAlphaLayer() ? cell.getAlpha() : 1f; - - canvas.save(); - canvas.translate(canvasOffsetX, canvasOffsetY); - cell.setInvalidatesParent(true); - cell.drawNamesLayout(canvas, alpha); - cell.setInvalidatesParent(false); - canvas.restore(); - } - drawNamesAfter.clear(); - } - size = drawCaptionAfter.size(); - if (size > 0) { - for (int a = 0; a < size; a++) { - cell = drawCaptionAfter.get(a); - boolean selectionOnly = false; - if (cell.getCurrentPosition() != null) { - selectionOnly = (cell.getCurrentPosition().flags & MessageObject.POSITION_FLAG_LEFT) == 0; - } - float alpha = cell.shouldDrawAlphaLayer() ? cell.getAlpha() : 1f; - float canvasOffsetX = cell.getLeft() + cell.getNonAnimationTranslationX(false); - float canvasOffsetY = cell.getY(); - canvas.save(); - MessageObject.GroupedMessages groupedMessages = cell.getCurrentMessagesGroup(); - if (groupedMessages != null && groupedMessages.transitionParams.backgroundChangeBounds) { - float x = cell.getNonAnimationTranslationX(true); - float l = (groupedMessages.transitionParams.left + x + groupedMessages.transitionParams.offsetLeft); - float t = (groupedMessages.transitionParams.top + groupedMessages.transitionParams.offsetTop); - float r = (groupedMessages.transitionParams.right + x + groupedMessages.transitionParams.offsetRight); - float b = (groupedMessages.transitionParams.bottom + groupedMessages.transitionParams.offsetBottom); - - if (!groupedMessages.transitionParams.backgroundChangeBounds) { - t += cell.getTranslationY(); - b += cell.getTranslationY(); - } - canvas.clipRect( - l + AndroidUtilities.dp(8), t + AndroidUtilities.dp(8), - r - AndroidUtilities.dp(8), b - AndroidUtilities.dp(8) - ); - } - if (cell.getTransitionParams().wasDraw) { - canvas.translate(canvasOffsetX, canvasOffsetY); - cell.setInvalidatesParent(true); - cell.drawCaptionLayout(canvas, selectionOnly, alpha); - cell.setInvalidatesParent(false); - canvas.restore(); - } - } - drawCaptionAfter.clear(); - } - } if (child.getTranslationY() != 0) { canvas.save(); canvas.translate(0, child.getTranslationY()); } - if (child instanceof ChatMessageCell) { - ChatMessageCell chatMessageCell = (ChatMessageCell) child; - - MessageObject.GroupedMessagePosition position = chatMessageCell.getCurrentPosition(); - if (position != null || chatMessageCell.getTransitionParams().animateBackgroundBoundsInner) { - if (position == null || (position.last || position.minX == 0 && position.minY == 0)) { - if (num == count - 1) { - float alpha = chatMessageCell.shouldDrawAlphaLayer() ? chatMessageCell.getAlpha() : 1f; - float canvasOffsetX = chatMessageCell.getLeft() + chatMessageCell.getNonAnimationTranslationX(false); - float canvasOffsetY = chatMessageCell.getTop(); - canvas.save(); - canvas.translate(canvasOffsetX, canvasOffsetY); - cell.setInvalidatesParent(true); + if (cell != null) { + MessageObject message = cell.getMessageObject(); + MessageObject.GroupedMessagePosition position = cell.getCurrentPosition(); + if (!skipDraw) { + if (position != null || cell.getTransitionParams().animateBackgroundBoundsInner) { + if (position == null || (position.last || position.minX == 0 && position.minY == 0)) { if (position == null || position.last) { - chatMessageCell.drawTime(canvas, alpha, true); + drawTimeAfter.add(cell); } - if (position == null || (position.minX == 0 && position.minY == 0)) { - chatMessageCell.drawNamesLayout(canvas, alpha); - } - cell.setInvalidatesParent(false); - canvas.restore(); - } else { - if (position == null || position.last) { - drawTimeAfter.add(chatMessageCell); - } - if ((position == null || (position.minX == 0 && position.minY == 0)) && chatMessageCell.hasNameLayout()) { - drawNamesAfter.add(chatMessageCell); + if ((position == null || (position.minX == 0 && position.minY == 0)) && cell.hasNameLayout()) { + drawNamesAfter.add(cell); } } - } - if (position != null || chatMessageCell.getTransitionParams().transformGroupToSingleMessage || chatMessageCell.getTransitionParams().animateBackgroundBoundsInner) { - if (num == count - 1) { - float alpha = chatMessageCell.shouldDrawAlphaLayer() ? chatMessageCell.getAlpha() : 1f; - float canvasOffsetX = chatMessageCell.getLeft() + chatMessageCell.getNonAnimationTranslationX(false); - float canvasOffsetY = chatMessageCell.getTop(); - canvas.save(); - MessageObject.GroupedMessages groupedMessages = chatMessageCell.getCurrentMessagesGroup(); - if (groupedMessages != null && groupedMessages.transitionParams.backgroundChangeBounds) { - float x = chatMessageCell.getNonAnimationTranslationX(true); - float l = (groupedMessages.transitionParams.left + x + groupedMessages.transitionParams.offsetLeft); - float t = (groupedMessages.transitionParams.top + groupedMessages.transitionParams.offsetTop); - float r = (groupedMessages.transitionParams.right + x + groupedMessages.transitionParams.offsetRight); - float b = (groupedMessages.transitionParams.bottom + groupedMessages.transitionParams.offsetBottom); - - if (groupedMessages.transitionParams.backgroundChangeBounds) { - t -= chatMessageCell.getTranslationY(); - b -= chatMessageCell.getTranslationY(); - } - canvas.clipRect( - l + AndroidUtilities.dp(8), t + AndroidUtilities.dp(8), - r - AndroidUtilities.dp(8), b - AndroidUtilities.dp(8) - ); - } - canvas.translate(canvasOffsetX, canvasOffsetY); - if (chatMessageCell.getTransitionParams().wasDraw && (position == null || (position.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0)) { - boolean selectionOnly = position != null && (position.flags & MessageObject.POSITION_FLAG_LEFT) == 0; - chatMessageCell.setInvalidatesParent(true); - chatMessageCell.drawCaptionLayout(canvas, selectionOnly, alpha); - chatMessageCell.setInvalidatesParent(false); - } - canvas.restore(); - } else { + if (position != null || cell.getTransitionParams().transformGroupToSingleMessage || cell.getTransitionParams().animateBackgroundBoundsInner) { if (position == null || (position.flags & MessageObject.POSITION_FLAG_BOTTOM) != 0) { - drawCaptionAfter.add(chatMessageCell); + drawCaptionAfter.add(cell); } } } - } - MessageObject message = chatMessageCell.getMessageObject(); - if (videoPlayerContainer != null && (message.isRoundVideo() || message.isVideo()) && MediaController.getInstance().isPlayingMessage(message)) { - ImageReceiver imageReceiver = chatMessageCell.getPhotoImage(); - float newX = imageReceiver.getImageX() + chatMessageCell.getX(); - float newY = chatMessageCell.getY() + imageReceiver.getImageY() + chatListView.getY() - videoPlayerContainer.getTop(); - if (videoPlayerContainer.getTranslationX() != newX || videoPlayerContainer.getTranslationY() != newY) { - videoPlayerContainer.setTranslationX(newX); - videoPlayerContainer.setTranslationY(newY); - fragmentView.invalidate(); - videoPlayerContainer.invalidate(); + + if (videoPlayerContainer != null && (message.isRoundVideo() || message.isVideo()) && MediaController.getInstance().isPlayingMessage(message)) { + ImageReceiver imageReceiver = cell.getPhotoImage(); + float newX = imageReceiver.getImageX() + cell.getX(); + float newY = cell.getY() + imageReceiver.getImageY() + chatListView.getY() - videoPlayerContainer.getTop(); + if (videoPlayerContainer.getTranslationX() != newX || videoPlayerContainer.getTranslationY() != newY) { + videoPlayerContainer.setTranslationX(newX); + videoPlayerContainer.setTranslationY(newY); + fragmentView.invalidate(); + videoPlayerContainer.invalidate(); + } } } - ImageReceiver imageReceiver = chatMessageCell.getAvatarImage(); + ImageReceiver imageReceiver = cell.getAvatarImage(); if (imageReceiver != null) { MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message); - if (chatMessageCell.getMessageObject().deleted) { + if (cell.getMessageObject().deleted) { if (child.getTranslationY() != 0) { canvas.restore(); } @@ -5248,9 +5187,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent boolean replaceAnimation = chatListView.isFastScrollAnimationRunning() || (groupedMessages != null && groupedMessages.transitionParams.backgroundChangeBounds); int top = replaceAnimation ? child.getTop() : (int) child.getY(); - if (chatMessageCell.drawPinnedBottom()) { + if (cell.drawPinnedBottom()) { int p; - if (chatMessageCell.willRemovedAfterAnimation()) { + if (cell.willRemovedAfterAnimation()) { p = chatScrollHelper.positionToOldView.indexOfValue(child); if (p >= 0) { p = chatScrollHelper.positionToOldView.keyAt(p); @@ -5280,7 +5219,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } else { nextPosition = p - 1; } - if (chatMessageCell.willRemovedAfterAnimation()) { + if (cell.willRemovedAfterAnimation()) { View view = chatScrollHelper.positionToOldView.get(nextPosition); if (view != null) { if (child.getTranslationY() != 0) { @@ -5301,14 +5240,14 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } } - float tx = chatMessageCell.getSlidingOffsetX() + chatMessageCell.getCheckBoxTranslation(); + float tx = cell.getSlidingOffsetX() + cell.getCheckBoxTranslation(); - int y = (int) ((replaceAnimation ? child.getTop() : child.getY()) + chatMessageCell.getLayoutHeight() + chatMessageCell.getTransitionParams().deltaBottom); + int y = (int) ((replaceAnimation ? child.getTop() : child.getY()) + cell.getLayoutHeight() + cell.getTransitionParams().deltaBottom); int maxY = chatListView.getMeasuredHeight() - chatListView.getPaddingBottom(); - if (chatMessageCell.isPlayingRound() || chatMessageCell.getTransitionParams().animatePlayingRound) { - if (chatMessageCell.getTransitionParams().animatePlayingRound) { - float progressLocal = chatMessageCell.getTransitionParams().animateChangeProgress; - if (!chatMessageCell.isPlayingRound()) { + if (cell.isPlayingRound() || cell.getTransitionParams().animatePlayingRound) { + if (cell.getTransitionParams().animatePlayingRound) { + float progressLocal = cell.getTransitionParams().animateChangeProgress; + if (!cell.isPlayingRound()) { progressLocal = 1f - progressLocal; } int fromY = y; @@ -5324,9 +5263,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (!replaceAnimation && child.getTranslationY() != 0) { canvas.restore(); } - if (chatMessageCell.drawPinnedTop()) { + if (cell.drawPinnedTop()) { int p; - if (chatMessageCell.willRemovedAfterAnimation()) { + if (cell.willRemovedAfterAnimation()) { p = chatScrollHelper.positionToOldView.indexOfValue(child); if (p >= 0) { p = chatScrollHelper.positionToOldView.keyAt(p); @@ -5365,7 +5304,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } else { prevPosition = p + 1; } - if (chatMessageCell.willRemovedAfterAnimation()) { + if (cell.willRemovedAfterAnimation()) { View view = chatScrollHelper.positionToOldView.get(prevPosition); if (view != null) { top = view.getTop(); @@ -5406,8 +5345,8 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (y - AndroidUtilities.dp(48) < top) { y = top + AndroidUtilities.dp(48); } - if (!chatMessageCell.drawPinnedBottom()) { - int cellBottom = replaceAnimation ? chatMessageCell.getBottom() : (int) (chatMessageCell.getY() + chatMessageCell.getMeasuredHeight() + chatMessageCell.getTransitionParams().deltaBottom); + if (!cell.drawPinnedBottom()) { + int cellBottom = replaceAnimation ? cell.getBottom() : (int) (cell.getY() + cell.getMeasuredHeight() + cell.getTransitionParams().deltaBottom); if (y > cellBottom) { y = cellBottom; } @@ -5416,17 +5355,17 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (tx != 0) { canvas.translate(tx, 0); } - if (chatMessageCell.getCurrentMessagesGroup() != null) { - if (chatMessageCell.getCurrentMessagesGroup().transitionParams.backgroundChangeBounds) { - y -= chatMessageCell.getTranslationY(); + if (cell.getCurrentMessagesGroup() != null) { + if (cell.getCurrentMessagesGroup().transitionParams.backgroundChangeBounds) { + y -= cell.getTranslationY(); } } imageReceiver.setImageY(y - AndroidUtilities.dp(44)); if (cell.shouldDrawAlphaLayer()) { imageReceiver.setAlpha(cell.getAlpha()); canvas.scale( - chatMessageCell.getScaleX(), chatMessageCell.getScaleY(), - chatMessageCell.getX() + chatMessageCell.getPivotX(), chatMessageCell.getY() + (chatMessageCell.getHeight() >> 1) + cell.getScaleX(), cell.getScaleY(), + cell.getX() + cell.getPivotX(), cell.getY() + (cell.getHeight() >> 1) ); } else { imageReceiver.setAlpha(1f); @@ -5471,6 +5410,10 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent @Override public void invalidate() { + if (invalidated && slidingView == null) { + return; + } + invalidated = true; super.invalidate(); contentView.invalidateBlur(); } @@ -6594,7 +6537,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } }; - contentView.addView(mentionContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 110, Gravity.LEFT | Gravity.BOTTOM)); final ContentPreviewViewer.ContentPreviewViewerDelegate contentPreviewViewerDelegate = new ContentPreviewViewer.ContentPreviewViewerDelegate() { @@ -6666,11 +6608,11 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } TLRPC.TL_document document = (TLRPC.TL_document) object; Object parent = mentionContainer.getAdapter().getItemParent(position); + String query = MessageObject.findAnimatedEmojiEmoticon(document); if (chatMode == MODE_SCHEDULED) { - String query = stickersAdapter.getQuery(); AlertsCreator.createScheduleDatePickerDialog(getParentActivity(), dialog_id, (notify, scheduleDate) -> SendMessagesHelper.getInstance(currentAccount).sendSticker(document, query, dialog_id, replyingMessageObject, getThreadMessage(), parent, null, notify, scheduleDate), themeDelegate); } else { - getSendMessagesHelper().sendSticker(document, stickersAdapter.getQuery(), dialog_id, replyingMessageObject, getThreadMessage(), parent, sendAnimationData, true, 0); + getSendMessagesHelper().sendSticker(document, query, dialog_id, replyingMessageObject, getThreadMessage(), parent, sendAnimationData, true, 0); } hideFieldPanel(false); chatActivityEnterView.addStickerToRecent(document); @@ -6760,7 +6702,25 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } else if (object instanceof MediaDataController.KeywordResult) { String code = ((MediaDataController.KeywordResult) object).emoji; chatActivityEnterView.addEmojiToRecent(code); - chatActivityEnterView.replaceWithText(start, len, code, true); + if (code != null && code.startsWith("animated_")) { + try { + long documentId = Long.parseLong(code.substring(9)); + TLRPC.Document document = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); + SpannableString emoji = new SpannableString(MessageObject.findAnimatedEmojiEmoticon(document)); + AnimatedEmojiSpan span; + if (document != null) { + span = new AnimatedEmojiSpan(document, chatActivityEnterView.getEditField().getPaint().getFontMetricsInt()); + } else { + span = new AnimatedEmojiSpan(documentId, chatActivityEnterView.getEditField().getPaint().getFontMetricsInt()); + } + emoji.setSpan(span, 0, emoji.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + chatActivityEnterView.replaceWithText(start, len, emoji, false); + } catch (Exception ignore) { + chatActivityEnterView.replaceWithText(start, len, code, true); + } + } else { + chatActivityEnterView.replaceWithText(start, len, code, true); + } mentionContainer.updateVisibility(false); } }); @@ -7227,6 +7187,27 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } + @Override + public void onEditTextScroll() { + if (suggestEmojiPanel != null) { + suggestEmojiPanel.forceClose(); + } + } + + @Override + public void onContextMenuOpen() { + if (suggestEmojiPanel != null) { + suggestEmojiPanel.forceClose(); + } + } + + @Override + public void onContextMenuClose() { + if (suggestEmojiPanel != null) { + suggestEmojiPanel.fireUpdate(); + } + } + @Override public void onSwitchRecordMode(boolean video) { showVoiceHint(false, video); @@ -7253,6 +7234,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (editTextItem == null) { return; } + if (suggestEmojiPanel != null) { + suggestEmojiPanel.onTextSelectionChanged(start, end); + } if (end - start > 0) { if (editTextItem.getTag() == null) { editTextItem.setTag(1); @@ -7331,11 +7315,8 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent @Override public void onTextChanged(final CharSequence text, boolean bigChange) { MediaController.getInstance().setInputFieldHasText(!TextUtils.isEmpty(text) || chatActivityEnterView.isEditingMessage()); - if (stickersAdapter != null && chatActivityEnterView != null && chatActivityEnterView.getVisibility() == View.VISIBLE && (bottomOverlay == null || bottomOverlay.getVisibility() != View.VISIBLE)) { - stickersAdapter.searchEmojiByKeyword(text); - } if (mentionContainer != null && mentionContainer.getAdapter() != null) { - mentionContainer.getAdapter().searchUsernameOrHashtag(text.toString(), chatActivityEnterView.getCursorPosition(), messages, false, false); + mentionContainer.getAdapter().searchUsernameOrHashtag(text, chatActivityEnterView.getCursorPosition(), messages, false, false); } if (waitingForCharaterEnterRunnable != null) { AndroidUtilities.cancelRunOnUIThread(waitingForCharaterEnterRunnable); @@ -7423,7 +7404,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent chatActivityEnterView.setFieldFocused(); waitingForKeyboard = true; } - chatActivityEnterView.setAllowStickersAndGifs(true, true, waitingForKeyboard); + chatActivityEnterView.setAllowStickersAndGifs(true, true, true, waitingForKeyboard); if (editingMessageObjectReqId != 0) { getConnectionsManager().cancelRequest(editingMessageObjectReqId, true); editingMessageObjectReqId = 0; @@ -7438,13 +7419,13 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent public void onWindowSizeChanged(int size) { if (size < AndroidUtilities.dp(72) + ActionBar.getCurrentActionBarHeight()) { allowStickersPanel = false; - if (stickersPanel.getVisibility() == View.VISIBLE) { - stickersPanel.setVisibility(View.INVISIBLE); + if (suggestEmojiPanel.getVisibility() == View.VISIBLE) { + suggestEmojiPanel.setVisibility(View.INVISIBLE); } } else { allowStickersPanel = true; - if (stickersPanel.getVisibility() == View.INVISIBLE) { - stickersPanel.setVisibility(View.VISIBLE); + if (suggestEmojiPanel.getVisibility() == View.INVISIBLE) { + suggestEmojiPanel.setVisibility(View.VISIBLE); } } @@ -7521,6 +7502,17 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } else { AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); } + if (mentionContainer != null) { + mentionContainer.animate().alpha(chatActivityEnterView.isStickersExpanded() ? 0 : 1f).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + } + if (suggestEmojiPanel != null) { + suggestEmojiPanel.setVisibility(View.VISIBLE); + suggestEmojiPanel.animate().alpha(chatActivityEnterView.isStickersExpanded() ? 0 : 1f).setInterpolator(CubicBezierInterpolator.DEFAULT).withEndAction(() -> { + if (suggestEmojiPanel != null && chatActivityEnterView.isStickersExpanded()) { + suggestEmojiPanel.setVisibility(View.GONE); + } + }).start(); + } } @Override @@ -7603,14 +7595,15 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands, false); chatActivityEnterView.updateBotWebView(false); chatActivityEnterView.setMinimumHeight(AndroidUtilities.dp(51)); - chatActivityEnterView.setAllowStickersAndGifs(true, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46); + chatActivityEnterView.setAllowStickersAndGifs(true, true, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46); if (inPreviewMode) { chatActivityEnterView.setVisibility(View.INVISIBLE); } if (!ChatObject.isChannel(currentChat) || currentChat.megagroup) { - chatActivityEnterView.setBotInfo(botInfo); + chatActivityEnterView.setBotInfo(botInfo, false); } contentView.addView(chatActivityEnterView, contentView.getChildCount() - 1, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM)); + chatActivityEnterView.checkChannelRights(); chatActivityEnterTopView = new ChatActivityEnterTopView(context) { @Override @@ -7724,9 +7717,8 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent replyImageView.setRoundRadius(AndroidUtilities.dp(2)); replyLayout.addView(replyImageView, LayoutHelper.createFrame(34, 34, Gravity.TOP | Gravity.LEFT, 52, 6, 0, 0)); - stickersPanel = new FrameLayout(context); - stickersPanel.setVisibility(View.GONE); - contentView.addView(stickersPanel, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 81.5f, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 38)); + suggestEmojiPanel = new SuggestEmojiView(context, currentAccount, chatActivityEnterView, themeDelegate); + contentView.addView(suggestEmojiPanel, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 160, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 0)); final ChatActivityEnterTopView.EditView editView = new ChatActivityEnterTopView.EditView(context); editView.setMotionEventSplittingEnabled(false); @@ -7791,29 +7783,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent }); } - stickersListView = new RecyclerListView(context, themeDelegate) { - @Override - public boolean onInterceptTouchEvent(MotionEvent event) { - boolean result = ContentPreviewViewer.getInstance().onInterceptTouchEvent(event, stickersListView, 0, contentPreviewViewerDelegate, themeDelegate); - return super.onInterceptTouchEvent(event) || result; - } - }; - stickersListView.setTag(3); - stickersListView.setOnTouchListener((v, event) -> ContentPreviewViewer.getInstance().onTouch(event, stickersListView, 0, stickersOnItemClickListener, contentPreviewViewerDelegate, themeDelegate)); - stickersListView.setDisallowInterceptTouchEvents(true); - LinearLayoutManager layoutManager = new LinearLayoutManager(context); - layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); - stickersListView.setLayoutManager(layoutManager); - stickersListView.setClipToPadding(false); - stickersListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); - stickersPanel.addView(stickersListView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 78)); - initStickers(); - - stickersPanelArrow = new ImageView(context); - stickersPanelArrow.setImageResource(R.drawable.stickers_back_arrow); - stickersPanelArrow.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_stickersHintPanel), PorterDuff.Mode.MULTIPLY)); - stickersPanel.addView(stickersPanelArrow, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.LEFT, 53, 0, 53, 0)); - searchContainer = new BlurredFrameLayout(context, contentView) { @Override public void onDraw(Canvas canvas) { @@ -8471,17 +8440,17 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } scrimAnimatorSet.playTogether(animators); scrimAnimatorSet.setDuration(enable ? 150 : 220); - if (!enable) { - scrimAnimatorSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { + scrimAnimatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (!enable) { scrimView = null; scrimViewReaction = null; contentView.invalidate(); chatListView.invalidate(); } - }); - } + } + }); if (scrimView != null && scrimViewAlpha <= 0f) { scrimView = null; } @@ -8524,6 +8493,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (reactionsMentiondownButton != null) { reactionsMentiondownButton.setTranslationY(baseTranslationY + AndroidUtilities.dp(100) * (1f - reactionsMentionButtonEnterProgress) - ((AndroidUtilities.dp(50) + AndroidUtilities.dp(22) * pagedownButtonCounter.getEnterProgress()) * pagedownButtonEnterProgress + AndroidUtilities.dp(72) * mentionsButtonEnterProgress) * reactionsMentionButtonEnterProgress); } + if (suggestEmojiPanel != null) { + suggestEmojiPanel.setTranslationY(baseTranslationY); + } } private void updateReactionsMentionButton(boolean animated) { @@ -9565,7 +9537,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent params.put("query_id", "" + result.query_id); params.put("bot", "" + uid); params.put("bot_name", mentionContainer.getAdapter().getContextBotName()); - SendMessagesHelper.prepareSendingBotContextResult(getAccountInstance(), result, params, dialog_id, replyingMessageObject, getThreadMessage(), notify, scheduleDate); + SendMessagesHelper.prepareSendingBotContextResult(this, getAccountInstance(), result, params, dialog_id, replyingMessageObject, getThreadMessage(), notify, scheduleDate); chatActivityEnterView.setFieldText(""); hideFieldPanel(false); getMediaDataController().increaseInlineRaiting(uid); @@ -9986,84 +9958,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent presentFragment(fragment, false); } - private void initStickers() { - if (chatActivityEnterView == null || getParentActivity() == null || stickersAdapter != null) { - return; - } - stickersListView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); - stickersListView.setAdapter(stickersAdapter = new StickersAdapter(getParentActivity(), show -> { - if (show) { - int newPadding = stickersAdapter.isShowingKeywords() ? AndroidUtilities.dp(24) : 0; - if (newPadding != stickersListView.getPaddingTop() || stickersPanel.getTag() == null) { - stickersListView.setPadding(AndroidUtilities.dp(18), newPadding, AndroidUtilities.dp(18), 0); - stickersListView.scrollToPosition(0); - - boolean isRtl = chatActivityEnterView.isRtlText(); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) stickersPanelArrow.getLayoutParams(); - layoutParams.gravity = Gravity.BOTTOM | (isRtl ? Gravity.RIGHT : Gravity.LEFT); - stickersPanelArrow.requestLayout(); - } - } - if (show && stickersPanel.getTag() != null || !show && stickersPanel.getTag() == null) { - return; - } - if (show) { - stickersPanel.setVisibility(allowStickersPanel ? View.VISIBLE : View.INVISIBLE); - stickersPanel.setTag(1); - } else { - stickersPanel.setTag(null); - } - if (runningAnimation != null) { - runningAnimation.cancel(); - runningAnimation = null; - } - if (stickersPanel.getVisibility() != View.INVISIBLE) { - runningAnimation = new AnimatorSet(); - runningAnimation.playTogether( - ObjectAnimator.ofFloat(stickersPanel, View.ALPHA, show ? 0.0f : 1.0f, show ? 1.0f : 0.0f) - ); - runningAnimation.setDuration(150); - runningAnimationIndex = getNotificationCenter().setAnimationInProgress(runningAnimationIndex, null); - runningAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - getNotificationCenter().onAnimationFinish(runningAnimationIndex); - if (runningAnimation != null && runningAnimation.equals(animation)) { - if (!show) { - stickersAdapter.clearSearch(); - stickersPanel.setVisibility(View.GONE); - if (ContentPreviewViewer.getInstance().isVisible()) { - ContentPreviewViewer.getInstance().close(); - } - ContentPreviewViewer.getInstance().reset(); - } - runningAnimation = null; - } - } - - @Override - public void onAnimationCancel(Animator animation) { - if (runningAnimation != null && runningAnimation.equals(animation)) { - runningAnimation = null; - } - } - }); - runningAnimation.start(); - } else if (!show) { - stickersPanel.setVisibility(View.GONE); - } - }, themeDelegate)); - stickersListView.setOnItemClickListener(stickersOnItemClickListener = (view, position) -> { - Object item = stickersAdapter.getItem(position); - if (item instanceof String) { - String emoji = (String) item; - SpannableString string = new SpannableString(emoji); - Emoji.replaceEmoji(string, chatActivityEnterView.getEditField().getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); - chatActivityEnterView.setFieldText(string, false); - } - }); - } - public void shareMyContact(int type, MessageObject messageObject) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), themeDelegate); builder.setTitle(LocaleController.getString("ShareYouPhoneNumberTitle", R.string.ShareYouPhoneNumberTitle)); @@ -10228,7 +10122,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } private void showMediaBannedHint() { - if (getParentActivity() == null || currentChat == null || fragmentView == null || mediaBanTooltip != null && mediaBanTooltip.getVisibility() == View.VISIBLE) { + if (getParentActivity() == null || currentChat == null && userInfo == null || fragmentView == null || mediaBanTooltip != null && mediaBanTooltip.getVisibility() == View.VISIBLE) { return; } SizeNotifierFrameLayout frameLayout = (SizeNotifierFrameLayout) fragmentView; @@ -10237,13 +10131,21 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent return; } + try { + fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception e) { + FileLog.e(e); + } + if (mediaBanTooltip == null) { mediaBanTooltip = new HintView(getParentActivity(), 9, themeDelegate); mediaBanTooltip.setVisibility(View.GONE); frameLayout.addView(mediaBanTooltip, index + 1, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 10, 0, 10, 0)); } - if (ChatObject.isActionBannedByDefault(currentChat, ChatObject.ACTION_SEND_MEDIA)) { + if (userInfo != null && userInfo.voice_messages_forbidden) { + mediaBanTooltip.setText(AndroidUtilities.replaceTags(LocaleController.formatString(chatActivityEnterView.isInVideoMode() ? R.string.VideoMessagesRestrictedByPrivacy : R.string.VoiceMessagesRestrictedByPrivacy, currentUser.first_name))); + } else if (ChatObject.isActionBannedByDefault(currentChat, ChatObject.ACTION_SEND_MEDIA)) { mediaBanTooltip.setText(LocaleController.getString("GlobalAttachMediaRestricted", R.string.GlobalAttachMediaRestricted)); } else { if (currentChat.banned_rights == null) { @@ -10256,7 +10158,13 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } - mediaBanTooltip.showForView(chatActivityEnterView.getSendButton(), true); + View sendBtn = chatActivityEnterView.getSendButton(); + View audioVideoBtn = chatActivityEnterView.getAudioVideoButtonContainer(); + View viewForTooltip = sendBtn; + if (sendBtn.getAlpha() < audioVideoBtn.getAlpha()) { + viewForTooltip = audioVideoBtn; + } + mediaBanTooltip.showForView(viewForTooltip, true); } private void showNoSoundHint() { @@ -10501,12 +10409,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent showDialog(chatAttachAlert); } -// private void checkContextBotPanel() { -// if (allowStickersPanel && mentionContainer != null && mentionContainer.getAdapter() != null && mentionContainer.getAdapter().isBotContext()) { -// mentionContainer.updateVisibility(allowContextBotPanel && allowContextBotPanelSecond); -// } -// } - private void checkAutoDownloadMessages(boolean scrollUp) { if (chatListView == null) { return; @@ -10675,7 +10577,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent File image = AndroidUtilities.generatePicturePath(); if (image != null) { if (Build.VERSION.SDK_INT >= 24) { - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", image)); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", image)); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { @@ -10748,7 +10650,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent File video = AndroidUtilities.generateVideoPath(); if (video != null) { if (Build.VERSION.SDK_INT >= 24) { - takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", video)); + takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", video)); takeVideoIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takeVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else if (Build.VERSION.SDK_INT >= 18) { @@ -10825,7 +10727,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent for (int a = 0; a < photos.size(); a++) { SendMessagesHelper.SendingMediaInfo info = photos.get(a); if (info.inlineResult != null && info.videoEditedInfo == null) { - SendMessagesHelper.prepareSendingBotContextResult(getAccountInstance(), info.inlineResult, info.params, dialog_id, replyingMessageObject, getThreadMessage(), notify, scheduleDate); + SendMessagesHelper.prepareSendingBotContextResult(this, getAccountInstance(), info.inlineResult, info.params, dialog_id, replyingMessageObject, getThreadMessage(), notify, scheduleDate); photos.remove(a); a--; } @@ -11172,7 +11074,10 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent mess = mess.replace('\n', ' '); Spannable cs = new SpannableStringBuilder(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false)); MediaDataController.addTextStyleRuns(messageObjectToEdit, cs); - replyObjectTextView.setText(cs); + if (messageObjectToEdit.messageOwner != null) { + cs = MessageObject.replaceAnimatedEmoji(cs, messageObjectToEdit.messageOwner.entities, replyObjectTextView.getPaint().getFontMetricsInt()); + } + replyObjectTextView.setText(AnimatedEmojiSpan.cloneSpans(cs)); } } } else if (messageObjectToReply != null) { @@ -11227,12 +11132,15 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent replyObjectText = Emoji.replaceEmoji(messageObjectToReply.messageOwner.media.game.title, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); sourceText = messageObjectToReply.messageOwner.media.game.title; } else if (messageObjectToReply.messageText != null || messageObjectToReply.caption != null) { - String mess = messageObjectToReply.caption != null ? messageObjectToReply.caption.toString() : messageObjectToReply.messageText.toString(); + CharSequence mess = messageObjectToReply.caption != null ? messageObjectToReply.caption.toString() : messageObjectToReply.messageText.toString(); sourceText = mess; if (mess.length() > 150) { - mess = mess.substring(0, 150); + mess = mess.subSequence(0, 150); + } + mess = AndroidUtilities.replaceNewLines(mess); + if (messageObjectToReply.messageOwner != null && messageObjectToReply.messageOwner.entities != null) { + mess = MessageObject.replaceAnimatedEmoji(mess, messageObjectToReply.messageOwner.entities, replyObjectTextView.getPaint().getFontMetricsInt()); } - mess = mess.replace('\n', ' '); replyObjectText = Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); } if (replyObjectText != null) { @@ -11240,7 +11148,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent MediaDataController.addTextStyleRuns(messageObjectToReply.messageOwner.entities, sourceText, (Spannable) replyObjectText); } - replyObjectTextView.setText(replyObjectText); + replyObjectTextView.setText(AnimatedEmojiSpan.cloneSpans(replyObjectText)); } } else if (messageObjectsToForward != null) { if (messageObjectsToForward.isEmpty()) { @@ -11337,7 +11245,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } formwardingNameText = userNames; - if (type == -1 || type == 0 || type == 10 || type == 11) { + if (type == -1 || type == 0 || type == 10 || type == 11 || type == MessageObject.TYPE_EMOJIS) { replyNameTextView.setText(LocaleController.formatPluralString("PreviewForwardMessagesCount", messageObjectsToForward.size())); } else if (type == 1) { replyNameTextView.setText(LocaleController.formatPluralString("PreviewForwardPhoto", messageObjectsToForward.size())); @@ -11377,7 +11285,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (forwardingMessages.hideForwardSendersName) { replyObjectTextView.setText(LocaleController.getString("HiddenSendersNameDescription", R.string.HiddenSendersNameDescription)); } else { - if ((type == -1 || type == 0 || type == 10 || type == 11) && (messageObjectsToForward.size() == 1 && messageObjectsToForward.get(0).messageText != null)) { + if ((type == -1 || type == 0 || type == 10 || type == 11 || type == MessageObject.TYPE_EMOJIS) && (messageObjectsToForward.size() == 1 && messageObjectsToForward.get(0).messageText != null)) { MessageObject messageObject = messageObjectsToForward.get(0); CharSequence mess = new SpannableStringBuilder(messageObject.messageText.toString()); if (mess.length() > 150) { @@ -11386,6 +11294,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent mess = Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); if (mess instanceof Spannable) { MediaDataController.addTextStyleRuns(messageObject.messageOwner.entities, messageObject.messageText, (Spannable) mess); + if (messageObject.messageOwner != null) { + mess = MessageObject.replaceAnimatedEmoji(mess, messageObject.messageOwner.entities, replyObjectTextView.getPaint().getFontMetricsInt()); + } } replyObjectTextView.setText(mess); } else { @@ -11851,6 +11762,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent long currentTime = System.currentTimeMillis(); int maxAdapterPosition = -1; int minAdapterPosition = -1; + + boolean blurEnabled = SharedConfig.chatBlurEnabled() && Color.alpha(Theme.getColor(Theme.key_chat_BlurAlpha)) != 255; + for (int a = 0; a < count; a++) { View view = chatListView.getChildAt(a); MessageObject messageObject = null; @@ -11870,12 +11784,16 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent messageCell = (ChatMessageCell) view; } if (messageCell != null) { - messageCell.isBlurred = (view.getY() < clipTop && view.getY() + view.getMeasuredHeight() > clipTop) || (view.getY() + view.getMeasuredHeight() > chatListView.getMeasuredHeight() - blurredViewBottomOffset && view.getY() < chatListView.getMeasuredHeight() - blurredViewBottomOffset); + messageCell.isBlurred = (top < clipTop && bottom > clipTop) || (bottom > chatListView.getMeasuredHeight() - blurredViewBottomOffset && top < chatListView.getMeasuredHeight() - blurredViewBottomOffset); } if (bottom <= clipTop - chatListViewPaddingVisibleOffset || top > chatListView.getMeasuredHeight() - blurredViewBottomOffset) { if (messageCell != null) { - messageCell.setVisibleOnScreen(false); + if (!blurEnabled) { + messageCell.setVisibleOnScreen(false); + } else { + messageCell.setVisibleOnScreen(true); + } } continue; } @@ -11900,6 +11818,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent maxVisibleMessageObject = messageObject; } + messageCell.setParentBounds(chatListViewPaddingTop - chatListViewPaddingVisibleOffset - AndroidUtilities.dp(4), chatListView.getMeasuredHeight() - blurredViewBottomOffset); messageCell.setVisiblePart(viewTop, viewBottom - viewTop, recyclerChatViewHeight, keyboardOffset, view.getY() + (isKeyboardVisible() ? chatListView.getTop() : actionBar.getMeasuredHeight()) - contentView.getBackgroundTranslationY(), contentView.getMeasuredWidth(), contentView.getBackgroundSizeY(), blurredViewTopOffset, blurredViewBottomOffset); markSponsoredAsRead(messageObject); if (!threadMessageVisible && threadMessageObject != null && messageObject == threadMessageObject && messageCell.getBottom() > chatListViewPaddingTop) { @@ -11951,9 +11870,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent updateReactionsMentionButton(true); } getDownloadController().checkUnviewedDownloads(messageCell.getId(), dialog_id); - - if ((chatListItemAnimator == null || !chatListItemAnimator.isRunning()) && (!messageObject.isOutOwner() || messageObject.forcePlayEffect) && messageObject.messageOwner.media != null && !messageObject.messageOwner.media.nopremium && !messageObject.messageOwner.premiumEffectWasPlayed && messageObject.isPremiumSticker() && emojiAnimationsOverlay.isIdle() && emojiAnimationsOverlay.checkPosition(messageCell, chatListViewPaddingTop, chatListView.getMeasuredHeight() - blurredViewBottomOffset)) { - emojiAnimationsOverlay.onTapItem(messageCell, ChatActivity.this); + boolean allowPlayEffect = ((messageObject.messageOwner.media != null && !messageObject.messageOwner.media.nopremium) || (messageObject.isAnimatedEmojiStickerSingle() && dialog_id > 0)); + if ((chatListItemAnimator == null || !chatListItemAnimator.isRunning()) && (!messageObject.isOutOwner() || messageObject.forcePlayEffect) && allowPlayEffect && !messageObject.messageOwner.premiumEffectWasPlayed && (messageObject.isPremiumSticker() || messageObject.isAnimatedEmojiStickerSingle()) && emojiAnimationsOverlay.isIdle() && emojiAnimationsOverlay.checkPosition(messageCell, chatListViewPaddingTop, chatListView.getMeasuredHeight() - blurredViewBottomOffset)) { + emojiAnimationsOverlay.onTapItem(messageCell, ChatActivity.this, false); } } else if (view instanceof ChatActionCell) { ChatActionCell cell = (ChatActionCell) view; @@ -12692,14 +12611,14 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent mentionContainer.setTag(null); updateMessageListAccessibilityVisibility(); hideKeyboard = true; - if (stickersAdapter != null) { - stickersAdapter.hide(); + if (suggestEmojiPanel != null) { + suggestEmojiPanel.forceClose(); } } else { if (currentEncryptedChat == null || bigEmptyView == null) { bottomOverlay.setVisibility(View.INVISIBLE); - if (stickersAdapter != null && chatActivityEnterView != null && chatActivityEnterView.hasText()) { - stickersAdapter.searchEmojiByKeyword(chatActivityEnterView.getFieldText()); + if (suggestEmojiPanel != null && chatActivityEnterView != null && chatActivityEnterView.hasText()) { + suggestEmojiPanel.fireUpdate(); } return; } @@ -13548,6 +13467,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent fos.close(); path = file.getAbsolutePath(); } catch (Exception e) { + FileLog.e(e); continue; } } @@ -14183,6 +14103,12 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } else if (!chatWasReset && startLoadFromMessageId != 0 && (load_type == 3 || load_type == 4)) { last_message_id = (Integer) args[5]; + } else if (did == 777000 && load_type == 2) { + int unreadCount = (Integer) args[6]; + unreadCount--; + if (unreadCount > 0 && unreadCount < messArr.size() - 1) { + first_unread_id = messArr.get(unreadCount).messageOwner.id; + } } if (isThreadChat() && threadUnreadMessagesCount != 0) { unread_to_load = threadUnreadMessagesCount; @@ -14983,9 +14909,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (mentionContainer != null) { mentionContainer.getListView().invalidateViews(); } - if (stickersListView != null) { - stickersListView.invalidateViews(); - } if (messagesSearchListView != null) { messagesSearchListView.invalidateViews(); } @@ -15685,9 +15608,11 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent currentEncryptedChat = chat; updateTopPanel(true); updateSecretStatus(); - initStickers(); + if (suggestEmojiPanel != null) { + suggestEmojiPanel.fireUpdate(); + } if (chatActivityEnterView != null) { - chatActivityEnterView.setAllowStickersAndGifs(true, true); + chatActivityEnterView.setAllowStickersAndGifs(true, true, true); chatActivityEnterView.checkRoundVideo(); } if (mentionContainer != null && mentionContainer.getAdapter() != null) { @@ -16131,6 +16056,18 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } } + } else if (id == NotificationCenter.animatedEmojiDocumentLoaded) { + if (chatAdapter != null) { + MessageObject messageObject = (MessageObject) args[0]; + if (messageObject != null) { + ArrayList messages = chatAdapter.isFrozen ? chatAdapter.frozenMessages : ChatActivity.this.messages; + int index = messages.indexOf(messageObject); + if (index >= 0 && index < messages.size()) { + int position = index + chatAdapter.messagesStartRow; + chatAdapter.updateRowAtPosition(position); + } + } + } } else if (id == NotificationCenter.replaceMessagesObjects) { long did = (long) args[0]; if (did != dialog_id && did != mergeDialogId) { @@ -16620,6 +16557,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (currentUser != null && currentUser.id == uid) { userInfo = (TLRPC.UserFull) args[1]; checkThemeEmoticon(); + if (chatActivityEnterView != null) { + chatActivityEnterView.checkChannelRights(); + } if (headerItem != null) { showAudioCallAsIcon = userInfo.phone_calls_available && !inPreviewMode; if (userInfo.phone_calls_available) { @@ -17218,7 +17158,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent pendingSendMessagesDict.put(messageId, messageObject); pendingSendMessages.add(0, messageObject); } - if (messageObject.isDice() && !messageObject.isForwarded()) { + if (messageObject.isDice() && !messageObject.isForwarded() || messageObject.messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium) { messageObject.wasUnread = true; } if (chatMode == MODE_SCHEDULED && messageObject.hasValidGroupId() && messagesDict[0].indexOfKey(messageObject.getId()) >= 0) { @@ -17257,7 +17197,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } } - if (messageObject.wasJustSent && getUserConfig().isPremium()) { + if (messageObject.wasJustSent && (getUserConfig().isPremium() || messageObject.isAnimatedAnimatedEmoji())) { messageObject.forcePlayEffect = true; } } @@ -18155,9 +18095,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } if (messageObject.type >= 0) { - messageObject.stableId = old.stableId; - messageObject.messageOwner.premiumEffectWasPlayed = old.messageOwner.premiumEffectWasPlayed; - messageObject.forcePlayEffect = old.forcePlayEffect; + messageObject.copyStableParams(old); messages.set(index, messageObject); if (chatAdapter != null) { chatAdapter.updateRowAtPosition(chatAdapter.messagesStartRow + index); @@ -18823,24 +18761,31 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent searchExpandAnimator.cancel(); } - searchExpandAnimator = ValueAnimator.ofFloat(searchExpandProgress, 1f); - searchExpandAnimator.addUpdateListener(animation -> { - searchExpandProgress = (float) animation.getAnimatedValue(); - chatListView.setTranslationY(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); - chatActivityEnterView.setChatSearchExpandOffset(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); - invalidateChatListViewTopPadding(); - }); - searchExpandAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - chatActivityEnterView.setVisibility(View.INVISIBLE); - bottomOverlayChat.setVisibility(View.INVISIBLE); + if (searchExpandProgress != 1f) { + searchExpandAnimator = ValueAnimator.ofFloat(searchExpandProgress, 1f); + searchExpandAnimator.addUpdateListener(animation -> { + searchExpandProgress = (float) animation.getAnimatedValue(); + chatListView.setTranslationY(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); + chatActivityEnterView.setChatSearchExpandOffset(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); invalidateChatListViewTopPadding(); - } - }); - searchExpandAnimator.setDuration(250); - searchExpandAnimator.setInterpolator(ChatListItemAnimator.DEFAULT_INTERPOLATOR); - searchExpandAnimator.start(); + }); + searchExpandAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + searchExpandProgress = 1f; + chatActivityEnterView.setVisibility(View.INVISIBLE); + bottomOverlayChat.setVisibility(View.INVISIBLE); + invalidateChatListViewTopPadding(); + } + }); + searchExpandAnimator.setDuration(250); + searchExpandAnimator.setInterpolator(ChatListItemAnimator.DEFAULT_INTERPOLATOR); + searchExpandAnimator.start(); + } else { + chatActivityEnterView.setVisibility(View.INVISIBLE); + bottomOverlayChat.setVisibility(View.INVISIBLE); + invalidateChatListViewTopPadding(); + } chatActivityEnterView.setFieldFocused(false); @@ -18869,17 +18814,27 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent searchExpandAnimator.cancel(); } - searchExpandAnimator = ValueAnimator.ofFloat(searchExpandProgress, 0f); - invalidateChatListViewTopPadding(); - searchExpandAnimator.addUpdateListener(animation -> { - searchExpandProgress = (float) animation.getAnimatedValue(); - chatListView.setTranslationY(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); - chatActivityEnterView.setChatSearchExpandOffset(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); + if (searchExpandProgress != 0) { + searchExpandAnimator = ValueAnimator.ofFloat(searchExpandProgress, 0f); invalidateChatListViewTopPadding(); - }); - searchExpandAnimator.setDuration(250); - searchExpandAnimator.setInterpolator(ChatListItemAnimator.DEFAULT_INTERPOLATOR); - searchExpandAnimator.start(); + searchExpandAnimator.addUpdateListener(animation -> { + searchExpandProgress = (float) animation.getAnimatedValue(); + chatListView.setTranslationY(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); + chatActivityEnterView.setChatSearchExpandOffset(searchExpandProgress * (chatActivityEnterView.getMeasuredHeight() - searchContainer.getMeasuredHeight())); + invalidateChatListViewTopPadding(); + }); + searchExpandAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + searchExpandProgress = 0; + invalidateChatListViewTopPadding(); + } + }); + searchExpandAnimator.setDuration(250); + searchExpandAnimator.setInterpolator(ChatListItemAnimator.DEFAULT_INTERPOLATOR); + searchExpandAnimator.start(); + } + if (muteItem != null) { if (currentChat != null && ChatObject.isNotInChat(currentChat)) { muteItem.setVisibility(View.GONE); @@ -18905,8 +18860,8 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent chatActivityEnterView.setFieldFocused(false); chatActivityEnterView.setVisibility(View.INVISIBLE); chatActivityEnterView.closeKeyboard(); - if (stickersAdapter != null) { - stickersAdapter.hide(); + if (suggestEmojiPanel != null) { + suggestEmojiPanel.forceClose(); } } if (attachItem != null) { @@ -19501,20 +19456,28 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent mess = mess.substring(0, 150); } mess = mess.replace('\n', ' '); - pinnedText = Emoji.replaceEmoji(mess, messageTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + CharSequence message = mess; + if (pinnedMessageObject != null && pinnedMessageObject.messageOwner != null) { + message = MessageObject.replaceAnimatedEmoji(mess, pinnedMessageObject.messageOwner.entities, messageTextView.getPaint().getFontMetricsInt()); + } + pinnedText = Emoji.replaceEmoji(message, messageTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); } else if (pinnedMessageObject.messageText != null) { String mess = pinnedMessageObject.messageText.toString(); if (mess.length() > 150) { mess = mess.substring(0, 150); } mess = mess.replace('\n', ' '); - pinnedText = Emoji.replaceEmoji(mess, messageTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + CharSequence message = mess; + if (pinnedMessageObject != null && pinnedMessageObject.messageOwner != null) { + message = MessageObject.replaceAnimatedEmoji(mess, pinnedMessageObject.messageOwner.entities, messageTextView.getPaint().getFontMetricsInt()); + } + pinnedText = Emoji.replaceEmoji(message, messageTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); } if (pinnedText != null) { if (pinnedText instanceof Spannable) { MediaDataController.addTextStyleRuns(pinnedMessageObject, (Spannable) pinnedText, TextStyleSpan.FLAG_STYLE_SPOILER | TextStyleSpan.FLAG_STYLE_STRIKE); } - messageTextView.setText(pinnedText); + messageTextView.setText(AnimatedEmojiSpan.cloneSpans(pinnedText)); } if (animateToNext != 0) { pinnedNextAnimation[0] = new AnimatorSet(); @@ -20592,12 +20555,28 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent 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) { + Paint.FontMetricsInt fontMetrics = null; + try { + fontMetrics = chatActivityEnterView.getEditField().getPaint().getFontMetricsInt(); + } catch (Exception e) { + FileLog.e(e); + } + TLRPC.TL_messageEntityCustomEmoji e = (TLRPC.TL_messageEntityCustomEmoji) entity; + AnimatedEmojiSpan span; + if (e.document != null) { + span = new AnimatedEmojiSpan(e.document, fontMetrics); + } else { + span = new AnimatedEmojiSpan(e.document_id, fontMetrics); + } + stringBuilder.setSpan(span, entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } message = stringBuilder; } else { message = draftMessage.message; } + chatActivityEnterView.setFieldText(message); if (getArguments().getBoolean("hasUrl", false)) { chatActivityEnterView.setSelection(draftMessage.message.indexOf('\n') + 1); @@ -20921,6 +20900,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (message == null) { return false; } + if (!single && message.messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium) { + return false; + } final int type = getMessageType(message); if (single) { if (message.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) { @@ -20930,7 +20912,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent Toast.makeText(getParentActivity(), LocaleController.getString("MessageNotFound", R.string.MessageNotFound), Toast.LENGTH_SHORT).show(); } return true; - } if (message.messageOwner.action instanceof TLRPC.TL_messageActionPaymentSent && message.replyMessageObject != null && message.replyMessageObject.isInvoice()) { + } else if (message.messageOwner.action instanceof TLRPC.TL_messageActionPaymentSent && message.replyMessageObject != null && message.replyMessageObject.isInvoice()) { TLRPC.TL_payments_getPaymentReceipt req = new TLRPC.TL_payments_getPaymentReceipt(); req.msg_id = message.getId(); req.peer = getMessagesController().getInputPeer(message.messageOwner.peer_id); @@ -21102,7 +21084,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent icons.add(R.drawable.msg_block2); } if (type == -1) { - if ((selectedObject.type == 0 || selectedObject.isAnimatedEmoji() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { + if ((selectedObject.type == 0 || selectedObject.isAnimatedEmoji() || selectedObject.isAnimatedEmojiStickers() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { items.add(LocaleController.getString("Copy", R.string.Copy)); options.add(OPTION_COPY); icons.add(R.drawable.msg_copy); @@ -21200,7 +21182,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent options.add(OPTION_REPLY); icons.add(R.drawable.msg_reply); } - if ((selectedObject.type == 0 || selectedObject.isDice() || selectedObject.isAnimatedEmoji() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { + if ((selectedObject.type == 0 || selectedObject.isDice() || selectedObject.isAnimatedEmoji() || selectedObject.isAnimatedEmojiStickers() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { items.add(LocaleController.getString("Copy", R.string.Copy)); options.add(OPTION_COPY); icons.add(R.drawable.msg_copy); @@ -21383,7 +21365,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent icons.add(R.drawable.msg_unfave); } } - if (!selectedObject.isSponsored() && chatMode != MODE_SCHEDULED && !selectedObject.needDrawBluredPreview() && !selectedObject.isLiveLocation() && selectedObject.type != 16 && !noforwards) { + if (!selectedObject.isSponsored() && chatMode != MODE_SCHEDULED && !selectedObject.needDrawBluredPreview() && !selectedObject.isLiveLocation() && selectedObject.type != 16 && !noforwards && selectedObject.type != MessageObject.TYPE_GIFT_PREMIUM) { items.add(LocaleController.getString("Forward", R.string.Forward)); options.add(OPTION_FORWARD); icons.add(R.drawable.msg_forward); @@ -21434,7 +21416,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent options.add(OPTION_REPLY); icons.add(R.drawable.msg_reply); } - if ((selectedObject.type == 0 || selectedObject.isAnimatedEmoji() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { + if ((selectedObject.type == 0 || selectedObject.isAnimatedEmoji() || selectedObject.isAnimatedEmojiStickers() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { items.add(LocaleController.getString("Copy", R.string.Copy)); options.add(OPTION_COPY); icons.add(R.drawable.msg_copy); @@ -22212,6 +22194,60 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent scrimPopupContainerLayout.addView(fl, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT, isReactionsAvailable ? 16 : 0, -8, isReactionsAvailable ? 36 : 0, 0)); scrimPopupContainerLayout.applyViewBottom(fl); } + + if (message.contentType == 0) { + AnimatedEmojiSpan[] animatedEmojiSpans1 = message.messageText instanceof Spanned ? ((Spanned) message.messageText).getSpans(0, message.messageText.length(), AnimatedEmojiSpan.class) : null; + CharSequence caption = getMessageCaption(selectedObject, selectedObjectGroup); + AnimatedEmojiSpan[] animatedEmojiSpans2 = caption instanceof Spanned ? ((Spanned) caption).getSpans(0, caption.length(), AnimatedEmojiSpan.class) : null; + int animatedEmojiCount = (animatedEmojiSpans1 == null ? 0 : animatedEmojiSpans1.length) + (animatedEmojiSpans2 == null ? 0 : animatedEmojiSpans2.length); + if (animatedEmojiCount > 0) { + ArrayList stickerSets = new ArrayList<>(); + int firstCount = (animatedEmojiSpans1 == null ? 0 : animatedEmojiSpans1.length); + for (int i = 0; i < animatedEmojiCount; ++i) { + AnimatedEmojiSpan span = i < firstCount ? animatedEmojiSpans1[i] : animatedEmojiSpans2[i - firstCount]; + if (span == null || span.standard) { + continue; + } + TLRPC.Document document = span.document == null ? AnimatedEmojiDrawable.findDocument(currentAccount, span.documentId) : span.document; + TLRPC.InputStickerSet stickerSet = MessageObject.getInputStickerSet(document); + if (stickerSet == null) { + continue; + } + boolean found = false; + for (int j = 0; j < stickerSets.size(); ++j) { + if (stickerSets.get(j).id == stickerSet.id) { + found = true; + break; + } + } + if (!found) { + stickerSets.add(stickerSet); + } + } + + if (stickerSets.size() > 0) { + View gap = new FrameLayout(contentView.getContext()); + gap.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuSeparator)); + popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + + View button = new MessageContainsEmojiButton(currentAccount, contentView.getContext(), themeDelegate, stickerSets); + button.setOnClickListener(e -> { + EmojiPacksAlert alert = new EmojiPacksAlert(ChatActivity.this, getParentActivity(), themeDelegate, stickerSets) { + @Override + public void dismiss() { + super.dismiss(); + dimBehindView(false); + } + }; + alert.setCalcMandatoryInsets(isKeyboardVisible()); + alert.setDimBehind(false); + closeMenu(false); + showDialog(alert); + }); + popupLayout.addView(button, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + } + } + } } scrimPopupWindow = new ActionBarPopupWindow(scrimPopupContainerLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) { @@ -22337,8 +22373,8 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (mentionContainer != null && mentionContainer.getVisibility() == View.VISIBLE) { views.add(mentionContainer); } - if (stickersPanel != null && stickersPanel.getVisibility() == View.VISIBLE) { - views.add(stickersPanel); + if (suggestEmojiPanel != null && suggestEmojiPanel.getVisibility() == View.VISIBLE) { + views.add(suggestEmojiPanel); } actionBar.showActionMode(true, bottomMessagesActionContainer, null, views.toArray(new View[0]), new boolean[]{false, true, true}, chatListView, translationY); if (getParentActivity() instanceof LaunchActivity) { @@ -22531,7 +22567,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent updateBottomOverlay(); checkEditTimer(); - chatActivityEnterView.setAllowStickersAndGifs(false, false, true); + chatActivityEnterView.setAllowStickersAndGifs(true, false, false, true); updatePinnedMessageView(true); updateVisibleRows(); @@ -22604,33 +22640,31 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } } - private String getMessageContent(MessageObject messageObject, long previousUid, boolean name) { - String str = ""; + private CharSequence getMessageContent(MessageObject messageObject, long previousUid, boolean name) { + SpannableStringBuilder str = new SpannableStringBuilder(); if (name) { long fromId = messageObject.getFromChatId(); if (previousUid != fromId) { if (fromId > 0) { TLRPC.User user = getMessagesController().getUser(fromId); if (user != null) { - str = ContactsController.formatName(user.first_name, user.last_name) + ":\n"; + str.append(ContactsController.formatName(user.first_name, user.last_name)).append(":\n"); } } else if (fromId < 0) { TLRPC.Chat chat = getMessagesController().getChat(-fromId); if (chat != null) { - str = chat.title + ":\n"; + str.append(chat.title).append(":\n"); } } } } String restrictionReason = MessagesController.getRestrictionReason(messageObject.messageOwner.restriction_reason); if (!TextUtils.isEmpty(restrictionReason)) { - str += restrictionReason; - } else if ((messageObject.type == 0 || messageObject.isAnimatedEmoji()) && messageObject.messageOwner.message != null) { - str += messageObject.messageOwner.message; - } else if (messageObject.messageOwner.media != null && messageObject.messageOwner.message != null) { - str += messageObject.messageOwner.message; + str.append(restrictionReason); + } else if (messageObject.caption != null){ + str.append(messageObject.caption); } else { - str += messageObject.messageText; + str.append(messageObject.messageText); } return str; } @@ -22866,7 +22900,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent File f = new File(path); if (Build.VERSION.SDK_INT >= 24) { try { - intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", f)); + intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", f)); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (Exception ignore) { intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); @@ -23780,7 +23814,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent public void sendAudio(ArrayList audios, CharSequence caption, boolean notify, int scheduleDate) { fillEditingMediaWithCaption(caption, null); - SendMessagesHelper.prepareSendingAudioDocuments(getAccountInstance(), audios, caption != null ? caption.toString() : null, dialog_id, replyingMessageObject, getThreadMessage(), editingMessageObject, notify, scheduleDate); + SendMessagesHelper.prepareSendingAudioDocuments(getAccountInstance(), audios, caption != null ? caption : null, dialog_id, replyingMessageObject, getThreadMessage(), editingMessageObject, notify, scheduleDate); afterMessageSend(); } @@ -24249,7 +24283,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent String formattedUrl = str; try { formattedUrl = URLDecoder.decode(str.replaceAll("\\+", "%2b"), "UTF-8"); - } catch (Exception ignore) {} + } catch (Exception e) { + FileLog.e(e); + } builder.setTitle(formattedUrl); builder.setTitleMultipleLines(true); } @@ -24529,7 +24565,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent String formattedUrl = urlFinal; try { formattedUrl = URLDecoder.decode(urlFinal.replaceAll("\\+", "%2b"), "UTF-8"); - } catch (Exception ignore) {} + } catch (Exception e) { + FileLog.e(e); + } builder.setTitle(formattedUrl); builder.setTitleMultipleLines(true); builder.setItems(noforwards ? new CharSequence[] {LocaleController.getString("Open", R.string.Open)} : new CharSequence[]{LocaleController.getString("Open", R.string.Open), LocaleController.getString("Copy", R.string.Copy)}, (dialog, which) -> { @@ -25425,15 +25463,21 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent } if (message.isDice()) { undoView.showWithAction(0, chatActivityEnterView.getVisibility() == View.VISIBLE && bottomOverlay.getVisibility() != View.VISIBLE ? UndoView.ACTION_DICE_INFO : UndoView.ACTION_DICE_NO_SEND_INFO, message.getDiceEmoji(), null, () -> getSendMessagesHelper().sendMessage(message.getDiceEmoji(), dialog_id, replyingMessageObject, getThreadMessage(), null, false, null, null, null, true, 0, null)); - } else if (message.isAnimatedEmoji() || message.isPremiumSticker()) { + } else if (message.isAnimatedEmoji() && (!message.isAnimatedAnimatedEmoji() || emojiAnimationsOverlay.supports(MessageObject.findAnimatedEmojiEmoticon(message.getDocument())) && currentUser != null) || message.isPremiumSticker()) { restartSticker(cell); - emojiAnimationsOverlay.onTapItem(cell, ChatActivity.this); + emojiAnimationsOverlay.onTapItem(cell, ChatActivity.this, true); chatListView.cancelClickRunnables(false); } else if (message.needDrawBluredPreview()) { Runnable action = sendSecretMessageRead(message, false); cell.invalidate(); SecretMediaViewer.getInstance().setParentActivity(getParentActivity()); SecretMediaViewer.getInstance().openMedia(message, photoViewerProvider, action); + } else if (MessageObject.isAnimatedEmoji(message.getDocument()) && MessageObject.getInputStickerSet(message.getDocument()) != null) { + ArrayList inputSets = new ArrayList<>(1); + inputSets.add(MessageObject.getInputStickerSet(message.getDocument())); + EmojiPacksAlert alert = new EmojiPacksAlert(ChatActivity.this, getParentActivity(), themeDelegate, inputSets); + alert.setCalcMandatoryInsets(isKeyboardVisible()); + showDialog(alert); } else if (message.getInputStickerSet() != null) { StickersAlert alert = new StickersAlert(getParentActivity(), ChatActivity.this, message.getInputStickerSet(), null, bottomOverlayChat.getVisibility() != View.VISIBLE && (currentChat == null || ChatObject.canSendStickers(currentChat)) ? chatActivityEnterView : null, themeDelegate); alert.setCalcMandatoryInsets(isKeyboardVisible()); @@ -25453,7 +25497,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= 24) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setDataAndType(FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", f), "video/mp4"); + intent.setDataAndType(FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", f), "video/mp4"); } else { intent.setDataAndType(Uri.fromFile(f), "video/mp4"); } @@ -25463,7 +25507,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent alertUserOpenError(message); } } else if (message.type == 4) { - if (!AndroidUtilities.isGoogleMapsInstalled(ChatActivity.this)) { + if (!AndroidUtilities.isMapsInstalled(ChatActivity.this)) { return; } if (message.isLiveLocation()) { @@ -25675,6 +25719,18 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent }; ((ChatActionCell) view).setInvalidateColors(true); ((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() { + @Override + public void didOpenPremiumGift(ChatActionCell cell, TLRPC.TL_premiumGiftOption giftOption, boolean animateConfetti) { + showDialog(new PremiumPreviewBottomSheet(ChatActivity.this, currentAccount, getCurrentUser(), new GiftPremiumBottomSheet.GiftTier(giftOption)) + .setAnimateConfetti(animateConfetti) + .setOutboundGift(cell.getMessageObject().isOut())); + } + + @Override + public void needShowEffectOverlay(ChatActionCell cell, TLRPC.Document document, TLRPC.VideoSize videoSize) { + emojiAnimationsOverlay.showAnimationForActionCell(cell, document, videoSize); + } + @Override public void didClickImage(ChatActionCell cell) { MessageObject message = cell.getMessageObject(); @@ -26006,7 +26062,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent return true; } }); - } else if (message.isAnyKindOfSticker()) { + } else if (message.isAnyKindOfSticker() && !message.isAnimatedEmojiStickers()) { applyAnimation = true; messageCell.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override @@ -26785,6 +26841,9 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent if (parentLayout != null && parentLayout.getDrawerLayoutContainer() != null) { parentLayout.getDrawerLayoutContainer().setBehindKeyboardColor(getThemedColor(Theme.key_windowBackgroundWhite)); } + if (suggestEmojiPanel != null) { + suggestEmojiPanel.updateColors(); + } }; ArrayList themeDescriptions = new ArrayList<>(); @@ -27237,9 +27296,6 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent themeDescriptions.add(new ThemeDescription(progressBar, ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_chat_serviceText)); - themeDescriptions.add(new ThemeDescription(stickersPanelArrow, ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_chat_stickersHintPanel)); - themeDescriptions.add(new ThemeDescription(stickersListView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{StickerCell.class}, null, null, null, Theme.key_chat_stickersHintPanel)); - themeDescriptions.add(new ThemeDescription(chatListView, ThemeDescription.FLAG_USEBACKGROUNDDRAWABLE, new Class[]{ChatUnreadCell.class}, new String[]{"backgroundLayout"}, null, null, null, Theme.key_chat_unreadMessagesStartBackground)); themeDescriptions.add(new ThemeDescription(chatListView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{ChatUnreadCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_chat_unreadMessagesStartArrowIcon)); themeDescriptions.add(new ThemeDescription(chatListView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{ChatUnreadCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_unreadMessagesStartText)); @@ -27829,7 +27885,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent animationSettings.onlyTopFragment = true; animationSettings.resourcesProvider = this; animationSettings.duration = 250; - parentLayout.animateThemedValues(animationSettings); + parentLayout.animateThemedValues(animationSettings, null); if (onThemeChange != null) { onThemeChange.run(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java index 5f2e3b177..090c98f06 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java @@ -544,7 +544,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image frameLayout.addView(avatarImage, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 16, 12, LocaleController.isRTL ? 16 : 0, 12)); } - nameTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT); + nameTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT, false); if (isChannel) { nameTextView.setHint(LocaleController.getString("EnterChannelName", R.string.EnterChannelName)); } else { @@ -674,7 +674,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image locationCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); typeEditContainer.addView(locationCell, LayoutHelper.createLinear(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); locationCell.setOnClickListener(v -> { - if (!AndroidUtilities.isGoogleMapsInstalled(ChatEditActivity.this)) { + if (!AndroidUtilities.isMapsInstalled(ChatEditActivity.this)) { return; } LocationActivity fragment = new LocationActivity(LocationActivity.LOCATION_TYPE_GROUP); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java index 094a57c36..859d77823 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java @@ -431,6 +431,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe linearLayout.addView(manageLinksInfoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); joinContainer = new JoinToSendSettingsView(context, currentChat); + joinContainer.showJoinToSend(info != null && info.linked_chat_id != 0); linearLayout.addView(joinContainer); saveContainer = new LinearLayout(context); @@ -701,6 +702,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe usernameTextView.clearFocus(); if (joinContainer != null) { joinContainer.setVisibility(!isChannel && !isPrivate ? View.VISIBLE : View.GONE); + joinContainer.showJoinToSend(info != null && info.linked_chat_id != 0); } checkDoneButton(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatReactionsEditActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatReactionsEditActivity.java index 4f62abb80..ee73cc0de 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatReactionsEditActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatReactionsEditActivity.java @@ -118,7 +118,7 @@ public class ChatReactionsEditActivity extends BaseFragment implements Notificat switch (viewType) { default: case TYPE_REACTION: { - return new RecyclerListView.Holder(new AvailableReactionCell(context, false)); + return new RecyclerListView.Holder(new AvailableReactionCell(context, false, false)); } case TYPE_INFO: { TextInfoPrivacyCell infoCell = new TextInfoPrivacyCell(context); @@ -147,7 +147,7 @@ public class ChatReactionsEditActivity extends BaseFragment implements Notificat case TYPE_REACTION: AvailableReactionCell reactionCell = (AvailableReactionCell) holder.itemView; TLRPC.TL_availableReaction react = availableReactions.get(position - 2); - reactionCell.bind(react, chatReactions.contains(react.reaction)); + reactionCell.bind(react, chatReactions.contains(react.reaction), currentAccount); break; } } 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 44c9a7893..72ca10f92 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java @@ -3785,7 +3785,7 @@ public class AlertsCreator { return; } AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity(), resourcesProvider); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setTitle(LocaleController.getString("UnableForward", R.string.UnableForward)); if (result == 1) { builder.setMessage(LocaleController.getString("ErrorSendRestrictedStickers", R.string.ErrorSendRestrictedStickers)); } else if (result == 2) { @@ -3798,6 +3798,10 @@ public class AlertsCreator { builder.setMessage(LocaleController.getString("ErrorSendRestrictedMediaAll", R.string.ErrorSendRestrictedMediaAll)); } else if (result == 6) { builder.setMessage(LocaleController.getString("ErrorSendRestrictedPollsAll", R.string.ErrorSendRestrictedPollsAll)); + } else if (result == 7) { + builder.setMessage(LocaleController.getString("ErrorSendRestrictedPrivacyVoiceMessages", R.string.ErrorSendRestrictedPrivacyVoiceMessages)); + } else if (result == 8) { + builder.setMessage(LocaleController.getString("ErrorSendRestrictedPrivacyVideoMessages", R.string.ErrorSendRestrictedPrivacyVideoMessages)); } builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java new file mode 100644 index 000000000..515697a6a --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java @@ -0,0 +1,654 @@ +package org.telegram.ui.Components; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Looper; +import android.text.TextUtils; +import android.view.View; +import android.view.animation.LinearInterpolator; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.SQLite.SQLiteDatabase; +import org.telegram.SQLite.SQLiteException; +import org.telegram.SQLite.SQLitePreparedStatement; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.DocumentObject; +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLoader; +import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.MessagesStorage; +import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.SvgHelper; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.NativeByteBuffer; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Locale; +import java.util.Objects; + +public class AnimatedEmojiDrawable extends Drawable { + + public static final int CACHE_TYPE_MESSAGES = 0; + public static final int CACHE_TYPE_MESSAGES_LARGE = 1; + public static final int CACHE_TYPE_KEYBOARD = 2; + public static final int CACHE_TYPE_ALERT_PREVIEW = 3; + public static final int CACHE_TYPE_TAB_STRIP = 4; + + public static final int STANDARD_LOTTIE_FRAME = 5; + + private Paint debugCacheType; + private static final boolean DEBUG_CACHE_TYPE = false; + + private static HashMap> globalEmojiCache; + @NonNull + public static AnimatedEmojiDrawable make(int account, int cacheType, long documentId) { + if (globalEmojiCache == null) { + globalEmojiCache = new HashMap<>(); + } + final int key = Objects.hash(account, cacheType); + HashMap cache = globalEmojiCache.get(key); + if (cache == null) { + globalEmojiCache.put(key, cache = new HashMap<>()); + } + AnimatedEmojiDrawable drawable = cache.get(documentId); + if (drawable == null) { + cache.put(documentId, drawable = new AnimatedEmojiDrawable(cacheType, account, documentId)); + } + return drawable; + } + + @NonNull + public static AnimatedEmojiDrawable make(int account, int cacheType, @NonNull TLRPC.Document document) { + if (globalEmojiCache == null) { + globalEmojiCache = new HashMap<>(); + } + final int key = Objects.hash(account, cacheType); + HashMap cache = globalEmojiCache.get(key); + if (cache == null) { + globalEmojiCache.put(key, cache = new HashMap<>()); + } + AnimatedEmojiDrawable drawable = cache.get(document.id); + if (drawable == null) { + cache.put(document.id, drawable = new AnimatedEmojiDrawable(cacheType, account, document)); + } + return drawable; + } + + public static int getCacheTypeForEnterView() { + return SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW ? CACHE_TYPE_MESSAGES : CACHE_TYPE_KEYBOARD; + } + + public void setTime(long time) { + if (imageReceiver != null) { + if (cacheType == STANDARD_LOTTIE_FRAME) { + time = 0; + } + imageReceiver.setCurrentTime(time); + } + } + + public void update(long time) { + if (imageReceiver != null) { + if (cacheType == STANDARD_LOTTIE_FRAME) { + time = 0; + } + if (imageReceiver.getLottieAnimation() != null) { + imageReceiver.getLottieAnimation().updateCurrentFrame(time, true); + } + if (imageReceiver.getAnimation() != null) { + imageReceiver.getAnimation().updateCurrentFrame(time, true); + } + } + } + + public interface ReceivedDocument { + void run(TLRPC.Document document); + } + + private static HashMap fetchers; + public static EmojiDocumentFetcher getDocumentFetcher(int account) { + if (fetchers == null) { + fetchers = new HashMap<>(); + } + EmojiDocumentFetcher fetcher = fetchers.get(account); + if (fetcher == null) { + fetchers.put(account, fetcher = new EmojiDocumentFetcher(account)); + } + return fetcher; + } + public static class EmojiDocumentFetcher { + private HashMap emojiDocumentsCache; + private HashMap> loadingDocuments; + private HashSet toFetchDocuments; + private Runnable fetchRunnable; + private final int currentAccount; + + public EmojiDocumentFetcher(int account) { + currentAccount = account; + } + + public void fetchDocument(long id, ReceivedDocument onDone) { + checkThread(); + if (emojiDocumentsCache != null) { + TLRPC.Document cacheDocument = emojiDocumentsCache.get(id); + if (cacheDocument != null) { + onDone.run(cacheDocument); + return; + } + } + if (onDone != null) { + if (loadingDocuments == null) { + loadingDocuments = new HashMap<>(); + } + ArrayList callbacks = loadingDocuments.get(id); + if (callbacks != null) { + callbacks.add(onDone); + return; + } + callbacks = new ArrayList<>(1); + callbacks.add(onDone); + loadingDocuments.put(id, callbacks); + } + if (toFetchDocuments == null) { + toFetchDocuments = new HashSet<>(); + } + toFetchDocuments.add(id); + if (fetchRunnable != null) { + return; + } + AndroidUtilities.runOnUIThread(fetchRunnable = () -> { + ArrayList emojiToLoad = new ArrayList<>(toFetchDocuments); + toFetchDocuments.clear(); + loadFromDatabase(emojiToLoad); + fetchRunnable = null; + }); + } + + private void checkThread() { + if (BuildVars.DEBUG_VERSION && Thread.currentThread() != Looper.getMainLooper().getThread()) { + throw new IllegalStateException("Wrong thread"); + } + } + + private void loadFromDatabase(ArrayList emojiToLoad) { + MessagesStorage.getInstance(currentAccount).getStorageQueue().postRunnable(() -> { + SQLiteDatabase database = MessagesStorage.getInstance(currentAccount).getDatabase(); + try { + String idsStr = TextUtils.join(",", emojiToLoad); + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM animated_emoji WHERE document_id IN (%s)", idsStr)); + ArrayList documents = new ArrayList<>(); + HashSet loadFromServerIds = new HashSet<>(emojiToLoad); + while (cursor.next()) { + NativeByteBuffer byteBuffer = cursor.byteBufferValue(0); + try { + TLRPC.Document document = TLRPC.Document.TLdeserialize(byteBuffer, byteBuffer.readInt32(true), true); + if (document != null && document.id != 0) { + documents.add(document); + loadFromServerIds.remove(document.id); + } + } catch (Exception e) { + FileLog.e(e); + } + if (byteBuffer != null) { + byteBuffer.reuse(); + } + } + + AndroidUtilities.runOnUIThread(() -> { + processDocuments(documents); + if (!loadFromServerIds.isEmpty()) { + loadFromServer(new ArrayList<>(loadFromServerIds)); + } + }); + cursor.dispose(); + } catch (SQLiteException e) { + FileLog.e(e); + } + }); + } + + private void loadFromServer(ArrayList loadFromServerIds) { + final TLRPC.TL_messages_getCustomEmojiDocuments req = new TLRPC.TL_messages_getCustomEmojiDocuments(); + req.document_id = loadFromServerIds; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + HashSet loadedFromServer = new HashSet<>(loadFromServerIds); + if (res instanceof TLRPC.Vector) { + ArrayList objects = ((TLRPC.Vector) res).objects; + putToStorage(objects); + processDocuments(objects); + for (int i = 0; i < objects.size(); i++) { + if (objects.get(i) instanceof TLRPC.Document) { + TLRPC.Document document = (TLRPC.Document) objects.get(i); + loadedFromServer.remove(document.id); + } + } + + if (!loadedFromServer.isEmpty()) { + loadFromServer(new ArrayList<>(loadedFromServer)); + } + } + })); + } + + private void putToStorage(ArrayList objects) { + MessagesStorage.getInstance(currentAccount).getStorageQueue().postRunnable(() -> { + SQLiteDatabase database = MessagesStorage.getInstance(currentAccount).getDatabase(); + try { + SQLitePreparedStatement state = database.executeFast("REPLACE INTO animated_emoji VALUES(?, ?)"); + for (int i = 0; i < objects.size(); i++) { + if (objects.get(i) instanceof TLRPC.Document) { + TLRPC.Document document = (TLRPC.Document) objects.get(i); + NativeByteBuffer data = null; + try { + data = new NativeByteBuffer(document.getObjectSize()); + document.serializeToStream(data); + state.requery(); + state.bindLong(1, document.id); + state.bindByteBuffer(2, data); + state.step(); + } catch (Exception e) { + e.printStackTrace(); + } + if (data != null) { + data.reuse(); + } + } + } + state.dispose(); + } catch (SQLiteException e) { + FileLog.e(e); + } + }); + } + + public void processDocuments(ArrayList documents) { + checkThread(); + for (int i = 0; i < documents.size(); ++i) { + if (documents.get(i) instanceof TLRPC.Document) { + TLRPC.Document document = (TLRPC.Document) documents.get(i); + if (emojiDocumentsCache == null) { + emojiDocumentsCache = new HashMap<>(); + } + emojiDocumentsCache.put(document.id, document); + if (loadingDocuments != null) { + ArrayList loadingCallbacks = loadingDocuments.remove(document.id); + if (loadingCallbacks != null) { + for (int j = 0; j < loadingCallbacks.size(); ++j) { + loadingCallbacks.get(j).run(document); + } + loadingCallbacks.clear(); + } + } + } + } + } + + public TLRPC.InputStickerSet findStickerSet(long documentId) { + if (emojiDocumentsCache == null) { + return null; + } + TLRPC.Document document = emojiDocumentsCache.get(documentId); + if (document == null) { + return null; + } + return MessageObject.getInputStickerSet(document); + } + } + + public static TLRPC.Document findDocument(int account, long documentId) { + EmojiDocumentFetcher fetcher = getDocumentFetcher(account); + if (fetcher == null || fetcher.emojiDocumentsCache == null) { + return null; + } + return fetcher.emojiDocumentsCache.get(documentId); + } + + public static TLRPC.InputStickerSet findStickerSet(int account, long documentId) { + TLRPC.Document document = findDocument(account, documentId); + return document == null ? null : MessageObject.getInputStickerSet(document); + } + + private boolean attached; + private ArrayList views; + private ArrayList holders; + + public int sizedp; + + private TLRPC.Document document; + private long documentId; + private int cacheType; + private int currentAccount; + + private ImageReceiver imageReceiver; + private float alpha = 1f; + + public AnimatedEmojiDrawable(int cacheType, int currentAccount, long documentId) { + this.currentAccount = currentAccount; + this.cacheType = cacheType; + 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) { + sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[2].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[2].descent())) * 1.15f / AndroidUtilities.density); + } else if (this.cacheType == CACHE_TYPE_KEYBOARD || this.cacheType == CACHE_TYPE_TAB_STRIP || this.cacheType == CACHE_TYPE_ALERT_PREVIEW) { + sizedp = 34; + } 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); + } else { + sizedp = 34; + } + + this.documentId = documentId; + getDocumentFetcher(currentAccount).fetchDocument(documentId, document -> { + this.document = document; + this.initDocument(); + }); + } + + public AnimatedEmojiDrawable(int cacheType, int currentAccount, @NonNull TLRPC.Document document) { + this.cacheType = cacheType; + this.currentAccount = currentAccount; + this.document = document; + 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) { + sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[2].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[2].descent())) * 1.15f / AndroidUtilities.density); + } else if (this.cacheType == CACHE_TYPE_KEYBOARD || this.cacheType == CACHE_TYPE_TAB_STRIP || this.cacheType == CACHE_TYPE_ALERT_PREVIEW) { + sizedp = 34; + } 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); + } else { + sizedp = 34; + } + + this.initDocument(); + } + + public long getDocumentId() { + return this.document != null ? this.document.id : this.documentId; + } + + public TLRPC.Document getDocument() { + return this.document; + } + + private void initDocument() { + if (document == null || imageReceiver != null) { + return; + } + imageReceiver = new ImageReceiver() { + @Override + public void invalidate() { + AnimatedEmojiDrawable.this.invalidate(); + super.invalidate(); + } + + @Override + protected boolean setImageBitmapByKey(Drawable drawable, String key, int type, boolean memCache, int guid) { + AnimatedEmojiDrawable.this.invalidate(); + return super.setImageBitmapByKey(drawable, key, type, memCache, guid); + } + }; + if (cacheType != 0) { + imageReceiver.setUniqKeyPrefix(cacheType + "_"); + } + boolean onlyStaticPreview = SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW && (cacheType == CACHE_TYPE_KEYBOARD || cacheType == CACHE_TYPE_ALERT_PREVIEW); + + String filter = sizedp + "_" + sizedp; + if (cacheType != STANDARD_LOTTIE_FRAME && (cacheType != CACHE_TYPE_MESSAGES_LARGE || SharedConfig.getDevicePerformanceClass() < SharedConfig.PERFORMANCE_CLASS_HIGH)) { + filter += "_pcache"; + } + if (cacheType != CACHE_TYPE_MESSAGES && cacheType != CACHE_TYPE_MESSAGES_LARGE) { + filter += "_compress"; + } + if (cacheType == STANDARD_LOTTIE_FRAME) { + filter += "firstframe"; + } + + ImageLocation mediaLocation; + String mediaFilter; + Drawable thumbDrawable = null; + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); + if ("video/webm".equals(document.mime_type)) { + mediaLocation = ImageLocation.getForDocument(document); + mediaFilter = filter + "_" + ImageLoader.AUTOPLAY_FILTER; + } else { + String probableCacheKey = (cacheType != 0 ? cacheType + "_" : "") + documentId + "@" + filter; + if (cacheType == CACHE_TYPE_KEYBOARD || !ImageLoader.getInstance().hasLottieMemCache(probableCacheKey)) { + SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document.thumbs, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); + if (svgThumb != null) { + svgThumb.overrideWidthAndHeight(512, 512); + } + thumbDrawable = svgThumb; + } + mediaLocation = ImageLocation.getForDocument(document); + mediaFilter = filter; + } + if (onlyStaticPreview) { + mediaLocation = null; + } + if (cacheType == STANDARD_LOTTIE_FRAME) { + imageReceiver.setImage(null, null, mediaLocation, mediaFilter, null, null, thumbDrawable, document.size, null, document, 1); + + } else { + imageReceiver.setImage(mediaLocation, mediaFilter, ImageLocation.getForDocument(thumb, document), sizedp + "_" + sizedp, null, null, thumbDrawable, document.size, null, document, 1); + + } + + if (cacheType == CACHE_TYPE_ALERT_PREVIEW) { + imageReceiver.setLayerNum(7); + } + imageReceiver.setAspectFit(true); + if (cacheType != STANDARD_LOTTIE_FRAME) { + imageReceiver.setAllowStartLottieAnimation(true); + imageReceiver.setAllowStartAnimation(true); + imageReceiver.setAutoRepeat(1); + } else { + imageReceiver.setAllowStartAnimation(false); + imageReceiver.setAllowStartLottieAnimation(false); + imageReceiver.setAutoRepeat(0); + } + imageReceiver.setAllowDecodeSingleFrame(true); + updateAttachState(); + invalidate(); + } + + void invalidate() { + if (views != null) { + for (int i = 0; i < views.size(); ++i) { + View view = views.get(i); + if (view != null) { + view.invalidate(); + } + } + } + if (holders != null) { + for (int i = 0; i < holders.size(); ++i) { + AnimatedEmojiSpan.AnimatedEmojiHolder holder = holders.get(i); + if (holder != null) { + holder.invalidate(); + } + } + } + } + + @Override + public String toString() { + return "AnimatedEmojiDrawable{" + (document == null ? "null" : MessageObject.findAnimatedEmojiEmoticon(document, null)) + "}"; + } + + private static Paint placeholderPaint; + public static void updatePlaceholderPaintColor() { + if (placeholderPaint != null) { + placeholderPaint.setColor(Theme.isCurrentThemeDark() ? 0x0fffffff : 0x0f000000); + } + } + + @Override + public void draw(@NonNull Canvas canvas) { + drawDebugCacheType(canvas); + if (imageReceiver != null) { + imageReceiver.setImageCoords(getBounds()); + imageReceiver.setAlpha(alpha); + imageReceiver.draw(canvas); + } else { + shouldDrawPlaceholder = true; + } + drawPlaceholder(canvas, getBounds().centerX(), getBounds().centerY(), getBounds().width() / 2f); + } + + public void draw(Canvas canvas, Rect drawableBounds, float alpha) { + drawDebugCacheType(canvas); + if (imageReceiver != null) { + imageReceiver.setImageCoords(drawableBounds); + imageReceiver.setAlpha(alpha); + imageReceiver.draw(canvas); + } else { + shouldDrawPlaceholder = true; + } + if (drawableBounds != null) { + drawPlaceholder(canvas, drawableBounds.centerX(), drawableBounds.centerY(), drawableBounds.width() / 2f); + } + } + public void draw(Canvas canvas, ImageReceiver.BackgroundThreadDrawHolder backgroundThreadDrawHolder) { + drawDebugCacheType(canvas); + if (imageReceiver != null) { + imageReceiver.setAlpha(alpha); + imageReceiver.draw(canvas, backgroundThreadDrawHolder); + } else { + shouldDrawPlaceholder = true; + } + if (backgroundThreadDrawHolder != null) { + drawPlaceholder(canvas, backgroundThreadDrawHolder.imageX + backgroundThreadDrawHolder.imageW / 2, backgroundThreadDrawHolder.imageY + backgroundThreadDrawHolder.imageH / 2, backgroundThreadDrawHolder.imageW / 2); + } + } + + private void drawDebugCacheType(Canvas canvas) { + if (DEBUG_CACHE_TYPE) { + if (debugCacheType == null) { + debugCacheType = new Paint(Paint.ANTI_ALIAS_FLAG); + } + debugCacheType.setColor(0xff000000 | (cacheType % 2 == 0 ? 0x00ff0000 : 0x0000ff00) | (cacheType % 3 == 0 ? 0x000000ff : 0x00ff0000)); + canvas.drawRect(getBounds(), debugCacheType); + } + } + + private AnimatedFloat placeholderAlpha = new AnimatedFloat(1f, this::invalidate, 0, 150, new LinearInterpolator()); + private boolean shouldDrawPlaceholder = false; + private void drawPlaceholder(Canvas canvas, float cx, float cy, float r) { +// if (!shouldDrawPlaceholder) { +// return; +// } +// float alpha = placeholderAlpha.set(imageReceiver == null ? 1f : 0f); +// if (alpha < 0) { +// if (imageReceiver != null) { +// shouldDrawPlaceholder = false; +// } +// return; +// } +// if (placeholderPaint == null) { +// placeholderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); +// placeholderPaint.setColor(Theme.isCurrentThemeDark() ? 0x0fffffff : 0x0f000000); +// } +// int wasAlpha = placeholderPaint.getAlpha(); +// placeholderPaint.setAlpha((int) (wasAlpha * alpha)); +// canvas.drawCircle(cx, cy, r, placeholderPaint); +// placeholderPaint.setAlpha(wasAlpha); + } + + public void addView(View callback) { + if (views == null) { + views = new ArrayList<>(10); + } + if (!views.contains(callback)) { + views.add(callback); + } + updateAttachState(); + } + + public void addView(AnimatedEmojiSpan.AnimatedEmojiHolder holder) { + if (holders == null) { + holders = new ArrayList<>(10); + } + if (!holders.contains(holder)) { + holders.add(holder); + } + updateAttachState(); + } + + public void removeView(AnimatedEmojiSpan.AnimatedEmojiHolder holder) { + if (holders != null) { + holders.remove(holder); + } + updateAttachState(); + } + + public void removeView(View view) { + if (views != null) { + views.remove(view); + } + updateAttachState(); + } + + int count; + private void updateAttachState() { + if (imageReceiver == null) { + return; + } + boolean attach = (views != null && views.size() > 0) || (holders != null && holders.size() > 0); + if (attach != attached) { + attached = attach; + if (attached) { + count++; + imageReceiver.onAttachedToWindow(); + } else { + count--; + imageReceiver.onDetachedFromWindow(); + } + } + +// if (globalEmojiCache != null && (views == null || views.size() <= 0) && (holders == null || holders.size() <= 0) && globalEmojiCache.size() > 300) { +// HashMap cache = globalEmojiCache.get(currentAccount); +// if (cache != null) { +// cache.remove(documentId); +// } +// } + } + + @Override + public void setAlpha(int alpha) { + this.alpha = alpha / 255f; + if (imageReceiver != null) { + imageReceiver.setAlpha(this.alpha); + } + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + + public ImageReceiver getImageReceiver() { + return imageReceiver; + } + +} \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java new file mode 100644 index 000000000..8b59dfd44 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java @@ -0,0 +1,784 @@ +package org.telegram.ui.Components; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.text.Layout; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.CharacterStyle; +import android.text.style.ReplacementSpan; +import android.util.LongSparseArray; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Components.spoilers.SpoilerEffect; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class AnimatedEmojiSpan extends ReplacementSpan { + + public long documentId; + public TLRPC.Document document; + private float scale; + public boolean standard; + + private Paint.FontMetricsInt fontMetrics; + private float size = AndroidUtilities.dp(20); + public int cacheType = -1; + int measuredSize; + + boolean spanDrawn; + boolean positionChanged; + float lastDrawnCx; + float lastDrawnCy; + private boolean recordPositions = true; + + public AnimatedEmojiSpan(@NonNull TLRPC.Document document, Paint.FontMetricsInt fontMetrics) { + this(document.id, 1.2f, fontMetrics); + this.document = document; + } + + public AnimatedEmojiSpan(long documentId, Paint.FontMetricsInt fontMetrics) { + this(documentId, 1.2f, fontMetrics); + } + + public AnimatedEmojiSpan(long documentId, float scale, Paint.FontMetricsInt fontMetrics) { + this.documentId = documentId; + this.scale = scale; + this.fontMetrics = fontMetrics; + if (fontMetrics != null) { + size = Math.abs(fontMetrics.descent) + Math.abs(fontMetrics.ascent); + if (size == 0) { + size = AndroidUtilities.dp(20); + } + } + } + + public long getDocumentId() { + return document != null ? document.id : documentId; + } + + public void replaceFontMetrics(Paint.FontMetricsInt newMetrics, int newSize, int cacheType) { + fontMetrics = newMetrics; + size = newSize; + this.cacheType = cacheType; + } + + public void applyFontMetrics(Paint.FontMetricsInt newMetrics, int cacheType) { + fontMetrics = newMetrics; + this.cacheType = cacheType; + } + + + @Override + public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { + if (fontMetrics == null) { + int sz = (int) size; + + int offset = AndroidUtilities.dp(8); + int w = AndroidUtilities.dp(10); + + if (fm != null) { + fm.top = (int) ((-w - offset) * scale); + fm.bottom = (int) ((w - offset) * scale); + fm.ascent = (int) ((-w - offset) * scale); + fm.descent = (int) ((w - offset) * scale); + fm.leading = 0; + } + + measuredSize = (int) (sz * scale); + } else { + if (fm != null) { + fm.ascent = (int) (fontMetrics.ascent); + fm.descent = (int) (fontMetrics.descent); + + fm.top = (int) (fontMetrics.top); + fm.bottom = (int) (fontMetrics.bottom); + } + measuredSize = (int) (size * scale); + } + return measuredSize; + } + + private int asizeDp; + public void addSize(int asizeDp) { +// this.asizeDp = asizeDp; + } + + @Override + public void draw(@NonNull Canvas canvas, CharSequence charSequence, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { + if (recordPositions) { + spanDrawn = true; + float cx = x + measuredSize / 2f; + float cy = top + (bottom - top) / 2f; + if (cx != lastDrawnCx || cy != lastDrawnCy) { + lastDrawnCx = cx; + lastDrawnCy = cy; + positionChanged = true; + } + } + } + + public static void drawAnimatedEmojis(Canvas canvas, Layout layout, EmojiGroupedSpans stack, float offset, List spoilers, float boundTop, float boundBottom, float drawingYOffset, float alpha) { + if (canvas == null || layout == null || stack == null) { + return; + } + + + boolean needRestore = false; + if (Emoji.emojiDrawingYOffset != 0 || offset != 0) { + needRestore = true; + canvas.save(); + canvas.translate(0, Emoji.emojiDrawingYOffset + AndroidUtilities.dp(20 * offset)); + } + + long time = System.currentTimeMillis(); + for (int k = 0; k < stack.backgroundDrawingArray.size(); k++) { + SpansChunk chunk = stack.backgroundDrawingArray.get(k); + if (chunk.layout == layout) { + chunk.draw(canvas, spoilers, time, boundTop, boundBottom, drawingYOffset, alpha); + break; + } + } + + if (needRestore) { + canvas.restore(); + } + } + + private static boolean isInsideSpoiler(Layout layout, int start, int end) { + if (layout == null || !(layout.getText() instanceof Spanned)) { + return false; + } + start = Math.max(0, start); + end = Math.min(layout.getText().length() - 1, end); + TextStyleSpan[] spans = ((Spanned) layout.getText()).getSpans(start, end, TextStyleSpan.class); + for (int i = 0; spans != null && i < spans.length; ++i) { + if (spans[i] != null && spans[i].isSpoiler()) + return true; + } + return false; + } + + // === + // stack + // === + + public static class AnimatedEmojiHolder { + private final View view; + private final boolean invalidateInParent; + public Layout layout; + public AnimatedEmojiSpan span; + public Rect drawableBounds; + public AnimatedEmojiDrawable drawable; + public boolean skipDraw; + public float drawingYOffset; + public float alpha; + public SpansChunk spansChunk; + public boolean insideSpoiler; + + ImageReceiver.BackgroundThreadDrawHolder backgroundDrawHolder; + + public AnimatedEmojiHolder(View view, boolean invalidateInParent) { + this.view = view; + this.invalidateInParent = invalidateInParent; + } + + public boolean outOfBounds(float boundTop, float boundBottom) { + return drawableBounds.bottom < boundTop || drawableBounds.top > boundBottom; + } + + public void prepareForBackgroundDraw(long updateTime) { + if (drawable == null) { + return; + } + ImageReceiver imageReceiver = drawable.getImageReceiver(); + drawable.update(updateTime); + drawable.setBounds(drawableBounds); + if (imageReceiver != null) { + if (span != null && span.document == null && drawable.getDocument() != null) { + span.document = drawable.getDocument(); + } + imageReceiver.setAlpha(alpha); + imageReceiver.setImageCoords(drawableBounds); + backgroundDrawHolder = imageReceiver.setDrawInBackgroundThread(backgroundDrawHolder); + backgroundDrawHolder.overrideAlpha = alpha; + backgroundDrawHolder.setBounds(drawableBounds); + backgroundDrawHolder.time = updateTime; + } + } + + public void releaseDrawInBackground() { + if (backgroundDrawHolder != null) { + backgroundDrawHolder.release(); + } + } + + public void draw(Canvas canvas, long time, float boundTop, float boundBottom, float alpha) { + if ((boundTop != 0 || boundBottom != 0) && outOfBounds(boundTop, boundBottom)) { + skipDraw = true; + return; + } else { + skipDraw = false; + } + + if (drawable.getImageReceiver() != null) { + drawable.setTime(time); + drawable.draw(canvas, drawableBounds, alpha * this.alpha); +// drawable.setTime(0); + } + } + + public void invalidate() { + if (view != null) { + if (invalidateInParent && view.getParent() != null) { + ((View) view.getParent()).invalidate(); + } else { + view.invalidate(); + } + } + } + } + + public static EmojiGroupedSpans update(int cacheType, View view, EmojiGroupedSpans prev, ArrayList blockLayouts) { + return update(cacheType, view, prev, blockLayouts, false); + } + + public static EmojiGroupedSpans update(int cacheType, View view, EmojiGroupedSpans prev, ArrayList blockLayouts, boolean clone) { + return update(cacheType, view, false, prev, blockLayouts, clone); + } + + public static EmojiGroupedSpans update(int cacheType, View view, boolean invalidateParent, EmojiGroupedSpans prev, ArrayList blockLayouts) { + return update(cacheType, view, invalidateParent, prev, blockLayouts, false); + } + + public static EmojiGroupedSpans update(int cacheType, View view, boolean invalidateParent, EmojiGroupedSpans prev, ArrayList blockLayouts, boolean clone) { + Layout[] layouts = new Layout[blockLayouts == null ? 0 : blockLayouts.size()]; + if (blockLayouts != null) { + for (int i = 0; i < blockLayouts.size(); ++i) { + layouts[i] = blockLayouts.get(i).textLayout; + } + } + return update(cacheType, view, invalidateParent, prev, clone, layouts); + } + + public static EmojiGroupedSpans update(int cacheType, View view, EmojiGroupedSpans prev, Layout ...layouts) { + return update(cacheType, view, false, prev, layouts); + } + + public static EmojiGroupedSpans update(int cacheType, View view, boolean invalidateParent, EmojiGroupedSpans prev, Layout ...layouts) { + return update(cacheType, view, invalidateParent, prev, false, layouts); + } + + public static EmojiGroupedSpans update(int cacheType, View view, boolean invalidateParent, EmojiGroupedSpans prev, boolean clone, Layout ...layouts) { + if (layouts == null || layouts.length <= 0) { + if (prev != null) { + prev.holders.clear(); + prev.release(); + } + return null; + } + + for (int l = 0; l < layouts.length; ++l) { + Layout textLayout = layouts[l]; + AnimatedEmojiSpan[] spans = null; + if (textLayout != null && textLayout.getText() instanceof Spannable) { + + Spannable spanned = (Spannable) textLayout.getText(); + spans = spanned.getSpans(0, spanned.length(), AnimatedEmojiSpan.class); + + for (int i = 0; spans != null && i < spans.length; ++i) { + AnimatedEmojiSpan span = spans[i]; + if (span == null) { + continue; + } + if (clone) { + int start = spanned.getSpanStart(span), end = spanned.getSpanEnd(span); + spanned.removeSpan(span); + spanned.setSpan(span = cloneSpan(span), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + AnimatedEmojiHolder holder = null; + if (prev == null) { + prev = new EmojiGroupedSpans(); + } + for (int j = 0; j < prev.holders.size(); ++j) { + if (prev.holders.get(j).span == span && + prev.holders.get(j).layout == textLayout) { + holder = prev.holders.get(j); + break; + } + } + if (holder == null) { + holder = new AnimatedEmojiHolder(view, invalidateParent); + holder.layout = textLayout; + int localCacheType = span.standard ? AnimatedEmojiDrawable.STANDARD_LOTTIE_FRAME : (span.cacheType < 0 ? cacheType : span.cacheType); + if (span.document != null) { + holder.drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.document); + } else { + holder.drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.documentId); + } + holder.insideSpoiler = isInsideSpoiler(textLayout, spanned.getSpanStart(span), spanned.getSpanEnd(span)); + holder.drawableBounds = new Rect(); + holder.span = span; + prev.add(textLayout, holder); + } else { + holder.insideSpoiler = isInsideSpoiler(textLayout, spanned.getSpanStart(span), spanned.getSpanEnd(span)); + } + } + } + + if (prev != null) { + for (int i = 0; i < prev.holders.size(); ++i) { + AnimatedEmojiHolder holder = prev.holders.get(i); + if (holder.layout == textLayout) { + AnimatedEmojiSpan span = prev.holders.get(i).span; + boolean found = false; + for (int j = 0; spans != null && j < spans.length; ++j) { + if (spans[j] == span) { + found = true; + break; + } + } + if (!found) { + prev.remove(i); + i--; + } + } + } + } + } + + if (prev != null) { + for (int i = 0; i < prev.holders.size(); ++i) { + Layout layout = prev.holders.get(i).layout; + boolean found = false; + for (int l = 0; l < layouts.length; ++l) { + if (layouts[l] == layout) { + found = true; + break; + } + } + if (!found) { + prev.remove(i); + i--; + } + } + } + + return prev; + } + + public static LongSparseArray update(View holder, AnimatedEmojiSpan[] spans, LongSparseArray prev) { + return update(0, holder, spans, prev); + } + + public static LongSparseArray update(int cacheType, View holder, AnimatedEmojiSpan[] spans, LongSparseArray prev) { + if (spans == null) { + return prev; + } + if (prev == null) { + prev = new LongSparseArray<>(); + } + + // Remove useless emojis + for (int i = 0; i < prev.size(); ++i) { + long documentId = prev.keyAt(i); + AnimatedEmojiDrawable d = prev.get(documentId); + if (d == null) { + prev.remove(documentId); + i--; + } else { + boolean found = false; + if (spans != null) { + for (int j = 0; j < spans.length; ++j) { + if (spans[j] != null && spans[j].getDocumentId() == documentId) { + found = true; + break; + } + } + } + if (!found) { + d.removeView(holder); + prev.remove(documentId); + i--; + } + } + } + + // Add new emojis + for (int i = 0; i < spans.length; ++i) { + AnimatedEmojiSpan span = spans[i]; + if (span != null) { + if (prev.get(span.getDocumentId()) == null) { + AnimatedEmojiDrawable drawable; + int localCacheType = span.standard ? AnimatedEmojiDrawable.STANDARD_LOTTIE_FRAME : (span.cacheType < 0 ? cacheType : span.cacheType); + if (span.document != null) { + drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.document); + } else { + drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.documentId); + } + drawable.addView(holder); + prev.put(span.getDocumentId(), drawable); + } + } + } + + return prev; + } + + public static LongSparseArray update(View holder, ArrayList spans, LongSparseArray prev) { + return update(0, holder, spans, prev); + } + + public static LongSparseArray update(int cacheType, View holder, ArrayList spans, LongSparseArray prev) { + if (spans == null) { + return prev; + } + if (prev == null) { + prev = new LongSparseArray<>(); + } + + // Remove useless emojis + for (int i = 0; i < prev.size(); ++i) { + long documentId = prev.keyAt(i); + AnimatedEmojiDrawable d = prev.get(documentId); + if (d == null) { + prev.remove(documentId); + i--; + } else { + boolean found = false; + for (int j = 0; j < spans.size(); ++j) { + if (spans.get(j) != null && spans.get(j).getDocumentId() == documentId) { + found = true; + break; + } + } + if (!found) { + d.addView(holder); + prev.remove(documentId); + i--; + } + } + } + + // Add new emojis + for (int i = 0; i < spans.size(); ++i) { + AnimatedEmojiSpan span = spans.get(i); + if (span != null) { + if (prev.get(span.getDocumentId()) == null) { + AnimatedEmojiDrawable drawable; + int localCacheType = span.standard ? AnimatedEmojiDrawable.STANDARD_LOTTIE_FRAME : (span.cacheType < 0 ? cacheType : span.cacheType); + drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.documentId); + drawable.addView(holder); + prev.put(span.getDocumentId(), drawable); + } + } + } + + return prev; + } + + public static void release(View holder, LongSparseArray arr) { + if (arr == null) { + return; + } + for (int i = 0; i < arr.size(); ++i) { + AnimatedEmojiDrawable d = arr.valueAt(i); + if (d != null) { + d.removeView(holder); + } + } + arr.clear(); + } + + public static void release(View holder, EmojiGroupedSpans spans) { + if (spans == null) { + return; + } + spans.release(); + } + + + public static class EmojiGroupedSpans { + public ArrayList holders = new ArrayList<>(); + HashMap groupedByLayout = new HashMap<>(); + ArrayList backgroundDrawingArray = new ArrayList<>(); + + public void add(Layout layout, AnimatedEmojiHolder holder) { + holders.add(holder); + SpansChunk chunkByLayout = groupedByLayout.get(layout); + if (chunkByLayout == null) { + chunkByLayout = new SpansChunk(holder.view, layout, holder.invalidateInParent); + groupedByLayout.put(layout, chunkByLayout); + backgroundDrawingArray.add(chunkByLayout); + } + chunkByLayout.add(holder); + holder.drawable.addView(holder); + } + + public boolean hasLayout(Layout layout) { + return groupedByLayout.containsKey(layout); + } + + public void remove(Layout layout, AnimatedEmojiHolder holder) { + holders.remove(holder); + SpansChunk chunkByLayout = groupedByLayout.get(layout); + if (chunkByLayout != null) { + chunkByLayout.remove(holder); + if (chunkByLayout.holders.isEmpty()) { + groupedByLayout.remove(layout); + backgroundDrawingArray.remove(chunkByLayout); + } + } + if (holder.drawable != null) { + holder.drawable.removeView(holder); + } + } + + public void remove(int i) { + AnimatedEmojiHolder holder = holders.get(i); + holders.remove(i); + SpansChunk chunkByLayout = groupedByLayout.get(holder.layout); + if (chunkByLayout != null) { + chunkByLayout.remove(holder); + if (chunkByLayout.holders.isEmpty()) { + groupedByLayout.remove(holder.layout); + backgroundDrawingArray.remove(chunkByLayout); + } + } else { + throw new RuntimeException("!!!"); + } + holder.drawable.removeView(holder); + } + + public void release() { + for (int i = 0; i < holders.size(); i++) { + remove(i); + i--; + } + } + + public void clearPositions() { + for (int i = 0; i < holders.size(); i++) { + holders.get(i).span.spanDrawn = false; + } + } + + public void recordPositions(boolean record) { + for (int i = 0; i < holders.size(); i++) { + holders.get(i).span.recordPositions = record; + } + } + + public void replaceLayout(Layout newText, Layout oldText) { + if (oldText != null) { + SpansChunk chunk = groupedByLayout.remove(oldText); + if (chunk != null) { + chunk.layout = newText; + for (int i = 0; i < chunk.holders.size(); i++) { + chunk.holders.get(i).layout = newText; + } + groupedByLayout.put(newText, chunk); + } + } + } + } + + private static class SpansChunk { + + Layout layout; + final View view; + ArrayList holders = new ArrayList<>(); + DrawingInBackgroundThreadDrawable backgroundThreadDrawable; + private boolean allowBackgroundRendering; + + public SpansChunk(View view, Layout layout, boolean allowBackgroundRendering) { + this.layout = layout; + this.view = view; + this.allowBackgroundRendering = allowBackgroundRendering; + } + + public void add(AnimatedEmojiHolder holder) { + holders.add(holder); + holder.spansChunk = this; + checkBackgroundRendering(); + } + + public void remove(AnimatedEmojiHolder holder) { + holders.remove(holder); + holder.spansChunk = null; + checkBackgroundRendering(); + } + + private void checkBackgroundRendering() { + if (allowBackgroundRendering && holders.size() >= 10 && backgroundThreadDrawable == null) { + backgroundThreadDrawable = new DrawingInBackgroundThreadDrawable() { + + private final ArrayList backgroundHolders = new ArrayList<>(); + + @Override + public void drawInBackground(Canvas canvas) { + for (int i = 0; i < backgroundHolders.size(); i++) { + AnimatedEmojiHolder holder = backgroundHolders.get(i); + if (holder != null && holder.backgroundDrawHolder != null) { + holder.drawable.draw(canvas, holder.backgroundDrawHolder); + } + } + } + + @Override + public void drawInUiThread(Canvas canvas) { + long time = System.currentTimeMillis(); + for (int i = 0; i < holders.size(); ++i) { + AnimatedEmojiHolder holder = holders.get(i); + if (!holder.span.spanDrawn) { + continue; + } + holder.draw(canvas, time, 0, 0, 1f); + } + } + + @Override + public void prepareDraw(long time) { + backgroundHolders.clear(); + backgroundHolders.addAll(holders); + for (int i = 0; i < backgroundHolders.size(); i++) { + AnimatedEmojiHolder holder = backgroundHolders.get(i); + if (!holder.span.spanDrawn) { + backgroundHolders.remove(i--); + continue; + } + if (holder != null) { + holder.prepareForBackgroundDraw(time); + } + } + } + + @Override + public void onFrameReady() { + for (int i = 0; i < backgroundHolders.size(); i++) { + if (backgroundHolders.get(i) != null) { + backgroundHolders.get(i).releaseDrawInBackground(); + } + } + backgroundHolders.clear(); + if (view != null && view.getParent() != null) { + ((View) view.getParent()).invalidate(); + } + } + + @Override + public void onPaused() { + super.onPaused(); + } + + @Override + public void onResume() { + if (view != null && view.getParent() != null) { + ((View) view.getParent()).invalidate(); + } + } + }; + backgroundThreadDrawable.padding = AndroidUtilities.dp(3); + backgroundThreadDrawable.onAttachToWindow(); + } + else if (holders.size() < 10 && backgroundThreadDrawable != null) { + backgroundThreadDrawable.onDetachFromWindow(); + backgroundThreadDrawable = null; + } + } + + public void release() { + holders.clear(); + checkBackgroundRendering(); + } + + public void draw(Canvas canvas, List spoilers, long time, float boundTop, float boundBottom, float drawingYOffset, float alpha) { + for (int i = 0; i < holders.size(); ++i) { + AnimatedEmojiHolder holder = holders.get(i); + if (holder == null) { + continue; + } + AnimatedEmojiDrawable drawable = holder.drawable; + if (drawable == null) { + continue; + } + if (!holder.span.spanDrawn) { + continue; + } + + float halfSide = holder.span.measuredSize / 2f; + float cx, cy; + cx = holder.span.lastDrawnCx; + cy = holder.span.lastDrawnCy; + holder.drawableBounds.set((int) (cx - halfSide), (int) (cy - halfSide), (int) (cx + halfSide), (int) (cy + halfSide)); + + float spoilerAlpha = 1f; + if (spoilers != null && !spoilers.isEmpty() && holder.insideSpoiler) { + spoilerAlpha = Math.max(0, spoilers.get(0).getRippleProgress()); + } + + holder.drawingYOffset = drawingYOffset; + holder.alpha = spoilerAlpha; + if (backgroundThreadDrawable == null) { + holder.draw(canvas, time, boundTop, boundBottom, alpha); + } + } + if (backgroundThreadDrawable != null) { + backgroundThreadDrawable.draw(canvas, time, layout.getWidth(), layout.getHeight() + AndroidUtilities.dp(2), alpha); + } + } + } + + public static AnimatedEmojiSpan cloneSpan(AnimatedEmojiSpan span) { + if (span.document != null) { + return new AnimatedEmojiSpan(span.document, span.fontMetrics); + } else { + return new AnimatedEmojiSpan(span.documentId, span.scale, span.fontMetrics); + } + } + + public static CharSequence cloneSpans(CharSequence text) { + if (!(text instanceof Spanned)) { + return text; + } + Spanned spanned = (Spanned) text; + CharacterStyle[] spans = spanned.getSpans(0, spanned.length(), CharacterStyle.class); + if (spans == null || spans.length <= 0) { + return text; + } + AnimatedEmojiSpan[] aspans = spanned.getSpans(0, spanned.length(), AnimatedEmojiSpan.class); + if (aspans != null && aspans.length <= 0) { + return text; + } + SpannableString newText = new SpannableString(spanned); + for (int i = 0; i < spans.length; ++i) { + if (spans[i] == null) { + continue; + } + + if (spans[i] instanceof AnimatedEmojiSpan) { + int start = spanned.getSpanStart(spans[i]); + int end = spanned.getSpanEnd(spans[i]); + + AnimatedEmojiSpan oldSpan = (AnimatedEmojiSpan) spans[i]; + newText.removeSpan(oldSpan); + newText.setSpan(cloneSpan(oldSpan), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else { +// newText.setSpan(spans[i], start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + return newText; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java index 180327404..4be0e4c72 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java @@ -11,6 +11,7 @@ package org.telegram.ui.Components; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; @@ -21,8 +22,7 @@ import android.graphics.Shader; import android.graphics.drawable.Animatable; import android.graphics.drawable.BitmapDrawable; import android.os.Build; -import android.os.Handler; -import android.os.Looper; +import android.util.Log; import android.view.View; import org.telegram.messenger.AndroidUtilities; @@ -32,6 +32,7 @@ import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.utils.BitmapsCache; import org.telegram.tgnet.TLRPC; import java.io.File; @@ -40,7 +41,10 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { +public class AnimatedFileDrawable extends BitmapDrawable implements Animatable, BitmapsCache.Cacheable { + + public boolean skipFrameUpdate; + public long currentTime; private static native long createDecoder(String src, int[] params, int account, long streamFileSize, Object readCallback, boolean preview); @@ -99,6 +103,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { private final Object sync = new Object(); private boolean invalidateParentViewWithSecond; + public boolean ignoreNoParent; private long lastFrameDecodeTime; @@ -117,8 +122,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { private float scaleX = 1.0f; private float scaleY = 1.0f; private boolean applyTransformation; - private final android.graphics.Rect dstRect = new android.graphics.Rect(); - private static final Handler uiHandler = new Handler(Looper.getMainLooper()); + private final RectF dstRect = new RectF(); private volatile boolean isRunning; private volatile boolean isRecycled; public volatile long nativePtr; @@ -127,9 +131,12 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { private float endTime; private int renderingHeight; private int renderingWidth; + private boolean precache; private float scaleFactor = 1f; public boolean isWebmSticker; private final TLRPC.Document document; + private RectF dstRectBackground; + private Paint backgroundPaint; private View parentView; private ArrayList secondParentViews = new ArrayList<>(); @@ -144,68 +151,76 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { private boolean limitFps; public int repeatCount; + BitmapsCache bitmapsCache; + BitmapsCache.Metadata cacheMetadata; private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8, new ThreadPoolExecutor.DiscardPolicy()); - private static ScheduledThreadPoolExecutor generateCache = new ScheduledThreadPoolExecutor(4, new ThreadPoolExecutor.DiscardPolicy()); private Runnable uiRunnableNoFrame = new Runnable() { @Override public void run() { - if (destroyWhenDone && nativePtr != 0) { - destroyDecoder(nativePtr); - nativePtr = 0; - } - if (nativePtr == 0) { - if (renderingBitmap != null) { - renderingBitmap.recycle(); - renderingBitmap = null; - } - if (backgroundBitmap != null) { - backgroundBitmap.recycle(); - backgroundBitmap = null; - } - if (decodeQueue != null) { - decodeQueue.recycle(); - decodeQueue = null; - } - return; - } + chekDestroyDecoder(); loadFrameTask = null; scheduleNextGetFrame(); invalidateInternal(); } }; + boolean generatingCache; + Runnable cacheGenRunnable; + private Runnable uiRunnableGenerateCache = new Runnable() { + @Override + public void run() { + if (!isRecycled && !destroyWhenDone && !generatingCache) { + startTime = System.currentTimeMillis(); + if (RLottieDrawable.lottieCacheGenerateQueue == null) { + RLottieDrawable.createCacheGenQueue(); + } + generatingCache = true; + loadFrameTask = null; + RLottieDrawable.lottieCacheGenerateQueue.postRunnable(cacheGenRunnable = () -> { + bitmapsCache.createCache(); + AndroidUtilities.runOnUIThread(() -> { + generatingCache = false; + scheduleNextGetFrame(); + }); + }); + } + } + }; + + private void chekDestroyDecoder() { + if (loadFrameRunnable == null && destroyWhenDone && nativePtr != 0 && !generatingCache) { + destroyDecoder(nativePtr); + nativePtr = 0; + } + if (!canLoadFrames()) { + if (renderingBitmap != null) { + renderingBitmap.recycle(); + renderingBitmap = null; + } + if (backgroundBitmap != null) { + backgroundBitmap.recycle(); + backgroundBitmap = null; + } + if (decodeQueue != null) { + decodeQueue.recycle(); + decodeQueue = null; + } + invalidateInternal(); + } + } + private void invalidateInternal() { for (int i = 0; i < parents.size(); i++) { - if (parents.get(i).getParentView() != null) { - parents.get(i).getParentView().invalidate(); - } + parents.get(i).invalidate(); } } private Runnable uiRunnable = new Runnable() { @Override public void run() { - if (destroyWhenDone && nativePtr != 0) { - destroyDecoder(nativePtr); - nativePtr = 0; - } - if (nativePtr == 0) { - if (renderingBitmap != null) { - renderingBitmap.recycle(); - renderingBitmap = null; - } - if (backgroundBitmap != null) { - backgroundBitmap.recycle(); - backgroundBitmap = null; - } - if (decodeQueue != null) { - decodeQueue.recycle(); - decodeQueue = null; - } - return; - } + chekDestroyDecoder(); if (stream != null && pendingRemoveLoading) { FileLoader.getInstance(currentAccount).removeLoadingVideo(stream.getDocument(), false, false); } @@ -254,6 +269,10 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { }; public void checkRepeat() { + if (ignoreNoParent) { + start(); + return; + } int count = 0; for (int j = 0; j < parents.size(); j++) { ImageReceiver parent = parents.get(j); @@ -286,6 +305,28 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { decoderCreated = true; } try { + if (bitmapsCache != null) { + if (backgroundBitmap == null) { + backgroundBitmap = Bitmap.createBitmap(renderingWidth, renderingHeight, Bitmap.Config.ARGB_8888); + } + if (cacheMetadata == null) { + cacheMetadata = new BitmapsCache.Metadata(); + } + lastFrameDecodeTime = System.currentTimeMillis(); + int result = bitmapsCache.getFrame(backgroundBitmap, cacheMetadata); + metaData[3] = backgroundBitmapTime = cacheMetadata.frame * 33; + + if (bitmapsCache.needGenCache()) { + AndroidUtilities.runOnUIThread(uiRunnableGenerateCache); + } + if (result == -1) { + AndroidUtilities.runOnUIThread(uiRunnableNoFrame); + } else { + AndroidUtilities.runOnUIThread(uiRunnable); + } + return; + } + if (nativePtr != 0 || metaData[0] == 0 || metaData[1] == 0) { if (backgroundBitmap == null && metaData[0] > 0 && metaData[1] > 0) { try { @@ -360,22 +401,23 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } }; - public AnimatedFileDrawable(File file, boolean createDecoder, long streamSize, TLRPC.Document document, ImageLocation location, Object parentObject, long seekTo, int account, boolean preview) { - this(file, createDecoder, streamSize, document, location, parentObject, seekTo, account, preview, 0, 0); + public AnimatedFileDrawable(File file, boolean createDecoder, long streamSize, TLRPC.Document document, ImageLocation location, Object parentObject, long seekTo, int account, boolean preview, BitmapsCache.CacheOptions cacheOptions) { + this(file, createDecoder, streamSize, document, location, parentObject, seekTo, account, preview, 0, 0, cacheOptions); } - public AnimatedFileDrawable(File file, boolean createDecoder, long streamSize, TLRPC.Document document, ImageLocation location, Object parentObject, long seekTo, int account, boolean preview, int w, int h) { + public AnimatedFileDrawable(File file, boolean createDecoder, long streamSize, TLRPC.Document document, ImageLocation location, Object parentObject, long seekTo, int account, boolean preview, int w, int h, BitmapsCache.CacheOptions cacheOptions) { path = file; streamFileSize = streamSize; currentAccount = account; renderingHeight = h; renderingWidth = w; + this.precache = cacheOptions != null && renderingWidth > 0 && renderingHeight > 0; this.document = document; getPaint().setFlags(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); if (streamSize != 0 && (document != null || location != null)) { stream = new AnimatedFileDrawableStream(document, location, parentObject, account, preview); } - if (createDecoder) { + if (createDecoder && !this.precache) { nativePtr = createDecoder(file.getAbsolutePath(), metaData, currentAccount, streamFileSize, stream, preview); if (nativePtr != 0 && (metaData[0] > 3840 || metaData[1] > 3840)) { destroyDecoder(nativePtr); @@ -384,6 +426,15 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { updateScaleFactor(); decoderCreated = true; } + if (this.precache) { + nativePtr = createDecoder(file.getAbsolutePath(), metaData, currentAccount, streamFileSize, stream, preview); + if (nativePtr != 0 && (metaData[0] > 3840 || metaData[1] > 3840)) { + destroyDecoder(nativePtr); + nativePtr = 0; + } else { + bitmapsCache = new BitmapsCache(file, this, cacheOptions, renderingWidth, renderingHeight); + } + } if (seekTo != 0) { seekTo(seekTo, false); } @@ -511,6 +562,9 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } isRunning = false; isRecycled = true; + if (cacheGenRunnable != null) { + RLottieDrawable.lottieCacheGenerateQueue.cancelRunnable(cacheGenRunnable); + } if (loadFrameTask == null) { if (nativePtr != 0) { destroyDecoder(nativePtr); @@ -555,14 +609,6 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } } - protected static void runOnUiThread(Runnable task) { - if (Looper.myLooper() == uiHandler.getLooper()) { - task.run(); - } else { - uiHandler.post(task); - } - } - public void setUseSharedQueue(boolean value) { if (isWebmSticker) { return; @@ -586,12 +632,12 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { @Override public void start() { - if (isRunning || parents.size() == 0) { + if (isRunning || parents.size() == 0 && !ignoreNoParent) { return; } isRunning = true; scheduleNextGetFrame(); - runOnUiThread(mStartTask); + AndroidUtilities.runOnUIThread(mStartTask); } public float getCurrentProgress() { @@ -616,7 +662,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } private void scheduleNextGetFrame() { - if (loadFrameTask != null || nativePtr == 0 && decoderCreated || destroyWhenDone || !isRunning && (!decodeSingleFrame || decodeSingleFrame && singleFrameDecoded) || parents.size() == 0) { + if (loadFrameTask != null || !canLoadFrames() || destroyWhenDone || !isRunning && (!decodeSingleFrame || decodeSingleFrame && singleFrameDecoded) || parents.size() == 0 && !ignoreNoParent || generatingCache) { return; } long ms = 0; @@ -677,30 +723,34 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { @Override public void draw(Canvas canvas) { - if (nativePtr == 0 && decoderCreated || destroyWhenDone) { + drawInternal(canvas, false, System.currentTimeMillis()); + } + + public void drawInBackground(Canvas canvas, float x, float y, float w, float h, int alpha) { + if (dstRectBackground == null) { + dstRectBackground = new RectF(); + backgroundPaint = new Paint(); + backgroundPaint.setFilterBitmap(true); + } + backgroundPaint.setAlpha(alpha); + dstRectBackground.set(x, y, x + w, y + h); + drawInternal(canvas, true, 0); + } + + public void drawInternal(Canvas canvas, boolean drawInBackground, long currentTime) { + if (!canLoadFrames() || destroyWhenDone) { return; } - long now = System.currentTimeMillis(); - if (isRunning) { - if (renderingBitmap == null && nextRenderingBitmap == null) { - scheduleNextGetFrame(); - } else if (nextRenderingBitmap != null && (renderingBitmap == null || Math.abs(now - lastFrameTime) >= invalidateAfter)) { - renderingBitmap = nextRenderingBitmap; - renderingBitmapTime = nextRenderingBitmapTime; - renderingShader = nextRenderingShader; - nextRenderingBitmap = null; - nextRenderingBitmapTime = 0; - nextRenderingShader = null; - lastFrameTime = now; - } - } else if (!isRunning && decodeSingleFrame && Math.abs(now - lastFrameTime) >= invalidateAfter && nextRenderingBitmap != null) { - renderingBitmap = nextRenderingBitmap; - renderingBitmapTime = nextRenderingBitmapTime; - renderingShader = nextRenderingShader; - nextRenderingBitmap = null; - nextRenderingBitmapTime = 0; - nextRenderingShader = null; - lastFrameTime = now; + + if (currentTime == 0) { + currentTime = System.currentTimeMillis(); + } + + RectF rect = drawInBackground ? dstRectBackground : dstRect; + Paint paint = drawInBackground ? backgroundPaint : getPaint(); + + if (!drawInBackground) { + updateCurrentFrame(currentTime, false); } if (renderingBitmap != null) { @@ -712,28 +762,27 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { bitmapW = bitmapH; bitmapH = temp; } - dstRect.set(getBounds()); - scaleX = (float) dstRect.width() / bitmapW; - scaleY = (float) dstRect.height() / bitmapH; + rect.set(getBounds()); + scaleX = rect.width() / bitmapW; + scaleY = rect.height() / bitmapH; applyTransformation = false; } if (hasRoundRadius()) { if (renderingShader == null) { renderingShader = new BitmapShader(backgroundBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); } - Paint paint = getPaint(); paint.setShader(renderingShader); shaderMatrix.reset(); - shaderMatrix.setTranslate(dstRect.left, dstRect.top); + shaderMatrix.setTranslate(rect.left, rect.top); if (metaData[2] == 90) { shaderMatrix.preRotate(90); - shaderMatrix.preTranslate(0, -dstRect.width()); + shaderMatrix.preTranslate(0, -rect.width()); } else if (metaData[2] == 180) { shaderMatrix.preRotate(180); - shaderMatrix.preTranslate(-dstRect.width(), -dstRect.height()); + shaderMatrix.preTranslate(-rect.width(), -rect.height()); } else if (metaData[2] == 270) { shaderMatrix.preRotate(270); - shaderMatrix.preTranslate(-dstRect.height(), 0); + shaderMatrix.preTranslate(-rect.height(), 0); } shaderMatrix.preScale(scaleX, scaleY); @@ -750,19 +799,19 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } canvas.drawPath(roundPath, paint); } else { - canvas.translate(dstRect.left, dstRect.top); + canvas.translate(rect.left, rect.top); if (metaData[2] == 90) { canvas.rotate(90); - canvas.translate(0, -dstRect.width()); + canvas.translate(0, -rect.width()); } else if (metaData[2] == 180) { canvas.rotate(180); - canvas.translate(-dstRect.width(), -dstRect.height()); + canvas.translate(-rect.width(), -rect.height()); } else if (metaData[2] == 270) { canvas.rotate(270); - canvas.translate(-dstRect.height(), 0); + canvas.translate(-rect.height(), 0); } canvas.scale(scaleX, scaleY); - canvas.drawBitmap(renderingBitmap, 0, 0, getPaint()); + canvas.drawBitmap(renderingBitmap, 0, 0, paint); } } } @@ -844,7 +893,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } public boolean hasBitmap() { - return nativePtr != 0 && (renderingBitmap != null || nextRenderingBitmap != null); + return canLoadFrames() && (renderingBitmap != null || nextRenderingBitmap != null); } public int getOrientation() { @@ -854,9 +903,9 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { public AnimatedFileDrawable makeCopy() { AnimatedFileDrawable drawable; if (stream != null) { - drawable = new AnimatedFileDrawable(path, false, streamFileSize, stream.getDocument(), stream.getLocation(), stream.getParentObject(), pendingSeekToUI, currentAccount, stream != null && stream.isPreview()); + drawable = new AnimatedFileDrawable(path, false, streamFileSize, stream.getDocument(), stream.getLocation(), stream.getParentObject(), pendingSeekToUI, currentAccount, stream != null && stream.isPreview(), null); } else { - drawable = new AnimatedFileDrawable(path, false, streamFileSize, document, null, null, pendingSeekToUI, currentAccount, stream != null && stream.isPreview()); + drawable = new AnimatedFileDrawable(path, false, streamFileSize, document, null, null, pendingSeekToUI, currentAccount, stream != null && stream.isPreview(), null); } drawable.metaData[0] = metaData[0]; drawable.metaData[1] = metaData[1]; @@ -884,6 +933,9 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } public Bitmap getNextFrame() { + if (nativePtr == 0) { + return backgroundBitmap; + } if (backgroundBitmap == null) { backgroundBitmap = Bitmap.createBitmap((int) (metaData[0] * scaleFactor), (int) (metaData[1] * scaleFactor), Bitmap.Config.ARGB_8888); } @@ -902,4 +954,110 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { public File getFilePath() { return path; } + + long cacheGenerateTimestamp; + Bitmap generatingCacheBitmap; + long cacheGenerateNativePtr; + + @Override + public void prepareForGenerateCache() { + cacheGenerateNativePtr = createDecoder(path.getAbsolutePath(), metaData, currentAccount, streamFileSize, stream, false); + } + + @Override + public void releaseForGenerateCache() { + if (cacheGenerateNativePtr != 0) { + destroyDecoder(cacheGenerateNativePtr); + } + } + + @Override + public int getNextFrame(Bitmap bitmap) { + if (cacheGenerateNativePtr == 0) { + return -1; + } + Canvas canvas = new Canvas(bitmap); + if (generatingCacheBitmap == null) { + generatingCacheBitmap = Bitmap.createBitmap(metaData[0], metaData[1], Bitmap.Config.ARGB_8888); + } + getVideoFrame(cacheGenerateNativePtr, generatingCacheBitmap, metaData, generatingCacheBitmap.getRowBytes(), false, startTime, endTime); + if (cacheGenerateTimestamp != 0 && metaData[3] == 0) { + return 0; + } + bitmap.eraseColor(Color.TRANSPARENT); + canvas.save(); + float s = (float) renderingWidth / generatingCacheBitmap.getWidth(); + canvas.scale(s, s); + canvas.drawBitmap(generatingCacheBitmap, 0, 0, null); + canvas.restore(); + cacheGenerateTimestamp = metaData[3]; + return 1; + } + + @Override + public Bitmap getFirstFrame(Bitmap bitmap) { + Canvas canvas = new Canvas(bitmap); + if (generatingCacheBitmap == null) { + generatingCacheBitmap = Bitmap.createBitmap(metaData[0], metaData[1], Bitmap.Config.ARGB_8888); + } + + long nativePtr = createDecoder(path.getAbsolutePath(), metaData, currentAccount, streamFileSize, stream, false); + if (nativePtr == 0) { + return bitmap; + } + getVideoFrame(nativePtr, generatingCacheBitmap, metaData, generatingCacheBitmap.getRowBytes(), false, startTime, endTime); + destroyDecoder(nativePtr); + bitmap.eraseColor(Color.TRANSPARENT); + canvas.save(); + float s = (float) renderingWidth / generatingCacheBitmap.getWidth(); + canvas.scale(s, s); + canvas.drawBitmap(generatingCacheBitmap, 0, 0, null); + canvas.restore(); + + return bitmap; + } + + public boolean canLoadFrames() { + if (precache) { + return bitmapsCache != null; + } else { + return nativePtr != 0 || !decoderCreated; + } + } + + public void checkCacheExist() { + if (precache && bitmapsCache != null) { + bitmapsCache.cacheExist(); + } + } + + public void updateCurrentFrame(long now, boolean b) { + if (isRunning) { + if (renderingBitmap == null && nextRenderingBitmap == null) { + scheduleNextGetFrame(); + } else if (nextRenderingBitmap != null && (renderingBitmap == null || (Math.abs(now - lastFrameTime) >= invalidateAfter && !skipFrameUpdate))) { + if (precache) { + backgroundBitmap = renderingBitmap; + } + renderingBitmap = nextRenderingBitmap; + renderingBitmapTime = nextRenderingBitmapTime; + renderingShader = nextRenderingShader; + nextRenderingBitmap = null; + nextRenderingBitmapTime = 0; + nextRenderingShader = null; + lastFrameTime = now; + } + } else if (!isRunning && decodeSingleFrame && Math.abs(now - lastFrameTime) >= invalidateAfter && nextRenderingBitmap != null) { + if (precache) { + backgroundBitmap = renderingBitmap; + } + renderingBitmap = nextRenderingBitmap; + renderingBitmapTime = nextRenderingBitmapTime; + renderingShader = nextRenderingShader; + nextRenderingBitmap = null; + nextRenderingBitmapTime = 0; + nextRenderingShader = null; + lastFrameTime = now; + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFloat.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFloat.java index 0ae45c1bb..61d4c8968 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFloat.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFloat.java @@ -3,6 +3,7 @@ package org.telegram.ui.Components; import android.animation.TimeInterpolator; import android.os.SystemClock; +import android.util.Log; import android.view.View; import androidx.core.math.MathUtils; @@ -12,6 +13,7 @@ import org.telegram.messenger.AndroidUtilities; public class AnimatedFloat { private View parent; + private Runnable invalidate; private float value; private float targetValue; private boolean firstSet; @@ -55,12 +57,39 @@ public class AnimatedFloat { this.firstSet = true; } + public AnimatedFloat(View parentToInvalidate, long transitionDelay, long transitionDuration, TimeInterpolator transitionInterpolator) { + this.parent = parentToInvalidate; + this.transitionDelay = transitionDelay; + this.transitionDuration = transitionDuration; + this.transitionInterpolator = transitionInterpolator; + this.firstSet = true; + } + + + public AnimatedFloat(Runnable invalidate) { + this.invalidate = invalidate; + this.firstSet = true; + } + + public AnimatedFloat(Runnable invalidate, long transitionDuration, TimeInterpolator transitionInterpolator) { + this.invalidate = invalidate; + this.transitionDuration = transitionDuration; + this.transitionInterpolator = transitionInterpolator; + this.firstSet = true; + } + public AnimatedFloat(float initialValue, View parentToInvalidate) { this.parent = parentToInvalidate; this.value = targetValue = initialValue; this.firstSet = false; } + public AnimatedFloat(float initialValue, Runnable invalidate) { + this.invalidate = invalidate; + this.value = targetValue = initialValue; + this.firstSet = false; + } + public AnimatedFloat(float initialValue, View parentToInvalidate, long transitionDelay, long transitionDuration, TimeInterpolator transitionInterpolator) { this.parent = parentToInvalidate; this.value = targetValue = initialValue; @@ -70,10 +99,22 @@ public class AnimatedFloat { this.firstSet = false; } + public AnimatedFloat(float initialValue, Runnable invalidate, long transitionDelay, long transitionDuration, TimeInterpolator transitionInterpolator) { + this.invalidate = invalidate; + this.value = targetValue = initialValue; + this.transitionDelay = transitionDelay; + this.transitionDuration = transitionDuration; + this.transitionInterpolator = transitionInterpolator; + this.firstSet = false; + } + public float get() { return value; } + // set() must be called inside onDraw/dispatchDraw + // the main purpose of AnimatedFloat is to interpolate between abrupt changing states + public float set(float mustBe) { return this.set(mustBe, false); } @@ -93,17 +134,42 @@ public class AnimatedFloat { if (transition) { final float t = MathUtils.clamp((now - transitionStart - transitionDelay) / (float) transitionDuration, 0, 1); if (now - transitionStart >= transitionDelay) { - value = AndroidUtilities.lerp(startValue, targetValue, transitionInterpolator.getInterpolation(t)); + if (transitionInterpolator == null) { + value = AndroidUtilities.lerp(startValue, targetValue, t); + } else { + value = AndroidUtilities.lerp(startValue, targetValue, transitionInterpolator.getInterpolation(t)); + } } if (t >= 1f) { transition = false; - } else if (parent != null) { - parent.invalidate(); + } else { + if (parent != null) { + parent.invalidate(); + } + if (invalidate != null) { + invalidate.run(); + } } } return value; } + public float getTransitionProgress() { + if (!transition) { + return 0; + } + final long now = SystemClock.elapsedRealtime(); + return MathUtils.clamp((now - transitionStart - transitionDelay) / (float) transitionDuration, 0, 1); + } + + public float getTransitionProgressInterpolated() { + if (transitionInterpolator != null) { + return transitionInterpolator.getInterpolation(getTransitionProgress()); + } else { + return getTransitionProgress(); + } + } + public void setParent(View parent) { this.parent = parent; } 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 12ea45e1c..2a5acf1c2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java @@ -8,6 +8,7 @@ import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Typeface; @@ -17,7 +18,6 @@ import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; @@ -35,7 +35,7 @@ public class AnimatedTextView extends View { public static class AnimatedTextDrawable extends Drawable { - private TextPaint textPaint = new TextPaint(); + private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); private int gravity = 0; private boolean isRTL = false; @@ -113,10 +113,10 @@ public class AnimatedTextView extends View { x = lwidth - x - currentLayout[i].getWidth(); x -= fullWidth - lwidth; } - if ((gravity & Gravity.RIGHT) > 0) { - x += fullWidth - lwidth; - } else if ((gravity & Gravity.CENTER_HORIZONTAL) > 0) { + if ((gravity & Gravity.CENTER_HORIZONTAL) > 0) { x += (fullWidth - lwidth) / 2f; + } else if ((gravity & Gravity.RIGHT) > 0) { + x += fullWidth - lwidth; } canvas.translate(x, y); currentLayout[i].draw(canvas); @@ -135,10 +135,10 @@ public class AnimatedTextView extends View { x = oldWidth - x - oldLayout[i].getWidth(); x -= fullWidth - oldWidth; } - if ((gravity & Gravity.RIGHT) > 0) { - x += fullWidth - oldWidth; - } else if ((gravity & Gravity.CENTER_HORIZONTAL) > 0) { + if ((gravity & Gravity.CENTER_HORIZONTAL) > 0) { x += (fullWidth - oldWidth) / 2f; + } else if ((gravity & Gravity.RIGHT) > 0) { + x += fullWidth - oldWidth; } canvas.translate(x, y); oldLayout[i].draw(canvas); @@ -155,10 +155,10 @@ public class AnimatedTextView extends View { x = currentWidth - x - currentLayout[i].getWidth(); x -= fullWidth - currentWidth; } - if ((gravity & Gravity.RIGHT) > 0) { - x += fullWidth - currentWidth; - } else if ((gravity & Gravity.CENTER_HORIZONTAL) > 0) { + if ((gravity & Gravity.CENTER_HORIZONTAL) > 0) { x += (fullWidth - currentWidth) / 2f; + } else if ((gravity & Gravity.RIGHT) > 0) { + x += fullWidth - currentWidth; } canvas.translate(x, 0); currentLayout[i].draw(canvas); @@ -169,6 +169,12 @@ public class AnimatedTextView extends View { canvas.restore(); } + public void cancelAnimation() { + if (animator != null) { + animator.cancel(); + } + } + public boolean isAnimating() { return animator != null && animator.isRunning(); } @@ -589,7 +595,7 @@ public class AnimatedTextView extends View { if (alen == blen && equal) { // equal part on [astart, a) onEqualPart.run(newText.subSequence(astart, a), astart, a); - } else if (!equal) { + } else { if (alen > 0) { // new part on [astart, a) onNewPart.run(newText.subSequence(astart, a), astart, a); @@ -731,6 +737,14 @@ public class AnimatedTextView extends View { setText(text, animated, true); } + public void cancelAnimation() { + drawable.cancelAnimation(); + } + + public boolean isAnimating() { + return drawable.isAnimating(); + } + private boolean first = true; public void setText(CharSequence text, boolean animated, boolean moveDown) { animated = !first && animated; @@ -743,11 +757,15 @@ public class AnimatedTextView extends View { int wasWidth = drawable.getWidth(); drawable.setBounds(getPaddingLeft(), getPaddingTop(), lastMaxWidth - getPaddingRight(), getMeasuredHeight() - getPaddingBottom()); drawable.setText(text, animated, moveDown); - if (wasWidth < drawable.getWidth()) { + if (wasWidth < drawable.getWidth() || !animated && wasWidth != drawable.getWidth()) { requestLayout(); } } + public int width() { + return getPaddingLeft() + drawable.getCurrentWidth() + getPaddingRight(); + } + public CharSequence getText() { return drawable.getText(); } @@ -772,6 +790,10 @@ public class AnimatedTextView extends View { drawable.setAnimationProperties(moveAmplitude, startDelay, duration, interpolator); } + public AnimatedTextDrawable getDrawable() { + return drawable; + } + public TextPaint getPaint() { return drawable.getPaint(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java index 599f26973..558eca44d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java @@ -57,7 +57,6 @@ import com.google.android.exoplayer2.C; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; @@ -1442,7 +1441,7 @@ public class AudioPlayerAlert extends BottomSheet implements NotificationCenter. intent.setType(messageObject.getMimeType()); if (Build.VERSION.SDK_INT >= 24) { try { - intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(ApplicationLoader.applicationContext, BuildConfig.APPLICATION_ID + ".provider", f)); + intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(ApplicationLoader.applicationContext, ApplicationLoader.getApplicationId() + ".provider", f)); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (Exception ignore) { intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java index b796034eb..5fbdf71ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlockingUpdateView.java @@ -27,7 +27,6 @@ import androidx.core.content.FileProvider; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; @@ -246,7 +245,7 @@ public class BlockingUpdateView extends FrameLayout implements NotificationCente intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (Build.VERSION.SDK_INT >= 24) { - intent.setDataAndType(FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", f), "application/vnd.android.package-archive"); + intent.setDataAndType(FileProvider.getUriForFile(activity, ApplicationLoader.getApplicationId() + ".provider", f), "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java index 9acadf259..604c61107 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java @@ -69,6 +69,7 @@ public class BotCommandsMenuContainer extends FrameLayout implements NestedScrol super.dispatchDraw(canvas); } }; + listView.setOverScrollMode(OVER_SCROLL_NEVER); listView.setClipToPadding(false); addView(listView); updateColors(); @@ -239,7 +240,7 @@ public class BotCommandsMenuContainer extends FrameLayout implements NestedScrol } public void updateColors() { - topBackground.setColor(Theme.getColor(Theme.key_dialogGrayLine)); + topBackground.setColor(Theme.getColor(Theme.key_sheet_scrollUp)); backgroundPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); shadowDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhite), PorterDuff.Mode.MULTIPLY)); invalidate(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java index b3636f36a..93b5888fb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java @@ -90,16 +90,14 @@ public class BotCommandsMenuView extends View { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - - webViewAnimation.addParentView(this); + webViewAnimation.setMasterParent(this); webViewAnimation.setCurrentParentView(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - - webViewAnimation.removeParentView(this); + webViewAnimation.setMasterParent(this); } public void setWebView(boolean webView) { @@ -299,9 +297,6 @@ public class BotCommandsMenuView extends View { if (isWebView) { if (isWebViewOpened != opened) { RLottieDrawable drawable = webViewAnimation; - if (!drawable.hasParentView()) { - drawable.addParentView(this); - } drawable.stop(); drawable.setPlayInDirectionOfCustomEndFrame(true); drawable.setCustomEndFrame(opened ? drawable.getFramesCount() : 1); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java index 2a84f4436..35d549396 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java @@ -42,11 +42,14 @@ import androidx.annotation.RequiresApi; import androidx.core.graphics.ColorUtils; import androidx.core.util.Consumer; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BotWebViewVibrationEffect; +import org.telegram.messenger.ContactsController; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; @@ -55,7 +58,9 @@ import org.telegram.messenger.MediaDataController; 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.UserObject; import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; @@ -70,13 +75,18 @@ import org.telegram.ui.Components.voip.CellFlickerDrawable; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; public class BotWebViewContainer extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { private final static String DURGER_KING_USERNAME = "DurgerKingBot"; private final static int REQUEST_CODE_WEB_VIEW_FILE = 3000, REQUEST_CODE_WEB_PERMISSION = 4000; + private final static int DIALOG_SEQUENTIAL_COOLDOWN_TIME = 3000; + private final static boolean ENABLE_REQUEST_PHONE = false; private final static List WHITELISTED_SCHEMES = Arrays.asList("http", "https"); @@ -120,6 +130,11 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent private String currentPaymentSlug; + private AlertDialog currentDialog; + private int dialogSequentialOpenTimes; + private long lastDialogClosed; + private long lastDialogCooldownTime; + public BotWebViewContainer(@NonNull Context context, Theme.ResourcesProvider resourcesProvider, int backgroundColor) { super(context); this.resourcesProvider = resourcesProvider; @@ -844,6 +859,7 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent removeView(webView); } webView.destroy(); + isPageLoaded = false; } } @@ -909,11 +925,161 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent delegate.onCloseRequested(null); break; } + case "web_app_request_phone": { + if (currentDialog != null || !ENABLE_REQUEST_PHONE) { + break; + } + + AtomicBoolean notifiedPhone = new AtomicBoolean(false); + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()) + .setTitle(LocaleController.getString(R.string.ShareYouPhoneNumberTitle)) + .setMessage(LocaleController.getString(R.string.AreYouSureShareMyContactInfoBot)) + .setPositiveButton(LocaleController.getString("ShareContact", R.string.ShareContact), (dialogInterface, i) -> { + TLRPC.User currentUser = UserConfig.getInstance(currentAccount).getCurrentUser(); + if (currentUser != null) { + try { + notifyEvent("phone_requested", new JSONObject().put("phone_number", currentUser.phone)); + } catch (JSONException e) { + FileLog.e(e); + } + notifiedPhone.set(true); + } + }).setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null) + .setOnDismissListener(dialog1 -> { + if (!notifiedPhone.get()) { + notifyEvent("phone_requested", new JSONObject()); + } + currentDialog = null; + }); + currentDialog = builder.show(); + + break; + } + case "web_app_open_popup": { + try { + if (currentDialog != null) { + break; + } + + if (System.currentTimeMillis() - lastDialogClosed <= 150) { + dialogSequentialOpenTimes++; + + if (dialogSequentialOpenTimes >= 3) { + dialogSequentialOpenTimes = 0; + lastDialogCooldownTime = System.currentTimeMillis(); + break; + } + } + + if (System.currentTimeMillis() - lastDialogCooldownTime <= DIALOG_SEQUENTIAL_COOLDOWN_TIME) { + break; + } + + JSONObject jsonObject = new JSONObject(eventData); + String title = jsonObject.optString("title", null); + String message = jsonObject.getString("message"); + JSONArray buttons = jsonObject.getJSONArray("buttons"); + + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()) + .setTitle(title) + .setMessage(message); + + List buttonsList = new ArrayList<>(); + for (int i = 0; i < buttons.length(); i++) { + buttonsList.add(new PopupButton(buttons.getJSONObject(i))); + } + if (buttonsList.size() > 3) { + break; + } + + AtomicBoolean notifiedClose = new AtomicBoolean(); + if (buttonsList.size() >= 1) { + PopupButton btn = buttonsList.get(0); + builder.setPositiveButton(btn.text, (dialog, which) -> { + dialog.dismiss(); + try { + notifyEvent("popup_closed", new JSONObject().put("button_id", btn.id)); + notifiedClose.set(true); + } catch (JSONException e) { + FileLog.e(e); + } + }); + } + + if (buttonsList.size() >= 2) { + PopupButton btn = buttonsList.get(1); + builder.setNegativeButton(btn.text, (dialog, which) -> { + dialog.dismiss(); + try { + notifyEvent("popup_closed", new JSONObject().put("button_id", btn.id)); + notifiedClose.set(true); + } catch (JSONException e) { + FileLog.e(e); + } + }); + } + + if (buttonsList.size() == 3) { + PopupButton btn = buttonsList.get(2); + builder.setNeutralButton(btn.text, (dialog, which) -> { + dialog.dismiss(); + try { + notifyEvent("popup_closed", new JSONObject().put("button_id", btn.id)); + notifiedClose.set(true); + } catch (JSONException e) { + FileLog.e(e); + } + }); + } + builder.setOnDismissListener(dialog -> { + if (!notifiedClose.get()) { + notifyEvent("popup_closed", new JSONObject()); + } + currentDialog = null; + lastDialogClosed = System.currentTimeMillis(); + }); + + currentDialog = builder.show(); + if (buttonsList.size() >= 1) { + PopupButton btn = buttonsList.get(0); + if (btn.textColorKey != null) { + TextView textView = (TextView) currentDialog.getButton(AlertDialog.BUTTON_POSITIVE); + textView.setTextColor(getColor(btn.textColorKey)); + } + } + if (buttonsList.size() >= 2) { + PopupButton btn = buttonsList.get(1); + if (btn.textColorKey != null) { + TextView textView = (TextView) currentDialog.getButton(AlertDialog.BUTTON_NEGATIVE); + textView.setTextColor(getColor(btn.textColorKey)); + } + } + if (buttonsList.size() == 3) { + PopupButton btn = buttonsList.get(2); + if (btn.textColorKey != null) { + TextView textView = (TextView) currentDialog.getButton(AlertDialog.BUTTON_NEUTRAL); + textView.setTextColor(getColor(btn.textColorKey)); + } + } + } catch (JSONException e) { + FileLog.e(e); + } + break; + } + case "web_app_setup_closing_behavior": { + try { + JSONObject jsonObject = new JSONObject(eventData); + delegate.onWebAppSetupClosingBehavior(jsonObject.optBoolean("need_confirmation")); + } catch (JSONException e) { + FileLog.e(e); + } + break; + } case "web_app_set_background_color": { try { JSONObject jsonObject = new JSONObject(eventData); - delegate.onWebAppSetBackgroundColor(Color.parseColor(jsonObject.optString("color")) | 0xFF000000); - } catch (JSONException e) { + delegate.onWebAppSetBackgroundColor(Color.parseColor(jsonObject.optString("color", "#ffffff")) | 0xFF000000); + } catch (JSONException | IllegalArgumentException e) { FileLog.e(e); } break; @@ -1187,6 +1353,13 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent */ void onCloseRequested(@Nullable Runnable callback); + /** + * Called when WebView requests to change closing behavior + * + * @param needConfirmation If confirmation popup should be shown + */ + void onWebAppSetupClosingBehavior(boolean needConfirmation); + /** * Called when WebView requests to send custom data * @@ -1236,4 +1409,45 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent */ default void onWebAppReady() {} } + + public final static class PopupButton { + public String id; + public String text; + @Nullable + public String textColorKey; + + public PopupButton(JSONObject obj) throws JSONException { + id = obj.getString("id"); + String type = obj.getString("type"); + boolean textRequired = false; + switch (type) { + default: + case "default": { + textRequired = true; + break; + } + case "ok": { + text = LocaleController.getString(R.string.OK); + break; + } + case "close": { + text = LocaleController.getString(R.string.Close); + break; + } + case "cancel": { + text = LocaleController.getString(R.string.Cancel); + break; + } + case "destructive": { + textRequired = true; + textColorKey = Theme.key_dialogTextRed; + break; + } + } + + if (textRequired) { + text = obj.getString("text"); + } + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java index a8631ddfe..58fe9dfdb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java @@ -13,6 +13,7 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.graphics.ColorUtils; @@ -22,6 +23,7 @@ import androidx.recyclerview.widget.ChatListItemAnimator; import org.json.JSONObject; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ContactsController; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; @@ -35,6 +37,7 @@ import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.ActionBarMenuSubItem; +import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; import org.telegram.ui.PaymentFormActivity; @@ -96,6 +99,8 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification private int overrideActionBarBackground; private boolean overrideBackgroundColor; + private boolean needCloseConfirmation; + private Runnable pollRunnable = () -> { if (!dismissed) { TLRPC.TL_messages_prolongWebView prolongWebView = new TLRPC.TL_messages_prolongWebView(); @@ -137,6 +142,11 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification dismiss(callback); } + @Override + public void onWebAppSetupClosingBehavior(boolean needConfirmation) { + BotWebViewMenuContainer.this.needCloseConfirmation = needConfirmation; + } + @Override public void onWebAppSetActionBarColor(String colorKey) { int from = overrideActionBarBackground; @@ -292,7 +302,11 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification }); swipeContainer.setScrollEndListener(()-> webViewContainer.invalidateViewPortHeight(true)); swipeContainer.addView(webViewContainer); - swipeContainer.setDelegate(this::dismiss); + swipeContainer.setDelegate(() -> { + if (!onCheckDismissByUser()) { + swipeContainer.stickTo(0); + } + }); swipeContainer.setTopActionBarOffsetY(ActionBar.getCurrentActionBarHeight() + AndroidUtilities.statusBarHeight - AndroidUtilities.dp(24)); swipeContainer.setSwipeOffsetAnimationDisallowed(true); swipeContainer.setIsKeyboardVisible(obj -> parentEnterView.getSizeNotifierLayout().getKeyboardHeight() >= AndroidUtilities.dp(20)); @@ -343,7 +357,39 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification } public boolean onBackPressed() { - return webViewContainer.onBackPressed(); + if (webViewContainer.onBackPressed()) { + return true; + } + + if (getVisibility() == VISIBLE) { + onCheckDismissByUser(); + return true; + } + + return false; + } + + public boolean onCheckDismissByUser() { + if (needCloseConfirmation) { + String botName = null; + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(botId); + if (user != null) { + botName = ContactsController.formatName(user.first_name, user.last_name); + } + AlertDialog dialog = new AlertDialog.Builder(getContext()) + .setTitle(botName) + .setMessage(LocaleController.getString(R.string.BotWebViewChangesMayNotBeSaved)) + .setPositiveButton(LocaleController.getString(R.string.BotWebViewCloseAnyway), (dialog2, which) -> dismiss()) + .setNegativeButton(LocaleController.getString(R.string.Cancel), null) + .create(); + dialog.show(); + TextView textView = (TextView) dialog.getButton(AlertDialog.BUTTON_POSITIVE); + textView.setTextColor(getColor(Theme.key_dialogTextRed)); + return false; + } else { + dismiss(); + return true; + } } private void animateBotButton(boolean isVisible) { @@ -405,7 +451,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification public void onItemClick(int id) { if (id == -1) { if (!webViewContainer.onBackPressed()) { - dismiss(); + onCheckDismissByUser(); } } else if (id == R.id.menu_reload_page) { if (webViewContainer.getWebView() != null) { @@ -558,7 +604,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN && event.getY() <= AndroidUtilities.lerp(swipeContainer.getTranslationY() + AndroidUtilities.dp(24), 0, actionBarTransitionProgress)) { - dismiss(); + onCheckDismissByUser(); return true; } return super.onTouchEvent(event); @@ -725,6 +771,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification public void onDismiss() { setVisibility(GONE); + needCloseConfirmation = false; overrideActionBarBackground = 0; overrideActionBarBackgroundProgress = 0; actionBarPaint.setColor(getColor(Theme.key_windowBackgroundWhite)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java index bf0566cf1..94cec5069 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java @@ -32,6 +32,7 @@ import androidx.dynamicanimation.animation.SpringForce; import org.json.JSONObject; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ContactsController; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; @@ -46,6 +47,7 @@ import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.ActionBarMenuSubItem; +import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; @@ -121,6 +123,8 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi private TextView mainButton; private RadialProgressView radialProgressView; + private boolean needCloseConfirmation; + private VerticalPositionAutoAnimator mainButtonAutoAnimator, radialProgressAutoAnimator; private Runnable pollRunnable = () -> { @@ -195,6 +199,11 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi dismiss(callback); } + @Override + public void onWebAppSetupClosingBehavior(boolean needConfirmation) { + BotWebViewSheet.this.needCloseConfirmation = needConfirmation; + } + @Override public void onSendWebViewData(String data) { if (queryId != 0 || sentWebViewData) { @@ -267,7 +276,9 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi OverlayActionBarLayoutDialog overlayActionBarLayoutDialog = new OverlayActionBarLayoutDialog(context, resourcesProvider); overlayActionBarLayoutDialog.show(); paymentFormActivity.setPaymentFormCallback(status -> { - overlayActionBarLayoutDialog.dismiss(); + if (status != PaymentFormActivity.InvoiceStatus.PENDING) { + overlayActionBarLayoutDialog.dismiss(); + } webViewContainer.onInvoiceStatusUpdate(slug, status.name().toLowerCase(Locale.ROOT)); }); @@ -388,7 +399,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN && (event.getY() <= AndroidUtilities.lerp(swipeContainer.getTranslationY() + AndroidUtilities.dp(24), 0, actionBarTransitionProgress) || event.getX() > swipeContainer.getRight() || event.getX() < swipeContainer.getLeft())) { - dismiss(); + onCheckDismissByUser(); return true; } return super.onTouchEvent(event); @@ -461,7 +472,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi @Override public void onItemClick(int id) { if (id == -1) { - dismiss(); + onCheckDismissByUser(); } } }); @@ -517,7 +528,11 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi lastSwipeTime = System.currentTimeMillis(); }); swipeContainer.setScrollEndListener(()-> webViewContainer.invalidateViewPortHeight(true)); - swipeContainer.setDelegate(this::dismiss); + swipeContainer.setDelegate(() -> { + if (!onCheckDismissByUser()) { + swipeContainer.stickTo(0); + } + }); swipeContainer.setTopActionBarOffsetY(ActionBar.getCurrentActionBarHeight() + AndroidUtilities.statusBarHeight - AndroidUtilities.dp(24)); swipeContainer.setIsKeyboardVisible(obj -> frameLayout.getKeyboardHeight() >= AndroidUtilities.dp(20)); @@ -645,7 +660,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi public void onItemClick(int id) { if (id == -1) { if (!webViewContainer.onBackPressed()) { - dismiss(); + onCheckDismissByUser(); } } else if (id == R.id.menu_open_bot) { Bundle bundle = new Bundle(); @@ -813,7 +828,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi if (webViewContainer.onBackPressed()) { return; } - super.onBackPressed(); + onCheckDismissByUser(); } @Override @@ -821,6 +836,30 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi dismiss(null); } + public boolean onCheckDismissByUser() { + if (needCloseConfirmation) { + String botName = null; + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(botId); + if (user != null) { + botName = ContactsController.formatName(user.first_name, user.last_name); + } + + AlertDialog dialog = new AlertDialog.Builder(getContext()) + .setTitle(botName) + .setMessage(LocaleController.getString(R.string.BotWebViewChangesMayNotBeSaved)) + .setPositiveButton(LocaleController.getString(R.string.BotWebViewCloseAnyway), (dialog2, which) -> dismiss()) + .setNegativeButton(LocaleController.getString(R.string.Cancel), null) + .create(); + dialog.show(); + TextView textView = (TextView) dialog.getButton(AlertDialog.BUTTON_POSITIVE); + textView.setTextColor(getColor(Theme.key_dialogTextRed)); + return false; + } else { + dismiss(); + return true; + } + } + public void dismiss(Runnable callback) { if (dismissed) { return; 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 e4af3851c..277db70ec 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomSheetWithRecyclerListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomSheetWithRecyclerListView.java @@ -233,6 +233,10 @@ public abstract class BottomSheetWithRecyclerListView extends BottomSheet { return false; } + public BaseFragment getBaseFragment() { + return baseFragment; + } + private void updateStatusBar() { if (actionBar != null && actionBar.getTag() != null) { AndroidUtilities.setLightStatusBar(getWindow(), isLightStatusBar()); 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 99b9713a6..c18394110 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java @@ -44,6 +44,7 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; 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.ChatActivity; @@ -187,11 +188,11 @@ public class Bulletin { } if (isTransitionsEnabled()) { ensureLayoutTransitionCreated(); - layout.transitionRunning = true; + layout.transitionRunningEnter = true; layout.delegate = currentDelegate; layout.invalidate(); layoutTransition.animateEnter(layout, layout::onEnterTransitionStart, () -> { - layout.transitionRunning = false; + layout.transitionRunningEnter = false; layout.onEnterTransitionEnd(); setCanHide(true); }, offset -> { @@ -270,7 +271,7 @@ public class Bulletin { if (ViewCompat.isLaidOut(layout)) { layout.removeCallbacks(hideRunnable); if (animated) { - layout.transitionRunning = true; + layout.transitionRunningExit = true; layout.delegate = currentDelegate; layout.invalidate(); if (duration >= 0) { @@ -285,7 +286,7 @@ public class Bulletin { currentDelegate.onOffsetChange(0); currentDelegate.onHide(this); } - layout.transitionRunning = false; + layout.transitionRunningExit = false; layout.onExitTransitionEnd(); layout.onHide(); containerLayout.removeView(parentLayout); @@ -508,13 +509,18 @@ public class Bulletin { public abstract static class Layout extends FrameLayout { private final List callbacks = new ArrayList<>(); - public boolean transitionRunning; + public boolean transitionRunningEnter; + public boolean transitionRunningExit; Delegate delegate; public float inOutOffset; protected Bulletin bulletin; Drawable background; + public boolean isTransitionRunning() { + return transitionRunningEnter || transitionRunningExit; + } + @WidthDef private int wideScreenWidth = ViewGroup.LayoutParams.WRAP_CONTENT; @GravityDef @@ -850,9 +856,12 @@ public class Bulletin { @Override protected void dispatchDraw(Canvas canvas) { + if (bulletin == null) { + return; + } background.setBounds(AndroidUtilities.dp(8), AndroidUtilities.dp(8), getMeasuredWidth() - AndroidUtilities.dp(8), getMeasuredHeight() - AndroidUtilities.dp(8)); - if (transitionRunning && delegate != null) { - int clipBottom = ((View)getParent()).getMeasuredHeight() - delegate.getBottomOffset(bulletin.tag); + if (isTransitionRunning() && delegate != null) { + int clipBottom = ((View) getParent()).getMeasuredHeight() - delegate.getBottomOffset(bulletin.tag); int viewBottom = (int) (getY() + getMeasuredHeight()); canvas.save(); canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - (viewBottom - clipBottom)); @@ -1087,14 +1096,15 @@ public class Bulletin { imageView.setScaleType(ImageView.ScaleType.CENTER); addView(imageView, LayoutHelper.createFrameRelatively(56, 48, Gravity.START | Gravity.CENTER_VERTICAL)); - textView = new TextView(context); + textView = new LinkSpanDrawable.LinksTextView(context); textView.setSingleLine(); textView.setTypeface(Typeface.SANS_SERIF); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setPadding(0, AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8)); - addView(textView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 56, 0, 16, 0)); + addView(textView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 56, 0, 8, 0)); + textView.setLinkTextColor(getThemedColor(Theme.key_undo_cancelColor)); setTextColor(getThemedColor(Theme.key_undo_infoColor)); setBackground(getThemedColor(Theme.key_undo_background)); } @@ -1127,6 +1137,13 @@ public class Bulletin { } } + public void setAnimation(TLRPC.Document document, int w, int h, String... layers) { + imageView.setAnimation(document, w, h); + for (String layer : layers) { + imageView.setLayerColor(layer + ".**", textColor); + } + } + public void setIconPaddingBottom(int paddingBottom) { imageView.setLayoutParams(LayoutHelper.createFrameRelatively(56, 48 - paddingBottom, Gravity.START | Gravity.CENTER_VERTICAL, 0, 0, 0, paddingBottom)); } 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 9cbf175b5..0c164048b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java @@ -3,18 +3,29 @@ package org.telegram.ui.Components; import android.app.DownloadManager; import android.content.Context; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.style.ClickableSpan; +import android.util.TypedValue; import android.view.HapticFeedbackConstants; +import android.view.View; import android.widget.FrameLayout; import androidx.annotation.CheckResult; +import androidx.annotation.NonNull; import androidx.core.content.FileProvider; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildConfig; import org.telegram.messenger.DialogObject; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationsController; import org.telegram.messenger.R; @@ -23,6 +34,7 @@ import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.PremiumPreviewFragment; import java.io.File; @@ -148,6 +160,51 @@ public final class BulletinFactory { return create(layout, Bulletin.DURATION_SHORT); } + public Bulletin createSimpleBulletin(int iconRawId, CharSequence text, CharSequence button, Runnable onButtonClick) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), resourcesProvider); + layout.setAnimation(iconRawId, 36, 36); + layout.textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(3); + layout.textView.setText(text); + layout.setButton(new Bulletin.UndoButton(getContext(), true, resourcesProvider).setText(button).setUndoAction(onButtonClick)); + return create(layout, Bulletin.DURATION_SHORT); + } + + public Bulletin createSimpleBulletin(Drawable drawable, CharSequence text, String button, Runnable onButtonClick) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), resourcesProvider); + layout.imageView.setImageDrawable(drawable); + layout.textView.setText(text); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(2); + layout.setButton(new Bulletin.UndoButton(getContext(), true, resourcesProvider).setText(button).setUndoAction(onButtonClick)); + return create(layout, Bulletin.DURATION_LONG); + } + + public Bulletin createEmojiBulletin(String emoji, String text) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), resourcesProvider); + layout.setAnimation(MediaDataController.getInstance(UserConfig.selectedAccount).getEmojiAnimatedSticker(emoji), 36, 36); + layout.textView.setText(text); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(2); + return create(layout, Bulletin.DURATION_LONG); + } + + public Bulletin createEmojiBulletin(String emoji, String text, String button, Runnable onButtonClick) { + return createEmojiBulletin(MediaDataController.getInstance(UserConfig.selectedAccount).getEmojiAnimatedSticker(emoji), text, button, onButtonClick); + } + + public Bulletin createEmojiBulletin(TLRPC.Document document, CharSequence text, CharSequence button, Runnable onButtonClick) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), resourcesProvider); + layout.setAnimation(document, 36, 36); + layout.textView.setText(text); + layout.textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(3); + layout.setButton(new Bulletin.UndoButton(getContext(), true, resourcesProvider).setText(button).setUndoAction(onButtonClick)); + return create(layout, Bulletin.DURATION_LONG); + } + @CheckResult public Bulletin createDownloadBulletin(FileType fileType) { return createDownloadBulletin(fileType, resourcesProvider); @@ -204,6 +261,31 @@ public final class BulletinFactory { return create(layout, Bulletin.DURATION_SHORT); } + public Bulletin createRestrictVoiceMessagesPremiumBulletin() { + Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), null); + layout.setAnimation(R.raw.voip_muted); + String str = LocaleController.getString(R.string.PrivacyVoiceMessagesPremiumOnly); + SpannableStringBuilder spannable = new SpannableStringBuilder(str); + int indexStart = str.indexOf('*'), indexEnd = str.lastIndexOf('*'); + spannable.replace(indexStart, indexEnd + 1, str.substring(indexStart + 1, indexEnd)); + spannable.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull View widget) { + fragment.presentFragment(new PremiumPreviewFragment("settings")); + } + + @Override + public void updateDrawState(@NonNull TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + } + }, indexStart, indexEnd - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + layout.textView.setText(spannable); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(2); + return create(layout, Bulletin.DURATION_LONG); + } + public Bulletin createErrorBulletinSubtitle(CharSequence errorMessage, CharSequence errorDescription, Theme.ResourcesProvider resourcesProvider) { Bulletin.TwoLineLottieLayout layout = new Bulletin.TwoLineLottieLayout(getContext(), resourcesProvider); layout.setAnimation(R.raw.chats_infotip); @@ -396,6 +478,40 @@ public final class BulletinFactory { return Bulletin.make(fragment, layout, Bulletin.DURATION_SHORT); } + @CheckResult + public static Bulletin createInviteSentBulletin(Context context, FrameLayout containerLayout, int dialogsCount, long did, int messagesCount, int backgroundColor, int textColor) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(context, null, backgroundColor, textColor); + CharSequence text; + int hapticDelay = -1; + if (dialogsCount <= 1) { + if (did == UserConfig.getInstance(UserConfig.selectedAccount).clientUserId) { + text = AndroidUtilities.replaceTags(LocaleController.getString("InvLinkToSavedMessages", R.string.InvLinkToSavedMessages)); + layout.setAnimation(R.raw.saved_messages, 30, 30); + } else { + if (DialogObject.isChatDialog(did)) { + TLRPC.Chat chat = MessagesController.getInstance(UserConfig.selectedAccount).getChat(-did); + text = AndroidUtilities.replaceTags(LocaleController.formatString("InvLinkToGroup", R.string.InvLinkToGroup, chat.title)); + } else { + TLRPC.User user = MessagesController.getInstance(UserConfig.selectedAccount).getUser(did); + text = AndroidUtilities.replaceTags(LocaleController.formatString("InvLinkToUser", R.string.InvLinkToUser, UserObject.getFirstName(user))); + } + layout.setAnimation(R.raw.forward, 30, 30); + hapticDelay = 300; + } + } else { + text = AndroidUtilities.replaceTags(LocaleController.formatString("InvLinkToChats", R.string.InvLinkToChats, LocaleController.formatPluralString("Chats", dialogsCount))); + layout.setAnimation(R.raw.forward, 30, 30); + hapticDelay = 300; + } + layout.textView.setText(text); + if (hapticDelay > 0) { + layout.postDelayed(() -> { + layout.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + }, hapticDelay); + } + return Bulletin.make(containerLayout, layout, Bulletin.DURATION_SHORT); + } + @CheckResult public static Bulletin createForwardedBulletin(Context context, FrameLayout containerLayout, int dialogsCount, long did, int messagesCount, int backgroundColor, int textColor) { final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(context, null, backgroundColor, textColor); 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 dd9115d60..ad073ad25 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -47,6 +47,7 @@ import android.os.Vibrator; import android.text.Editable; import android.text.Layout; import android.text.Spannable; +import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.StaticLayout; @@ -131,15 +132,19 @@ import org.telegram.ui.ActionBar.ActionBarMenuSubItem; import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.AdjustPanLayoutHelper; import org.telegram.ui.ActionBar.AlertDialog; +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.BasePermissionsActivity; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.ContentPreviewViewer; import org.telegram.ui.DialogsActivity; import org.telegram.ui.GroupStickersActivity; import org.telegram.ui.LaunchActivity; import org.telegram.ui.PhotoViewer; +import org.telegram.ui.PremiumPreviewFragment; import org.telegram.ui.ProfileActivity; import org.telegram.ui.StickersActivity; @@ -154,6 +159,13 @@ import java.util.Locale; public class ChatActivityEnterView extends BlurredFrameLayout implements NotificationCenter.NotificationCenterDelegate, SizeNotifierFrameLayout.SizeNotifierFrameLayoutDelegate, StickersAlert.StickersAlertDelegate { public interface ChatActivityEnterViewDelegate { + + default void onEditTextScroll() {}; + + default void onContextMenuOpen() {}; + + default void onContextMenuClose() {}; + void onMessageSend(CharSequence message, boolean notify, int scheduleDate); void needSendTyping(); @@ -374,7 +386,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private ActionBarPopupWindow sendPopupWindow; private ActionBarPopupWindow.ActionBarPopupWindowLayout sendPopupLayout; private ImageView cancelBotButton; - private ImageView[] emojiButton = new ImageView[2]; + private ChatActivityEnterViewAnimatedIconView emojiButton; private ImageView expandStickersButton; private EmojiView emojiView; private AnimatorSet panelAnimation; @@ -382,10 +394,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private boolean botKeyboardViewVisible; private TimerView recordTimerView; private FrameLayout audioVideoButtonContainer; - private AnimatorSet audioVideoButtonAnimation; - private AnimatorSet emojiButtonAnimation; - private ImageView audioSendButton; - private ImageView videoSendButton; + private ChatActivityEnterViewAnimatedIconView audioVideoSendButton; + private boolean isInVideoMode; private FrameLayout recordPanel; private FrameLayout recordedAudioPanel; private VideoTimelineView videoTimelineView; @@ -443,7 +453,6 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private boolean hasRecordVideo; private int currentPopupContentType = -1; - private int currentEmojiIcon = -1; private boolean silent; private boolean canWriteToChannel; @@ -478,6 +487,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private boolean recordingAudioVideo; private int recordingGuid; private boolean forceShowSendButton; + private boolean allowAnimatedEmoji; private boolean allowStickers; private boolean allowGifs; @@ -632,7 +642,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific recordAudioVideoRunnableStarted = false; slideText.setAlpha(1.0f); slideText.setTranslationY(0); - if (videoSendButton != null && videoSendButton.getTag() != null) { + if (isInVideoMode()) { if (Build.VERSION.SDK_INT >= 23) { boolean hasAudio = parentActivity.checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED; boolean hasVideo = parentActivity.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; @@ -701,7 +711,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (playing) { drawable.start(); } - drawable.addParentView(this); + drawable.setMasterParent(this); } @Override @@ -709,7 +719,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific super.onDetachedFromWindow(); attachedToWindow = false; drawable.stop(); - drawable.removeParentView(this); + drawable.setMasterParent(null); } public RecordDot(Context context) { @@ -1028,7 +1038,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } else if (pressed) { if (event.getAction() == MotionEvent.ACTION_UP) { if (pauseRect.contains(x, y)) { - if (videoSendButton != null && videoSendButton.getTag() != null) { + if (isInVideoMode()) { delegate.needStartRecordVideo(3, true, 0); } else { MediaController.getInstance().stopRecording(2, true, 0); @@ -1185,11 +1195,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (progressToSendButton > 1f) { progressToSendButton = 1f; } - replaceDrawable = videoSendButton != null && videoSendButton.getTag() != null ? cameraDrawable : micDrawable; + replaceDrawable = isInVideoMode() ? cameraDrawable : micDrawable; } drawable = sendDrawable; } else { - drawable = videoSendButton != null && videoSendButton.getTag() != null ? cameraDrawable : micDrawable; + drawable = isInVideoMode() ? cameraDrawable : micDrawable; } sendRect.set(cx - drawable.getIntrinsicWidth() / 2, cy - drawable.getIntrinsicHeight() / 2, cx + drawable.getIntrinsicWidth() / 2, cy + drawable.getIntrinsicHeight() / 2); drawable.setBounds(sendRect); @@ -1495,11 +1505,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific Drawable replaceDrawable = null; if (isSendButtonVisible()) { if (progressToSendButton != 1f) { - replaceDrawable = videoSendButton != null && videoSendButton.getTag() != null ? cameraDrawable : micDrawable; + replaceDrawable = isInVideoMode() ? cameraDrawable : micDrawable; } drawable = sendDrawable; } else { - drawable = videoSendButton != null && videoSendButton.getTag() != null ? cameraDrawable : micDrawable; + drawable = isInVideoMode() ? cameraDrawable : micDrawable; } sendRect.set(cx - drawable.getIntrinsicWidth() / 2, cy - drawable.getIntrinsicHeight() / 2, cx + drawable.getIntrinsicWidth() / 2, cy + drawable.getIntrinsicHeight() / 2); drawable.setBounds(sendRect); @@ -1513,7 +1523,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private void drawIconInternal(Canvas canvas, Drawable drawable, Drawable replaceDrawable, float progressToSendButton, int alpha) { if (progressToSendButton == 0 || progressToSendButton == 1 || replaceDrawable == null) { if (canceledByGesture && slideToCancelProgress == 1f) { - View v = isInVideoMode() ? videoSendButton : audioSendButton; + View v = audioVideoSendButton; v.setAlpha(1f); setVisibility(View.GONE); return; @@ -1808,64 +1818,58 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific frameLayout.setClipChildren(false); textFieldContainer.addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM, 0, 0, 48, 0)); - for (int a = 0; a < 2; a++) { - emojiButton[a] = new ImageView(context) { - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (getTag() != null && attachLayout != null && !emojiViewVisible && !MediaDataController.getInstance(currentAccount).getUnreadStickerSets().isEmpty() && dotPaint != null) { - int x = getWidth() / 2 + AndroidUtilities.dp(4 + 5); - int y = getHeight() / 2 - AndroidUtilities.dp(13 - 5); - canvas.drawCircle(x, y, AndroidUtilities.dp(5), dotPaint); - } + emojiButton = new ChatActivityEnterViewAnimatedIconView(context) { + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (getTag() != null && attachLayout != null && !emojiViewVisible && !MediaDataController.getInstance(currentAccount).getUnreadStickerSets().isEmpty() && dotPaint != null) { + int x = getWidth() / 2 + AndroidUtilities.dp(4 + 5); + int y = getHeight() / 2 - AndroidUtilities.dp(13 - 5); + canvas.drawCircle(x, y, AndroidUtilities.dp(5), dotPaint); } - }; - emojiButton[a].setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY)); - emojiButton[a].setScaleType(ImageView.ScaleType.CENTER_INSIDE); - if (Build.VERSION.SDK_INT >= 21) { - emojiButton[a].setBackgroundDrawable(Theme.createSelectorDrawable(getThemedColor(Theme.key_listSelector))); - } - frameLayout.addView(emojiButton[a], LayoutHelper.createFrame(48, 48, Gravity.BOTTOM | Gravity.LEFT, 3, 0, 0, 0)); - emojiButton[a].setOnClickListener(view -> { - if (adjustPanLayoutHelper != null && adjustPanLayoutHelper.animationInProgress()) { - return; - } - if (hasBotWebView() && botCommandsMenuIsShowing()) { - botWebViewMenuContainer.dismiss(view::callOnClick); - return; - } - - if (!isPopupShowing() || currentPopupContentType != 0) { - showPopup(1, 0); - emojiView.onOpen(messageEditText.length() > 0); - } else { - if (searchingType != 0) { - setSearchingTypeInternal(0, true); - if (emojiView != null) { - emojiView.closeSearch(false); - } - messageEditText.requestFocus(); - } - if (stickersExpanded) { - setStickersExpanded(false, true, false); - waitingForKeyboardOpenAfterAnimation = true; - AndroidUtilities.runOnUIThread(() -> { - waitingForKeyboardOpenAfterAnimation = false; - openKeyboardInternal(); - }, 200); - } else { - openKeyboardInternal(); - } - } - }); - emojiButton[a].setContentDescription(LocaleController.getString("AccDescrEmojiButton", R.string.AccDescrEmojiButton)); - if (a == 1) { - emojiButton[a].setVisibility(INVISIBLE); - emojiButton[a].setAlpha(0.0f); - emojiButton[a].setScaleX(0.1f); - emojiButton[a].setScaleY(0.1f); } + }; + emojiButton.setContentDescription(LocaleController.getString(R.string.AccDescrEmojiButton)); + emojiButton.setFocusable(true); + int padding = AndroidUtilities.dp(9.5f); + emojiButton.setPadding(padding, padding, padding, padding); + emojiButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.SRC_IN)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + emojiButton.setBackground(Theme.createSelectorDrawable(getThemedColor(Theme.key_listSelector))); } + emojiButton.setOnClickListener(v -> { + if (adjustPanLayoutHelper != null && adjustPanLayoutHelper.animationInProgress()) { + return; + } + if (hasBotWebView() && botCommandsMenuIsShowing()) { + botWebViewMenuContainer.dismiss(v::callOnClick); + return; + } + + if (!isPopupShowing() || currentPopupContentType != 0) { + showPopup(1, 0); + emojiView.onOpen(messageEditText.length() > 0); + } else { + if (searchingType != 0) { + setSearchingTypeInternal(0, true); + if (emojiView != null) { + emojiView.closeSearch(false); + } + messageEditText.requestFocus(); + } + if (stickersExpanded) { + setStickersExpanded(false, true, false); + waitingForKeyboardOpenAfterAnimation = true; + AndroidUtilities.runOnUIThread(() -> { + waitingForKeyboardOpenAfterAnimation = false; + openKeyboardInternal(); + }, 200); + } else { + openKeyboardInternal(); + } + } + }); + frameLayout.addView(emojiButton, LayoutHelper.createFrame(48, 48, Gravity.BOTTOM | Gravity.LEFT, 3, 0, 0, 0)); setEmojiButtonImage(false, false); captionLimitView = new NumberTextView(context); @@ -1878,6 +1882,28 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific messageEditText = new EditTextCaption(context, resourcesProvider) { + @Override + protected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) { + super.onScrollChanged(horiz, vert, oldHoriz, oldVert); + if (delegate != null) { + delegate.onEditTextScroll(); + } + } + + @Override + protected void onContextMenuOpen() { + if (delegate != null) { + delegate.onContextMenuOpen(); + } + } + + @Override + protected void onContextMenuClose() { + if (delegate != null) { + delegate.onContextMenuClose(); + } + } + private void send(InputContentInfoCompat inputContentInfo, boolean notify, int scheduleDate) { ClipDescription description = inputContentInfo.getDescription(); if (description.hasMimeType("image/gif")) { @@ -1898,7 +1924,6 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } try { 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 { @@ -2103,6 +2128,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return resourcesProvider; } }; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + messageEditText.setFallbackLineSpacing(false); + } messageEditText.setDelegate(() -> { messageEditText.invalidateEffects(); if (delegate != null) { @@ -2224,6 +2252,21 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (ignorePrevTextChange) { return; } + + boolean allowChangeToSmile = true; + int currentPage; + if (emojiView == null) { + currentPage = MessagesController.getGlobalEmojiSettings().getInt("selected_page", 0); + } else { + currentPage = emojiView.getCurrentPage(); + } + if (currentPage == 0 || !allowStickers && !allowGifs) { + allowChangeToSmile = false; + } + + if ((before == 0 && !TextUtils.isEmpty(charSequence) || before != 0 && TextUtils.isEmpty(charSequence)) && allowChangeToSmile) { + setEmojiButtonImage(false, true); + } if (lineCount != messageEditText.getLineCount()) { if (!isInitLineCount && messageEditText.getMeasuredWidth() > 0) { onLineCountChanged(lineCount, messageEditText.getLineCount()); @@ -2281,7 +2324,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific for (int i = 0; i < spans.length; i++) { editable.removeSpan(spans[i]); } - Emoji.replaceEmoji(editable, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); + Emoji.replaceEmoji(editable, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false, null, true); processChange = false; } } @@ -3026,7 +3069,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (recordCircle.isSendButtonVisible()) { if (!hasRecordVideo || calledRecordRunnable) { startedDraggingX = -1; - if (hasRecordVideo && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { delegate.needStartRecordVideo(1, true, 0); } else { if (recordingAudioVideo && isInScheduleMode()) { @@ -3046,9 +3089,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } if (parentFragment != null) { TLRPC.Chat chat = parentFragment.getCurrentChat(); - if (chat != null && !ChatObject.canSendMedia(chat)) { + TLRPC.UserFull userFull = parentFragment.getCurrentUserInfo(); + if (chat != null && !ChatObject.canSendMedia(chat) || userFull != null && userFull.voice_messages_forbidden) { delegate.needShowMediaBanHint(); - return false; + return true; } } if (hasRecordVideo) { @@ -3062,7 +3106,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } else if (motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL) { if (motionEvent.getAction() == MotionEvent.ACTION_CANCEL && recordingAudioVideo) { if (recordCircle.slideToCancelProgress < 0.7f) { - if (hasRecordVideo && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable); delegate.needStartRecordVideo(2, true, 0); } else { @@ -3088,7 +3132,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific float dist = (x - startedDraggingX); float alpha = 1.0f + dist / distCanMove; if (alpha < 0.45) { - if (hasRecordVideo && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable); delegate.needStartRecordVideo(2, true, 0); } else { @@ -3100,13 +3144,13 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } else { if (recordAudioVideoRunnableStarted) { AndroidUtilities.cancelRunOnUIThread(recordAudioVideoRunnable); - delegate.onSwitchRecordMode(videoSendButton.getTag() == null); - setRecordVideoButtonVisible(videoSendButton.getTag() == null, true); + delegate.onSwitchRecordMode(!isInVideoMode()); + setRecordVideoButtonVisible(!isInVideoMode(), true); performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); } else if (!hasRecordVideo || calledRecordRunnable) { startedDraggingX = -1; - if (hasRecordVideo && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable); delegate.needStartRecordVideo(1, true, 0); } else { @@ -3160,7 +3204,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } if (alpha == 0) { - if (hasRecordVideo && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable); delegate.needStartRecordVideo(2, true, 0); } else { @@ -3176,29 +3220,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return true; }); - audioSendButton = new ImageView(context); - audioSendButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - audioSendButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY)); - audioSendButton.setImageResource(R.drawable.input_mic); - audioSendButton.setPadding(0, 0, AndroidUtilities.dp(4), 0); - audioSendButton.setContentDescription(LocaleController.getString("AccDescrVoiceMessage", R.string.AccDescrVoiceMessage)); - audioSendButton.setFocusable(true); - audioSendButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); - audioSendButton.setAccessibilityDelegate(mediaMessageButtonsDelegate); - audioVideoButtonContainer.addView(audioSendButton, LayoutHelper.createFrame(48, 48)); - - if (isChat) { - videoSendButton = new ImageView(context); - videoSendButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - videoSendButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY)); - videoSendButton.setImageResource(R.drawable.input_video); - videoSendButton.setPadding(0, 0, AndroidUtilities.dp(4), 0); - videoSendButton.setContentDescription(LocaleController.getString("AccDescrVideoMessage", R.string.AccDescrVideoMessage)); - videoSendButton.setFocusable(true); - videoSendButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); - videoSendButton.setAccessibilityDelegate(mediaMessageButtonsDelegate); - audioVideoButtonContainer.addView(videoSendButton, LayoutHelper.createFrame(48, 48)); - } + audioVideoSendButton = new ChatActivityEnterViewAnimatedIconView(context); + audioVideoSendButton.setContentDescription(LocaleController.getString("AccDescrVoiceMessage", R.string.AccDescrVoiceMessage)); + audioVideoSendButton.setFocusable(true); + audioVideoSendButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + audioVideoSendButton.setAccessibilityDelegate(mediaMessageButtonsDelegate); + padding = AndroidUtilities.dp(9.5f); + audioVideoSendButton.setPadding(padding, padding, padding, padding); + audioVideoSendButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.SRC_IN)); + audioVideoButtonContainer.addView(audioVideoSendButton, LayoutHelper.createFrame(48, 48)); recordCircle = new RecordCircle(context); recordCircle.setVisibility(GONE); @@ -3505,13 +3535,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public void setBotWebViewButtonOffsetX(float offset) { - for (ImageView imageView : emojiButton) { - imageView.setTranslationX(offset); - } + emojiButton.setTranslationX(offset); messageEditText.setTranslationX(offset); attachButton.setTranslationX(offset); - audioSendButton.setTranslationX(offset); - videoSendButton.setTranslationX(offset); + audioVideoSendButton.setTranslationX(offset); if (botButton != null) { botButton.setTranslationX(offset); } @@ -3746,14 +3773,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } private void setRecordVideoButtonVisible(boolean visible, boolean animated) { - if (videoSendButton == null) { + if (audioVideoSendButton == null) { return; } - videoSendButton.setTag(visible ? 1 : null); - if (audioVideoButtonAnimation != null) { - audioVideoButtonAnimation.cancel(); - audioVideoButtonAnimation = null; - } + isInVideoMode = visible; + if (animated) { SharedPreferences preferences = MessagesController.getGlobalMainSettings(); boolean isChannel = false; @@ -3761,35 +3785,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific TLRPC.Chat chat = accountInstance.getMessagesController().getChat(-dialog_id); isChannel = ChatObject.isChannel(chat) && !chat.megagroup; } - preferences.edit().putBoolean(isChannel ? "currentModeVideoChannel" : "currentModeVideo", visible).commit(); - audioVideoButtonAnimation = new AnimatorSet(); - audioVideoButtonAnimation.playTogether( - ObjectAnimator.ofFloat(videoSendButton, View.SCALE_X, visible ? 1.0f : 0.1f), - ObjectAnimator.ofFloat(videoSendButton, View.SCALE_Y, visible ? 1.0f : 0.1f), - ObjectAnimator.ofFloat(videoSendButton, View.ALPHA, visible ? 1.0f : 0.0f), - ObjectAnimator.ofFloat(audioSendButton, View.SCALE_X, visible ? 0.1f : 1.0f), - ObjectAnimator.ofFloat(audioSendButton, View.SCALE_Y, visible ? 0.1f : 1.0f), - ObjectAnimator.ofFloat(audioSendButton, View.ALPHA, visible ? 0.0f : 1.0f)); - audioVideoButtonAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (animation.equals(audioVideoButtonAnimation)) { - audioVideoButtonAnimation = null; - } - (videoSendButton.getTag() == null ? audioSendButton : videoSendButton).sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); - } - }); - audioVideoButtonAnimation.setInterpolator(new DecelerateInterpolator()); - audioVideoButtonAnimation.setDuration(150); - audioVideoButtonAnimation.start(); - } else { - videoSendButton.setScaleX(visible ? 1.0f : 0.1f); - videoSendButton.setScaleY(visible ? 1.0f : 0.1f); - videoSendButton.setAlpha(visible ? 1.0f : 0.0f); - audioSendButton.setScaleX(visible ? 0.1f : 1.0f); - audioSendButton.setScaleY(visible ? 0.1f : 1.0f); - audioSendButton.setAlpha(visible ? 0.0f : 1.0f); + preferences.edit().putBoolean(isChannel ? "currentModeVideoChannel" : "currentModeVideo", visible).apply(); } + audioVideoSendButton.setState(isInVideoMode() ? ChatActivityEnterViewAnimatedIconView.State.VIDEO : ChatActivityEnterViewAnimatedIconView.State.VOICE, animated); + audioVideoSendButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); } public boolean isRecordingAudioVideo() { @@ -3801,7 +3800,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public void cancelRecordingAudioVideo() { - if (hasRecordVideo && videoSendButton != null && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable); delegate.needStartRecordVideo(5, true, 0); } else { @@ -3899,33 +3898,27 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific checkSendButton(animated); } - public void setAllowStickersAndGifs(boolean value, boolean value2) { - setAllowStickersAndGifs(value, value2, false); + public void setAllowStickersAndGifs(boolean needAnimatedEmoji, boolean needStickers, boolean needGifs) { + setAllowStickersAndGifs(needAnimatedEmoji, needStickers, needGifs, false); } - public void setAllowStickersAndGifs(boolean value, boolean value2, boolean waitingForKeyboardOpen) { - if ((allowStickers != value || allowGifs != value2) && emojiView != null) { - if (!SharedConfig.smoothKeyboard) { - if (emojiViewVisible) { - hidePopup(false); - } - sizeNotifierLayout.removeView(emojiView); - emojiView = null; + public void setAllowStickersAndGifs(boolean needAnimatedEmoji, boolean needStickers, boolean needGifs, boolean waitingForKeyboardOpen) { + if ((allowStickers != needStickers || allowGifs != needGifs) && emojiView != null) { + if (emojiViewVisible && !waitingForKeyboardOpen) { + removeEmojiViewAfterAnimation = true; + hidePopup(false); } else { - if (emojiViewVisible && !waitingForKeyboardOpen) { - removeEmojiViewAfterAnimation = true; - hidePopup(false); - } else { - if (waitingForKeyboardOpen) { - openKeyboardInternal(); - } - sizeNotifierLayout.removeView(emojiView); - emojiView = null; + if (waitingForKeyboardOpen) { + openKeyboardInternal(); } } } - allowStickers = value; - allowGifs = value2; + allowAnimatedEmoji = needAnimatedEmoji; + allowStickers = needStickers; + allowGifs = needGifs; + if (emojiView != null) { + emojiView.setAllow(allowStickers, allowGifs, true); + } setEmojiButtonImage(false, !isPaused); } @@ -4279,11 +4272,14 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return; } TLRPC.Chat chat = parentFragment.getCurrentChat(); + TLRPC.UserFull userFull = parentFragment.getCurrentUserInfo(); if (chat != null) { audioVideoButtonContainer.setAlpha(ChatObject.canSendMedia(chat) ? 1.0f : 0.5f); if (emojiView != null) { emojiView.setStickersBanned(!ChatObject.canSendStickers(chat), chat.id); } + } else if (userFull != null) { + audioVideoButtonContainer.setAlpha(userFull.voice_messages_forbidden ? 0.5f : 1.0f); } } @@ -4434,7 +4430,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public boolean isInVideoMode() { - return videoSendButton != null && videoSendButton.getTag() != null; + return isInVideoMode; } public boolean hasRecordVideo() { @@ -4521,33 +4517,25 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific videoToSendMessageObject = null; videoTimelineView.destroy(); - if (videoSendButton != null && isInVideoMode()) { - videoSendButton.setVisibility(View.VISIBLE); - } else if (audioSendButton != null) { - audioSendButton.setVisibility(View.VISIBLE); + if (audioVideoSendButton != null) { + audioVideoSendButton.setVisibility(View.VISIBLE); } if (wasSent) { attachButton.setAlpha(0f); - emojiButton[0].setAlpha(0f); - emojiButton[1].setAlpha(0f); + emojiButton.setAlpha(0f); attachButton.setScaleX(0); - emojiButton[0].setScaleX(0); - emojiButton[1].setScaleX(0); + emojiButton.setScaleX(0); attachButton.setScaleY(0); - emojiButton[0].setScaleY(0); - emojiButton[1].setScaleY(0); + emojiButton.setScaleY(0); recordPannelAnimation = new AnimatorSet(); recordPannelAnimation.playTogether( - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 1.0f), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 1.0f), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 1.0f), + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 1.0f), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 1.0f), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 1.0f), ObjectAnimator.ofFloat(recordDeleteImageView, View.ALPHA, 0.0f), ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_X, 0.0f), ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_Y, 0.0f), @@ -4624,14 +4612,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific attachIconAnimator = null; } - emojiButton[0].setAlpha(0f); - emojiButton[1].setAlpha(0f); - - emojiButton[0].setScaleX(0); - emojiButton[1].setScaleX(0); - - emojiButton[0].setScaleY(0); - emojiButton[1].setScaleY(0); + emojiButton.setAlpha(0f); + emojiButton.setScaleX(0); + emojiButton.setScaleY(0); AnimatorSet iconsEndAnimator = new AnimatorSet(); @@ -4641,13 +4624,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_Y, 0.0f), ObjectAnimator.ofFloat(recordDeleteImageView, View.ALPHA, 0.0f), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 1.0f), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 1.0f), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 1.0f), - - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 1.0f) + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 1.0f), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 1.0f), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 1.0f) ); if (botCommandsMenuButton != null) { @@ -4711,6 +4690,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } + private boolean premiumEmojiBulletin = true; private void sendMessageInternal(boolean notify, int scheduleDate) { if (slowModeTimer == Integer.MAX_VALUE && !isInScheduleMode()) { if (delegate != null) { @@ -4763,6 +4743,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } } + if (checkPremiumAnimatedEmoji(currentAccount, dialog_id, parentFragment, null, message)) { + return; + } if (processSendingText(message, notify, scheduleDate)) { if (delegate.hasForwardingMessages() || (scheduleDate != 0 && !isInScheduleMode()) || isInScheduleMode()) { messageEditText.setText(""); @@ -4788,6 +4771,46 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } + public static boolean checkPremiumAnimatedEmoji(int currentAccount, long dialogId, BaseFragment parentFragment, FrameLayout container, CharSequence message) { + if (message == null) { + return false; + } + if (container == null) { + container = parentFragment.getLayoutContainer(); + } + final boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + if (!isPremium && UserConfig.getInstance(currentAccount).getClientUserId() != dialogId && message instanceof Spanned) { + AnimatedEmojiSpan[] animatedEmojis = ((Spanned) message).getSpans(0, message.length(), AnimatedEmojiSpan.class); + if (animatedEmojis != null) { + for (int i = 0; i < animatedEmojis.length; ++i) { + if (animatedEmojis[i] != null) { + TLRPC.Document emoji = animatedEmojis[i].document; + if (emoji == null) { + emoji = AnimatedEmojiDrawable.findDocument(currentAccount, animatedEmojis[i].getDocumentId()); + } + if (emoji != null && !MessageObject.isFreeEmoji(emoji)) { + BulletinFactory.of(container, parentFragment.getResourceProvider()) + .createEmojiBulletin( + emoji, + AndroidUtilities.replaceTags(LocaleController.getString("UnlockPremiumEmojiHint", R.string.UnlockPremiumEmojiHint)), + LocaleController.getString("PremiumMore", R.string.PremiumMore), + () -> { + if (parentFragment != null) { + new PremiumFeatureBottomSheet(parentFragment, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false).show(); + } else if (parentFragment.getContext() instanceof LaunchActivity) { + ((LaunchActivity) parentFragment.getContext()).presentFragment(new PremiumPreviewFragment(null)); + } + } + ).show(); + return true; + } + } + } + } + } + return false; + } + public void doneEditingMessage() { if (editingMessageObject == null) { return; @@ -5487,7 +5510,17 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ArrayList animators = new ArrayList<>(); animators.add(ObjectAnimator.ofFloat(audioVideoButtonContainer, View.SCALE_X, 1.0f)); animators.add(ObjectAnimator.ofFloat(audioVideoButtonContainer, View.SCALE_Y, 1.0f)); - animators.add(ObjectAnimator.ofFloat(audioVideoButtonContainer, View.ALPHA, 1.0f)); + + float alpha = 1.0f; + TLRPC.Chat chat = parentFragment.getCurrentChat(); + TLRPC.UserFull userFull = parentFragment.getCurrentUserInfo(); + if (chat != null) { + alpha = ChatObject.canSendMedia(chat) ? 1.0f : 0.5f; + } else if (userFull != null) { + alpha = userFull.voice_messages_forbidden ? 0.5f : 1.0f; + } + + animators.add(ObjectAnimator.ofFloat(audioVideoButtonContainer, View.ALPHA, alpha)); if (cancelBotButton.getVisibility() == VISIBLE) { animators.add(ObjectAnimator.ofFloat(cancelBotButton, View.SCALE_X, 0.1f)); animators.add(ObjectAnimator.ofFloat(cancelBotButton, View.SCALE_Y, 0.1f)); @@ -5646,9 +5679,6 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (emojiView != null) { emojiView.setEnabled(false); } - if (emojiButtonAnimation != null) { - emojiButtonAnimation.cancel(); - } try { if (wakeLock == null) { PowerManager pm = (PowerManager) ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE); @@ -5696,12 +5726,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific //ENTER TRANSITION AnimatorSet iconChanges = new AnimatorSet(); iconChanges.playTogether( - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 0), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 0), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 0), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 0), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 0), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 0), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 0), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 0), + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 0), ObjectAnimator.ofFloat(recordDot, View.SCALE_Y, 1), ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 1), ObjectAnimator.ofFloat(recordTimerView, View.TRANSLATION_X, 0), @@ -5709,11 +5736,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ObjectAnimator.ofFloat(slideText, View.TRANSLATION_X, 0), ObjectAnimator.ofFloat(slideText, View.ALPHA, 1) ); - if (audioSendButton != null) { - iconChanges.playTogether(ObjectAnimator.ofFloat(audioSendButton, View.ALPHA, 0)); - } - if (videoSendButton != null) { - iconChanges.playTogether(ObjectAnimator.ofFloat(videoSendButton, View.ALPHA, 0)); + if (audioVideoSendButton != null) { + iconChanges.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 0)); } if (botCommandsMenuButton != null) { @@ -5790,13 +5814,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific boolean shouldShowFastTransition = false; if (runningAnimationAudio != null) { shouldShowFastTransition = runningAnimationAudio.isRunning(); - if (videoSendButton != null) { - videoSendButton.setScaleX(1f); - videoSendButton.setScaleY(1f); - } - if (audioSendButton != null) { - audioSendButton.setScaleX(1f); - audioSendButton.setScaleY(1f); + if (audioVideoSendButton != null) { + audioVideoSendButton.setScaleX(1f); + audioVideoSendButton.setScaleY(1f); } runningAnimationAudio.removeAllListeners(); runningAnimationAudio.cancel(); @@ -5810,18 +5830,13 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific runningAnimationAudio = new AnimatorSet(); //EXIT TRANSITION if (shouldShowFastTransition || recordState == RECORD_STATE_CANCEL_BY_TIME) { - if (videoSendButton != null && isInVideoMode()) { - videoSendButton.setVisibility(View.VISIBLE); - } else if (audioSendButton != null) { - audioSendButton.setVisibility(View.VISIBLE); + if (audioVideoSendButton != null) { + audioVideoSendButton.setVisibility(View.VISIBLE); } runningAnimationAudio.playTogether( - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 1), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 1), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 1), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 1), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 1), + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 1), ObjectAnimator.ofFloat(recordDot, View.SCALE_Y, 0), ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0), ObjectAnimator.ofFloat(recordCircle, recordCircleScale, 0.0f), @@ -5840,15 +5855,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ObjectAnimator.ofFloat(botCommandsMenuButton, View.ALPHA, 1) ); } - if (audioSendButton != null) { - audioSendButton.setScaleX(1f); - audioSendButton.setScaleY(1f); - runningAnimationAudio.playTogether(ObjectAnimator.ofFloat(audioSendButton, View.ALPHA, isInVideoMode() ? 0 : 1)); - } - if (videoSendButton != null) { - videoSendButton.setScaleX(1f); - videoSendButton.setScaleY(1f); - runningAnimationAudio.playTogether(ObjectAnimator.ofFloat(videoSendButton, View.ALPHA, isInVideoMode() ? 1 : 0)); + if (audioVideoSendButton != null) { + audioVideoSendButton.setScaleX(1f); + audioVideoSendButton.setScaleY(1f); + runningAnimationAudio.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 1)); + audioVideoSendButton.setState(isInVideoMode() ? ChatActivityEnterViewAnimatedIconView.State.VIDEO : ChatActivityEnterViewAnimatedIconView.State.VOICE, true); } if (scheduledButton != null) { runningAnimationAudio.playTogether( @@ -5944,27 +5955,18 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ObjectAnimator.ofFloat(recordDeleteImageView, View.ALPHA, 1), ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_Y, 1f), ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_X, 1f), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 0), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 0), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 0), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 0), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 0), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 0), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 0), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 0), + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 0), ObjectAnimator.ofFloat(messageEditText, View.ALPHA, 0) ); - if (videoSendButton != null) { + if (audioVideoSendButton != null) { iconsAnimator.playTogether( - ObjectAnimator.ofFloat(videoSendButton, View.ALPHA, isInVideoMode() ? 1 : 0), - ObjectAnimator.ofFloat(videoSendButton, View.SCALE_X, 1), - ObjectAnimator.ofFloat(videoSendButton, View.SCALE_Y, 1) - ); - } - if (audioSendButton != null) { - iconsAnimator.playTogether( - ObjectAnimator.ofFloat(audioSendButton, View.ALPHA, isInVideoMode() ? 0 : 1), - ObjectAnimator.ofFloat(audioSendButton, View.SCALE_X, 1), - ObjectAnimator.ofFloat(audioSendButton, View.SCALE_Y, 1) + ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 1), + ObjectAnimator.ofFloat(audioVideoSendButton, View.SCALE_X, 1), + ObjectAnimator.ofFloat(audioVideoSendButton, View.SCALE_Y, 1) ); + audioVideoSendButton.setState(isInVideoMode() ? ChatActivityEnterViewAnimatedIconView.State.VIDEO : ChatActivityEnterViewAnimatedIconView.State.VOICE, true); } if (botCommandsMenuButton != null) { @@ -5978,13 +5980,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific iconsAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - if (videoSendButton != null) { - videoSendButton.setScaleX(1f); - videoSendButton.setScaleY(1f); - } - if (audioSendButton != null) { - audioSendButton.setScaleX(1f); - audioSendButton.setScaleY(1f); + if (audioVideoSendButton != null) { + audioVideoSendButton.setScaleX(1f); + audioVideoSendButton.setScaleY(1f); } } }); @@ -6029,11 +6027,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific recordedAudioPlayButton.setScaleX(1f); recordedAudioSeekBar.setAlpha(1f); - for (int i = 0; i < 2; i++) { - emojiButton[i].setScaleY(0f); - emojiButton[i].setScaleX(0f); - emojiButton[i].setAlpha(0f); - } + emojiButton.setScaleY(0f); + emojiButton.setScaleX(0f); + emojiButton.setAlpha(0f); if (botCommandsMenuButton != null) { botCommandsMenuButton.setAlpha(0f); botCommandsMenuButton.setScaleX(0f); @@ -6043,20 +6039,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific }); } else if (recordState == RECORD_STATE_CANCEL || recordState == RECORD_STATE_CANCEL_BY_GESTURE) { - if (videoSendButton != null && isInVideoMode()) { - videoSendButton.setVisibility(View.VISIBLE); - } else if (audioSendButton != null) { - audioSendButton.setVisibility(View.VISIBLE); + if (audioVideoSendButton != null) { + audioVideoSendButton.setVisibility(View.VISIBLE); } recordIsCanceled = true; AnimatorSet iconsAnimator = new AnimatorSet(); iconsAnimator.playTogether( - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 1), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 1), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 1), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 1), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 1), + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 1), ObjectAnimator.ofFloat(recordDot, View.SCALE_Y, 0), ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0) ); @@ -6113,15 +6104,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ObjectAnimator.ofFloat(botButton, View.SCALE_Y, 1f) ); } - if (videoSendButton != null) { - iconsAnimator.playTogether(ObjectAnimator.ofFloat(videoSendButton, View.ALPHA, isInVideoMode() ? 1 : 0)); - iconsAnimator.playTogether(ObjectAnimator.ofFloat(videoSendButton, View.SCALE_X, 1)); - iconsAnimator.playTogether(ObjectAnimator.ofFloat(videoSendButton, View.SCALE_Y, 1)); - } - if (audioSendButton != null) { - iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioSendButton, View.ALPHA, isInVideoMode() ? 0 : 1)); - iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioSendButton, View.SCALE_X, 1)); - iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioSendButton, View.SCALE_Y, 1)); + if (audioVideoSendButton != null) { + iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 1)); + iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.SCALE_X, 1)); + iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.SCALE_Y, 1)); + audioVideoSendButton.setState(isInVideoMode() ? ChatActivityEnterViewAnimatedIconView.State.VIDEO : ChatActivityEnterViewAnimatedIconView.State.VOICE, true); } if (scheduledButton != null) { iconsAnimator.playTogether( @@ -6153,11 +6140,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - if (audioSendButton != null) { - audioSendButton.setAlpha(isInVideoMode() ? 0 : 1f); - } - if (videoSendButton != null) { - videoSendButton.setAlpha(isInVideoMode() ? 1f : 0); + if (audioVideoSendButton != null) { + audioVideoSendButton.setAlpha(1f); } } }); @@ -6199,20 +6183,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific recordDot.playDeleteAnimation(); } else { - if (videoSendButton != null && isInVideoMode()) { - videoSendButton.setVisibility(View.VISIBLE); - } else if (audioSendButton != null) { - audioSendButton.setVisibility(View.VISIBLE); + if (audioVideoSendButton != null) { + audioVideoSendButton.setVisibility(View.VISIBLE); } AnimatorSet iconsAnimator = new AnimatorSet(); iconsAnimator.playTogether( - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 1), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 1), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 1), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 1), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_Y, 1), + ObjectAnimator.ofFloat(emojiButton, View.SCALE_X, 1), + ObjectAnimator.ofFloat(emojiButton, View.ALPHA, 1), ObjectAnimator.ofFloat(recordDot, View.SCALE_Y, 0), ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0), ObjectAnimator.ofFloat(audioVideoButtonContainer, View.ALPHA, 1.0f) @@ -6223,15 +6202,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ObjectAnimator.ofFloat(botCommandsMenuButton, View.SCALE_X, 1), ObjectAnimator.ofFloat(botCommandsMenuButton, View.ALPHA, 1)); } - if (audioSendButton != null) { - audioSendButton.setScaleX(1f); - audioSendButton.setScaleY(1f); - iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioSendButton, View.ALPHA, isInVideoMode() ? 0 : 1)); - } - if (videoSendButton != null) { - videoSendButton.setScaleX(1f); - videoSendButton.setScaleY(1f); - iconsAnimator.playTogether(ObjectAnimator.ofFloat(videoSendButton, View.ALPHA, isInVideoMode() ? 1 : 0)); + if (audioVideoSendButton != null) { + audioVideoSendButton.setScaleX(1f); + audioVideoSendButton.setScaleY(1f); + iconsAnimator.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 1)); + audioVideoSendButton.setState(isInVideoMode() ? ChatActivityEnterViewAnimatedIconView.State.VIDEO : ChatActivityEnterViewAnimatedIconView.State.VOICE, true); } if (attachLayout != null) { attachLayout.setTranslationX(0); @@ -6433,13 +6408,22 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific 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, messageEditText.getPaint().getFontMetricsInt()); + } else { + span = new AnimatedEmojiSpan(emojiEntity.document_id, messageEditText.getPaint().getFontMetricsInt()); + } + stringBuilder.setSpan(span, entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } } catch (Exception e) { FileLog.e(e); } } - textToSetWithKeyboard = Emoji.replaceEmoji(new SpannableStringBuilder(stringBuilder), messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); + textToSetWithKeyboard = Emoji.replaceEmoji(new SpannableStringBuilder(stringBuilder), messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false, null, true); } else { textToSetWithKeyboard = ""; } @@ -6563,7 +6547,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public View getEmojiButton() { - return emojiButton[0]; + return emojiButton; } public EmojiView getEmojiView() { @@ -6613,11 +6597,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (botKeyboardView != null) { botKeyboardView.updateColors(); } - for (int i = 0; i < 2; ++i) { - emojiButton[i].setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY)); - if (Build.VERSION.SDK_INT >= 21) { - emojiButton[i].setBackgroundDrawable(Theme.createSelectorDrawable(getThemedColor(Theme.key_listSelector))); - } + audioVideoSendButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.SRC_IN)); + emojiButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.SRC_IN)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + emojiButton.setBackground(Theme.createSelectorDrawable(getThemedColor(Theme.key_listSelector))); } } @@ -6890,9 +6873,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific senderSelectView.setAlpha(startAlpha + (endAlpha - startAlpha) * val); senderSelectView.setTranslationX(startX + (endX - startX) * val); - for (ImageView emoji : emojiButton) { - emoji.setTranslationX(senderSelectView.getTranslationX()); - } + emojiButton.setTranslationX(senderSelectView.getTranslationX()); messageEditText.setTranslationX(senderSelectView.getTranslationX()); }); anim.addListener(new AnimatorListenerAdapter() { @@ -6903,9 +6884,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } senderSelectView.setAlpha(startAlpha); senderSelectView.setTranslationX(startX); - for (ImageView emoji : emojiButton) { - emoji.setTranslationX(senderSelectView.getTranslationX()); - } + emojiButton.setTranslationX(senderSelectView.getTranslationX()); messageEditText.setTranslationX(senderSelectView.getTranslationX()); if (botCommandsMenuButton.getTag() == null) { @@ -6917,9 +6896,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific public void onAnimationEnd(Animator animation) { if (!isVisible) { senderSelectView.setVisibility(GONE); - for (ImageView emoji : emojiButton) { - emoji.setTranslationX(0); - } + emojiButton.setTranslationX(0); messageEditText.setTranslationX(0); } } @@ -6933,9 +6910,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } senderSelectView.setAlpha(endAlpha); senderSelectView.setTranslationX(endX); - for (ImageView emoji : emojiButton) { - emoji.setTranslationX(senderSelectView.getTranslationX()); - } + emojiButton.setTranslationX(senderSelectView.getTranslationX()); messageEditText.setTranslationX(senderSelectView.getTranslationX()); requestLayout(); @@ -6947,9 +6922,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific senderSelectView.setVisibility(isVisible ? VISIBLE : GONE); senderSelectView.setTranslationX(endX); float translationX = isVisible ? endX : 0; - for (ImageView emoji : emojiButton) { - emoji.setTranslationX(translationX); - } + emojiButton.setTranslationX(translationX); messageEditText.setTranslationX(translationX); senderSelectView.setAlpha(endAlpha); senderSelectView.setTag(null); @@ -7269,10 +7242,14 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } private void createEmojiView() { + if (emojiView != null && emojiView.currentAccount != UserConfig.selectedAccount) { + sizeNotifierLayout.removeView(emojiView); + emojiView = null; + } if (emojiView != null) { return; } - emojiView = new EmojiView(allowStickers, allowGifs, getContext(), true, info, sizeNotifierLayout, resourcesProvider) { + emojiView = new EmojiView(parentFragment, allowAnimatedEmoji, true, true, getContext(), true, info, sizeNotifierLayout, resourcesProvider) { @Override public void setTranslationY(float translationY) { super.setTranslationY(translationY); @@ -7281,10 +7258,16 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } }; + emojiView.setAllow(allowStickers, allowGifs, true); emojiView.setVisibility(GONE); emojiView.setShowing(false); emojiView.setDelegate(new EmojiView.EmojiViewDelegate() { + @Override + public boolean isUserSelf() { + return dialog_id == UserConfig.getInstance(currentAccount).getClientUserId(); + } + @Override public boolean onBackspace() { if (messageEditText.length() == 0) { @@ -7313,6 +7296,43 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } + public void onCustomEmojiSelected(long documentId, TLRPC.Document document, String emoticon) { + AndroidUtilities.runOnUIThread(() -> { + int i = messageEditText.getSelectionEnd(); + if (i < 0) { + i = 0; + } + try { + innerTextChange = 2; + SpannableString emoji = new SpannableString(emoticon == null ? "\uD83D\uDE00" : emoticon); + AnimatedEmojiSpan span; + if (document != null) { + span = new AnimatedEmojiSpan(document, messageEditText.getPaint().getFontMetricsInt()); + } else { + span = new AnimatedEmojiSpan(documentId, messageEditText.getPaint().getFontMetricsInt()); + } + span.cacheType = AnimatedEmojiDrawable.getCacheTypeForEnterView(); + emoji.setSpan(span, 0, emoji.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + messageEditText.setText(messageEditText.getText().insert(i, emoji)); + messageEditText.setSelection(i + emoji.length(), i + emoji.length()); + } catch (Exception e) { + FileLog.e(e); + } finally { + innerTextChange = 0; + } + }); + } + + @Override + public void onAnimatedEmojiUnlockClick() { + BottomSheet alert = new PremiumFeatureBottomSheet(parentFragment, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false); + if (parentFragment != null) { + parentFragment.showDialog(alert); + } else { + alert.show(); + } + } + @Override public void onStickerSelected(View view, TLRPC.Document sticker, String query, Object parent, MessageObject.SendAnimationData sendAnimationData, boolean notify, int scheduleDate) { if (trendingStickersAlert != null) { @@ -7346,6 +7366,13 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } + @Override + public void onEmojiSettingsClick() { + if (parentFragment != null) { + parentFragment.presentFragment(new StickersActivity(MediaDataController.TYPE_EMOJIPACKS)); + } + } + @Override public void onGifSelected(View view, Object gif, String query, Object parent, boolean notify, int scheduleDate) { if (isInScheduleMode() && scheduleDate == 0) { @@ -7387,7 +7414,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific params.put("query_id", "" + result.query_id); params.put("force_gif", "1"); - SendMessagesHelper.prepareSendingBotContextResult(accountInstance, result, params, dialog_id, replyingMessageObject, getThreadMessage(), notify, scheduleDate); + SendMessagesHelper.prepareSendingBotContextResult(parentFragment, accountInstance, result, params, dialog_id, replyingMessageObject, getThreadMessage(), notify, scheduleDate); if (searchingType != 0) { setSearchingTypeInternal(0, true); @@ -7413,9 +7440,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return; } AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity, resourcesProvider); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("ClearRecentEmoji", R.string.ClearRecentEmoji)); - builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), (dialogInterface, i) -> emojiView.clearRecentEmoji()); + builder.setTitle(LocaleController.getString("ClearRecentEmojiTitle", R.string.ClearRecentEmojiTitle)); + builder.setMessage(LocaleController.getString("ClearRecentEmojiText", R.string.ClearRecentEmojiText)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearForAll).toUpperCase(), (dialogInterface, i) -> emojiView.clearRecentEmoji()); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); parentFragment.showDialog(builder.create()); } @@ -7463,7 +7490,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific public void onSearchOpenClose(int type) { setSearchingTypeInternal(type, true); if (type != 0) { - setStickersExpanded(true, true, false); + setStickersExpanded(true, true, false, type == 1); } if (emojiTabOpen && searchingType == 2) { checkStickresExpandHeight(); @@ -7671,8 +7698,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return; } if (show == 1) { - if (contentType == 0 && emojiView == null) { - if (parentActivity == null) { + if (contentType == 0) { + if (parentActivity == null && emojiView == null) { return; } createEmojiView(); @@ -7884,22 +7911,19 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } private void setEmojiButtonImage(boolean byOpen, boolean animated) { + if (emojiButton == null) { + return; + } boolean showingRecordInterface = recordInterfaceState == 1 || (recordedAudioPanel != null && recordedAudioPanel.getVisibility() == View.VISIBLE); if (showingRecordInterface) { - emojiButton[0].setScaleX(0); - emojiButton[0].setScaleY(0); - emojiButton[0].setAlpha(0f); - emojiButton[1].setScaleX(0); - emojiButton[1].setScaleY(0); - emojiButton[1].setAlpha(0f); + emojiButton.setScaleX(0); + emojiButton.setScaleY(0); + emojiButton.setAlpha(0f); animated = false; } - if (animated && currentEmojiIcon == -1) { - animated = false; - } - int nextIcon; + ChatActivityEnterViewAnimatedIconView.State nextIcon; if (byOpen && currentPopupContentType == 0) { - nextIcon = 0; + nextIcon = ChatActivityEnterViewAnimatedIconView.State.KEYBOARD; } else { int currentPage; if (emojiView == null) { @@ -7908,67 +7932,24 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific currentPage = emojiView.getCurrentPage(); } if (currentPage == 0 || !allowStickers && !allowGifs) { - nextIcon = 1; - } else if (currentPage == 1) { - nextIcon = 2; + nextIcon = ChatActivityEnterViewAnimatedIconView.State.SMILE; + } else if (messageEditText != null && !TextUtils.isEmpty(messageEditText.getText())) { + nextIcon = ChatActivityEnterViewAnimatedIconView.State.SMILE; } else { - nextIcon = 3; + if (currentPage == 1) { + nextIcon = ChatActivityEnterViewAnimatedIconView.State.STICKER; + } else { + nextIcon = ChatActivityEnterViewAnimatedIconView.State.GIF; + } } } - if (currentEmojiIcon == nextIcon) { - return; - } - if (emojiButtonAnimation != null) { - emojiButtonAnimation.cancel(); - emojiButtonAnimation = null; - } - if (nextIcon == 0) { - emojiButton[animated ? 1 : 0].setImageResource(R.drawable.input_keyboard); - } else if (nextIcon == 1) { - emojiButton[animated ? 1 : 0].setImageResource(R.drawable.input_smile); - } else if (nextIcon == 2) { - emojiButton[animated ? 1 : 0].setImageResource(R.drawable.input_sticker); - } else if (nextIcon == 3) { - emojiButton[animated ? 1 : 0].setImageResource(R.drawable.input_gif); - } - emojiButton[animated ? 1 : 0].setTag(nextIcon == 2 ? 1 : null); - currentEmojiIcon = nextIcon; - if (animated) { - emojiButton[1].setVisibility(VISIBLE); - emojiButton[1].setAlpha(0f); - emojiButton[1].setScaleX(0.1f); - emojiButton[1].setScaleY(0.1f); - emojiButtonAnimation = new AnimatorSet(); - emojiButtonAnimation.playTogether( - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_X, 0.1f), - ObjectAnimator.ofFloat(emojiButton[0], View.SCALE_Y, 0.1f), - ObjectAnimator.ofFloat(emojiButton[0], View.ALPHA, 0.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_X, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.SCALE_Y, 1.0f), - ObjectAnimator.ofFloat(emojiButton[1], View.ALPHA, 1.0f)); - emojiButtonAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (animation.equals(emojiButtonAnimation)) { - emojiButtonAnimation = null; - ImageView temp = emojiButton[1]; - emojiButton[1] = emojiButton[0]; - emojiButton[0] = temp; - emojiButton[1].setVisibility(INVISIBLE); - emojiButton[1].setAlpha(0.0f); - emojiButton[1].setScaleX(0.1f); - emojiButton[1].setScaleY(0.1f); - } - } - }); - emojiButtonAnimation.setDuration(150); - emojiButtonAnimation.start(); - } + + emojiButton.setState(nextIcon, animated); onEmojiIconChanged(nextIcon); } - protected void onEmojiIconChanged(int currentIcon) { - if (currentIcon == 3 && emojiView == null) { + protected void onEmojiIconChanged(ChatActivityEnterViewAnimatedIconView.State currentIcon) { + if (currentIcon == ChatActivityEnterViewAnimatedIconView.State.GIF && emojiView == null) { MediaDataController.getInstance(currentAccount).loadRecents(MediaDataController.TYPE_IMAGE, true, true, false); final ArrayList gifSearchEmojies = MessagesController.getInstance(currentAccount).gifSearchEmojies; for (int i = 0, N = Math.min(10, gifSearchEmojies.size()); i < N; i++) { @@ -8277,7 +8258,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (recordInterfaceState != 0 && !wasSendTyping && !isInScheduleMode()) { wasSendTyping = true; - accountInstance.getMessagesController().sendTyping(dialog_id, getThreadMessageId(), videoSendButton != null && videoSendButton.getTag() != null ? 7 : 1, 0); + accountInstance.getMessagesController().sendTyping(dialog_id, getThreadMessageId(), isInVideoMode() ? 7 : 1, 0); } if (recordCircle != null) { @@ -8326,11 +8307,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return; } boolean audio = (Boolean) args[1]; - if (videoSendButton != null) { - videoSendButton.setTag(audio ? null : 1); - videoSendButton.setVisibility(audio ? View.GONE : View.VISIBLE); - videoSendButton.setVisibility(audio ? View.VISIBLE : View.GONE); - } + isInVideoMode = !audio; + audioVideoSendButton.setState(audio ? ChatActivityEnterViewAnimatedIconView.State.VOICE : ChatActivityEnterViewAnimatedIconView.State.VIDEO, true); if (!recordingAudioVideo) { recordingAudioVideo = true; updateRecordInterface(RECORD_STATE_ENTER); @@ -8437,9 +8415,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } else if (id == NotificationCenter.featuredStickersDidLoad) { if (emojiButton != null) { - for (int a = 0; a < emojiButton.length; a++) { - emojiButton[a].invalidate(); - } + emojiButton.invalidate(); } } else if (id == NotificationCenter.messageReceivedByServer) { Boolean scheduled = (Boolean) args[6]; @@ -8563,6 +8539,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public void setStickersExpanded(boolean expanded, boolean animated, boolean byDrag) { + setStickersExpanded(expanded, animated, byDrag, true); + } + public void setStickersExpanded(boolean expanded, boolean animated, boolean byDrag, boolean stopAllHeavy) { if (adjustPanLayoutHelper != null && adjustPanLayoutHelper.animationInProgress() || waitingForKeyboardOpenAfterAnimation) { return; } @@ -8579,7 +8558,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific stickersExpansionAnim = null; } if (stickersExpanded) { - NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 1); + if (stopAllHeavy) { + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 1); + } originalViewHeight = sizeNotifierLayout.getHeight(); stickersExpandedHeight = originalViewHeight - (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? AndroidUtilities.statusBarHeight : 0) - ActionBar.getCurrentActionBarHeight() - getHeight() + Theme.chat_composeShadowDrawable.getIntrinsicHeight(); if (searchingType == 2) { @@ -8626,7 +8607,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific stickersArrow.setAnimationProgress(1); } } else { - NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 1); + if (stopAllHeavy) { + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 1); + } if (animated) { closeAnimationInProgress = true; AnimatorSet anims = new AnimatorSet(); @@ -8693,7 +8676,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (recordingAudioVideo) { return false; } - if ((videoSendButton != null) && isInVideoMode() && recordedAudioPanel != null && recordedAudioPanel.getVisibility() == View.VISIBLE) { + if (isInVideoMode() && recordedAudioPanel != null && recordedAudioPanel.getVisibility() == View.VISIBLE) { return false; } if (hasBotWebView() && botCommandsMenuButton.isOpened()) { @@ -8839,7 +8822,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public void onCancelButtonPressed() { - if (hasRecordVideo && videoSendButton.getTag() != null) { + if (hasRecordVideo && isInVideoMode()) { CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable); delegate.needStartRecordVideo(5, true, 0); } else { @@ -9098,7 +9081,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific long time = t / 1000; int ms = (int) (t % 1000L) / 10; - if (videoSendButton != null && videoSendButton.getTag() != null) { + if (isInVideoMode()) { if (t >= 59500 && !stoppedInternal) { startedDraggingX = -1; delegate.needStartRecordVideo(3, true, 0); @@ -9108,7 +9091,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (isRunning && currentTimeMillis > lastSendTypingTime + 5000) { lastSendTypingTime = currentTimeMillis; - MessagesController.getInstance(currentAccount).sendTyping(dialog_id, getThreadMessageId(), videoSendButton != null && videoSendButton.getTag() != null ? 7 : 1, 0); + MessagesController.getInstance(currentAccount).sendTyping(dialog_id, getThreadMessageId(), isInVideoMode() ? 7 : 1, 0); } String newString; @@ -9267,21 +9250,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (botCommandsMenuButton != null && botCommandsMenuButton.getTag() != null) { botCommandsMenuButton.measure(widthMeasureSpec, heightMeasureSpec); - for (int i = 0; i < emojiButton.length; i++) { - ((MarginLayoutParams) emojiButton[i].getLayoutParams()).leftMargin = AndroidUtilities.dp(10) + botCommandsMenuButton.getMeasuredWidth(); - } + ((MarginLayoutParams) emojiButton.getLayoutParams()).leftMargin = AndroidUtilities.dp(10) + botCommandsMenuButton.getMeasuredWidth(); ((MarginLayoutParams) messageEditText.getLayoutParams()).leftMargin = AndroidUtilities.dp(57) + botCommandsMenuButton.getMeasuredWidth(); } else if (senderSelectView != null && senderSelectView.getVisibility() == View.VISIBLE) { int width = senderSelectView.getLayoutParams().width, height = senderSelectView.getLayoutParams().height; senderSelectView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); - for (int i = 0; i < emojiButton.length; i++) { - ((MarginLayoutParams) emojiButton[i].getLayoutParams()).leftMargin = AndroidUtilities.dp(16) + width; - } + ((MarginLayoutParams) emojiButton.getLayoutParams()).leftMargin = AndroidUtilities.dp(16) + width; ((MarginLayoutParams) messageEditText.getLayoutParams()).leftMargin = AndroidUtilities.dp(63) + width; } else { - for (int i = 0; i < emojiButton.length; i++) { - ((MarginLayoutParams) emojiButton[i].getLayoutParams()).leftMargin = AndroidUtilities.dp(3); - } + ((MarginLayoutParams) emojiButton.getLayoutParams()).leftMargin = AndroidUtilities.dp(3); ((MarginLayoutParams) messageEditText.getLayoutParams()).leftMargin = AndroidUtilities.dp(50); } if (botCommandsMenuContainer != null) { @@ -9337,12 +9314,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } private void beginDelayedTransition() { - animationParamsX.put(emojiButton[0], emojiButton[0].getX()); - animationParamsX.put(emojiButton[1], emojiButton[1].getX()); + animationParamsX.put(emojiButton, emojiButton.getX()); animationParamsX.put(messageEditText, messageEditText.getX()); } public void setBotInfo(LongSparseArray botInfo) { + setBotInfo(botInfo, true); + } + + public void setBotInfo(LongSparseArray botInfo, boolean animate) { if (botInfo.size() == 1 && botInfo.valueAt(0).user_id == dialog_id) { TLRPC.BotInfo info = botInfo.valueAt(0); TLRPC.BotMenuButton menuButton = info.menu_button; @@ -9363,6 +9343,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (botCommandsAdapter != null) { botCommandsAdapter.setBotInfo(botInfo); } + + updateBotButton(animate); } public boolean botCommandsMenuIsShowing() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterViewAnimatedIconView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterViewAnimatedIconView.java new file mode 100644 index 000000000..b9c0d91b2 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterViewAnimatedIconView.java @@ -0,0 +1,115 @@ +package org.telegram.ui.Components; + +import android.content.Context; + +import androidx.annotation.Nullable; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.R; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class ChatActivityEnterViewAnimatedIconView extends RLottieImageView { + private State currentState; + private TransitState animatingState; + + private Map stateMap = new HashMap() { + @Nullable + @Override + public RLottieDrawable get(@Nullable Object key) { + RLottieDrawable obj = super.get(key); + if (obj == null) { + TransitState state = (TransitState) key; + int res = state.resource; + return new RLottieDrawable(res, String.valueOf(res), AndroidUtilities.dp(32), AndroidUtilities.dp(32)); + } + return obj; + } + }; + + public ChatActivityEnterViewAnimatedIconView(Context context) { + super(context); + } + + public void setState(State state, boolean animate) { + if (animate && state == currentState) { + return; + } + State fromState = currentState; + currentState = state; + if (!animate || fromState == null || getState(fromState, currentState) == null) { + RLottieDrawable drawable = stateMap.get(getAnyState(currentState)); + drawable.stop(); + + drawable.setProgress(0, false); + setAnimation(drawable); + } else { + TransitState transitState = getState(fromState, currentState); + if (transitState == animatingState) { + return; + } + + animatingState = transitState; + RLottieDrawable drawable = stateMap.get(transitState); + drawable.stop(); + drawable.setProgress(0, false); + drawable.setAutoRepeat(0); + drawable.setOnAnimationEndListener(() -> animatingState = null); + setAnimation(drawable); + AndroidUtilities.runOnUIThread(drawable::start); + } + } + + private TransitState getAnyState(State from) { + for (TransitState transitState : TransitState.values()) { + if (transitState.firstState == from) { + return transitState; + } + } + return null; + } + + private TransitState getState(State from, State to) { + for (TransitState transitState : TransitState.values()) { + if (transitState.firstState == from && transitState.secondState == to) { + return transitState; + } + } + return null; + } + + private enum TransitState { + VOICE_TO_VIDEO(State.VOICE, State.VIDEO, R.raw.voice_to_video), + STICKER_TO_KEYBOARD(State.STICKER, State.KEYBOARD, R.raw.sticker_to_keyboard), + SMILE_TO_KEYBOARD(State.SMILE, State.KEYBOARD, R.raw.smile_to_keyboard), + VIDEO_TO_VOICE(State.VIDEO, State.VOICE, R.raw.video_to_voice), + KEYBOARD_TO_STICKER(State.KEYBOARD, State.STICKER, R.raw.keyboard_to_sticker), + KEYBOARD_TO_GIF(State.KEYBOARD, State.GIF, R.raw.keyboard_to_gif), + KEYBOARD_TO_SMILE(State.KEYBOARD, State.SMILE, R.raw.keyboard_to_smile), + GIF_TO_KEYBOARD(State.GIF, State.KEYBOARD, R.raw.gif_to_keyboard), + GIF_TO_SMILE(State.GIF, State.SMILE, R.raw.gif_to_smile), + SMILE_TO_GIF(State.SMILE, State.GIF, R.raw.smile_to_gif), + SMILE_TO_STICKER(State.SMILE, State.STICKER, R.raw.smile_to_sticker), + STICKER_TO_SMILE(State.STICKER, State.SMILE, R.raw.sticker_to_smile); + + final State firstState, secondState; + final int resource; + + TransitState(State firstState, State secondState, int resource) { + this.firstState = firstState; + this.secondState = secondState; + this.resource = resource; + } + } + + public enum State { + VOICE, + VIDEO, + STICKER, + KEYBOARD, + SMILE, + GIF + } +} 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 0462a7525..4ea969133 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java @@ -143,6 +143,11 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N botAttachLayouts.get(id).setDelegate(new BotWebViewContainer.Delegate() { private ValueAnimator botButtonAnimator; + @Override + public void onWebAppSetupClosingBehavior(boolean needConfirmation) { + webViewLayout.setNeedCloseConfirmation(needConfirmation); + } + @Override public void onCloseRequested(Runnable callback) { if (currentAttachLayout != webViewLayout) { @@ -152,7 +157,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N ChatAttachAlert.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); dismiss(); - AndroidUtilities.runOnUIThread(()->{ + AndroidUtilities.runOnUIThread(() -> { if (callback != null) { callback.run(); } @@ -194,7 +199,9 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N OverlayActionBarLayoutDialog overlayActionBarLayoutDialog = new OverlayActionBarLayoutDialog(parentFragment.getParentActivity(), resourcesProvider); overlayActionBarLayoutDialog.show(); paymentFormActivity.setPaymentFormCallback(status -> { - overlayActionBarLayoutDialog.dismiss(); + if (status != PaymentFormActivity.InvoiceStatus.PENDING) { + overlayActionBarLayoutDialog.dismiss(); + } webViewLayout.getWebViewContainer().onInvoiceStatusUpdate(slug, status.name().toLowerCase(Locale.ROOT)); }); @@ -313,6 +320,15 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } } + public boolean checkCaption(CharSequence text) { + if (baseFragment instanceof ChatActivity) { + long dialogId = ((ChatActivity) baseFragment).getDialogId(); + return ChatActivityEnterView.checkPremiumAnimatedEmoji(currentAccount, dialogId, baseFragment, sizeNotifierFrameLayout, text); + } else { + return false; + } + } + public interface ChatAttachViewDelegate { void didPressedButton(int button, boolean arg, boolean notify, int scheduleDate, boolean forceDocument); @@ -455,6 +471,10 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } + boolean onDismissWithTouchOutside() { + return true; + } + boolean canDismissWithTouchOutside() { return true; } @@ -552,9 +572,11 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N return true; } - public void onPanTransitionStart(boolean keyboardVisible, int contentHeight) {} + public void onPanTransitionStart(boolean keyboardVisible, int contentHeight) { + } - public void onPanTransitionEnd() {} + public void onPanTransitionEnd() { + } } protected BaseFragment baseFragment; @@ -932,7 +954,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } checkAnimator = ValueAnimator.ofFloat(checked ? 0f : 1f, checked ? 1f : 0f); - checkAnimator.addUpdateListener(animation -> setCheckedState((float)animation.getAnimatedValue())); + checkAnimator.addUpdateListener(animation -> setCheckedState((float) animation.getAnimatedValue())); checkAnimator.setDuration(200); checkAnimator.start(); } else { @@ -1031,7 +1053,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N public ChatAttachAlert(Context context, final BaseFragment parentFragment, boolean forceDarkTheme, boolean showingFromDialog) { this(context, parentFragment, forceDarkTheme, showingFromDialog, null); } - + @SuppressLint("ClickableViewAccessibility") public ChatAttachAlert(Context context, final BaseFragment parentFragment, boolean forceDarkTheme, boolean showingFromDialog, Theme.ResourcesProvider resourcesProvider) { super(context, false, resourcesProvider); @@ -1050,6 +1072,12 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N sizeNotifierFrameLayout = new SizeNotifierFrameLayout(context) { + private Bulletin.Delegate bulletinDelegate = new Bulletin.Delegate() { + @Override + public int getBottomOffset(int tag) { + return AndroidUtilities.dp(52); + } + }; private int lastNotifyWidth; private RectF rect = new RectF(); private boolean ignoreLayout; @@ -1068,6 +1096,18 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } invalidate(); + if (currentAttachLayout instanceof ChatAttachAlertBotWebViewLayout) { + if (!botButtonWasVisible) { + if (keyboardVisible) { + shadow.setVisibility(GONE); + buttonsRecyclerView.setVisibility(GONE); + } else { + shadow.setVisibility(VISIBLE); + buttonsRecyclerView.setVisibility(VISIBLE); + } + } + } + currentAttachLayout.onPanTransitionStart(keyboardVisible, contentHeight); } @@ -1077,6 +1117,15 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N updateLayout(currentAttachLayout, false, 0); previousScrollOffsetY = scrollOffsetY[0]; currentAttachLayout.onPanTransitionEnd(); + + if (currentAttachLayout instanceof ChatAttachAlertBotWebViewLayout) { + if (!botButtonWasVisible) { + int offsetY = keyboardVisible ? AndroidUtilities.dp(84) : 0; + for (int i = 0; i < botAttachLayouts.size(); i++) { + botAttachLayouts.valueAt(i).setMeasureOffsetY(offsetY); + } + } + } } @Override @@ -1116,7 +1165,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N return true; } if (ev.getAction() == MotionEvent.ACTION_DOWN && scrollOffsetY[0] != 0 && ev.getY() < getCurrentTop() && actionBar.getAlpha() == 0.0f) { - dismiss(); + onDismissWithTouchOutside(); return true; } return super.onInterceptTouchEvent(ev); @@ -1596,12 +1645,14 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N adjustPanLayoutHelper.setResizableView(this); adjustPanLayoutHelper.onAttach(); commentTextView.setAdjustPanLayoutHelper(adjustPanLayoutHelper); + Bulletin.addDelegate(this, bulletinDelegate); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); adjustPanLayoutHelper.onDetach(); + Bulletin.removeDelegate(this); } }; sizeNotifierFrameLayout.setDelegate(new SizeNotifierFrameLayout.SizeNotifierFrameLayoutDelegate() { @@ -1906,7 +1957,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } openContactsLayout(); } else if (num == 6) { - if (!AndroidUtilities.isGoogleMapsInstalled(baseFragment)) { + if (!AndroidUtilities.isMapsInstalled(baseFragment)) { return; } if (locationLayout == null) { @@ -2050,7 +2101,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N currentLimit = MessagesController.getInstance(UserConfig.selectedAccount).getCaptionMaxLengthLimit(); - commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG, resourcesProvider) { + commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG, true, resourcesProvider) { private boolean shouldAnimateEditTextWithBounds; private int messageEditTextPredrawHeigth; @@ -2109,12 +2160,17 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N @Override protected void bottomPanelTranslationY(float translation) { bottomPannelTranslation = translation; - // buttonsRecyclerView.setTranslationY(translation); + // buttonsRecyclerView.setTranslationY(translation); frameLayout2.setTranslationY(translation); writeButtonContainer.setTranslationY(translation); selectedCountView.setTranslationY(translation); frameLayout2.invalidate(); - updateLayout(currentAttachLayout,true, 0); + updateLayout(currentAttachLayout, true, 0); + } + + @Override + protected void closeParent() { + ChatAttachAlert.super.dismiss(); } }; commentTextView.setHint(LocaleController.getString("AddCaption", R.string.AddCaption)); @@ -2440,7 +2496,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N TLRPC.TL_messages_toggleBotInAttachMenu req = new TLRPC.TL_messages_toggleBotInAttachMenu(); req.bot = MessagesController.getInstance(currentAccount).getInputUser(currentUser); req.enabled = false; - ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(()-> { + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { MediaDataController.getInstance(currentAccount).loadAttachMenuBots(false, true); if (currentAttachLayout == botAttachLayouts.get(attachMenuBot.bot_id)) { showLayout(photoLayout); @@ -2514,6 +2570,9 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N MessagesController.getNotificationsSettings(currentAccount).edit().putBoolean("silent_" + chatActivity.getDialogId(), !notify).commit(); } } + if (checkCaption(commentTextView.getText())) { + return; + } applyCaption(); buttonPressed = true; delegate.didPressedButton(7, true, notify, scheduleDate, false); @@ -2618,9 +2677,9 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N nextAttachLayout.setAlpha(0.0f); nextAttachLayout.setTranslationY(AndroidUtilities.dp(78)); animator.playTogether( - ObjectAnimator.ofFloat(currentAttachLayout, View.TRANSLATION_Y, AndroidUtilities.dp(78) + t), - ObjectAnimator.ofFloat(currentAttachLayout, ATTACH_ALERT_LAYOUT_TRANSLATION, 0.0f, 1.0f), - ObjectAnimator.ofFloat(actionBar, View.ALPHA, actionBar.getAlpha(), 0f) + ObjectAnimator.ofFloat(currentAttachLayout, View.TRANSLATION_Y, AndroidUtilities.dp(78) + t), + ObjectAnimator.ofFloat(currentAttachLayout, ATTACH_ALERT_LAYOUT_TRANSLATION, 0.0f, 1.0f), + ObjectAnimator.ofFloat(actionBar, View.ALPHA, actionBar.getAlpha(), 0f) ); animator.setDuration(180); animator.setStartDelay(20); @@ -3024,7 +3083,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N currentSheetAnimationType = 1; currentSheetAnimation = new AnimatorSet(); currentSheetAnimation.playTogether( - ObjectAnimator.ofInt(backDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, dimBehind ? dimBehindAlpha : 0) + ObjectAnimator.ofInt(backDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, dimBehind ? dimBehindAlpha : 0) ); currentSheetAnimation.setDuration(400); currentSheetAnimation.setStartDelay(20); @@ -3957,6 +4016,13 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N return currentAttachLayout.canDismissWithTouchOutside(); } + @Override + protected void onDismissWithTouchOutside() { + if (currentAttachLayout.onDismissWithTouchOutside()) { + dismiss(); + } + } + private boolean confirmationAlertShown = false; protected boolean allowPassConfirmationAlert = false; @@ -3982,27 +4048,27 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } confirmationAlertShown = true; AlertDialog dialog = - new AlertDialog.Builder(baseFragment.getParentActivity(), parentThemeDelegate) - .setTitle(LocaleController.getString("DiscardSelectionAlertTitle", R.string.DiscardSelectionAlertTitle)) - .setMessage(LocaleController.getString("DiscardSelectionAlertMessage", R.string.DiscardSelectionAlertMessage)) - .setPositiveButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialogInterface, i) -> { - allowPassConfirmationAlert = true; - dismiss(); - }) - .setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null) - .setOnCancelListener(di -> { - if (appearSpringAnimation != null) { - appearSpringAnimation.cancel(); - } - appearSpringAnimation = new SpringAnimation(super.containerView, DynamicAnimation.TRANSLATION_Y, 0); - appearSpringAnimation.getSpring().setDampingRatio(1.5f); - appearSpringAnimation.getSpring().setStiffness(1500.0f); - appearSpringAnimation.start(); - }) - .setOnPreDismissListener(di -> { - confirmationAlertShown = false; - }) - .create(); + new AlertDialog.Builder(baseFragment.getParentActivity(), parentThemeDelegate) + .setTitle(LocaleController.getString("DiscardSelectionAlertTitle", R.string.DiscardSelectionAlertTitle)) + .setMessage(LocaleController.getString("DiscardSelectionAlertMessage", R.string.DiscardSelectionAlertMessage)) + .setPositiveButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialogInterface, i) -> { + allowPassConfirmationAlert = true; + dismiss(); + }) + .setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null) + .setOnCancelListener(di -> { + if (appearSpringAnimation != null) { + appearSpringAnimation.cancel(); + } + appearSpringAnimation = new SpringAnimation(super.containerView, DynamicAnimation.TRANSLATION_Y, 0); + appearSpringAnimation.getSpring().setDampingRatio(1.5f); + appearSpringAnimation.getSpring().setStiffness(1500.0f); + appearSpringAnimation.start(); + }) + .setOnPreDismissListener(di -> { + confirmationAlertShown = false; + }) + .create(); dialog.show(); TextView button = (TextView) dialog.getButton(DialogInterface.BUTTON_POSITIVE); if (button != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertAudioLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertAudioLayout.java index 4f7118ade..8244ab60e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertAudioLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertAudioLayout.java @@ -496,7 +496,7 @@ public class ChatAttachAlertAudioLayout extends ChatAttachAlert.AttachAlertLayou for (int a = 0; a < selectedAudiosOrder.size(); a++) { audios.add(selectedAudiosOrder.get(a).messageObject); } - delegate.didSelectAudio(audios, parentAlert.commentTextView.getText().toString(), notify, scheduleDate); + delegate.didSelectAudio(audios, parentAlert.commentTextView.getText(), notify, scheduleDate); } public void setDelegate(AudioSelectDelegate audioSelectDelegate) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java index ff995d21b..d13811923 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java @@ -17,6 +17,7 @@ import android.view.ViewConfiguration; import android.view.WindowManager; import android.webkit.WebView; import android.widget.FrameLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.math.MathUtils; @@ -28,6 +29,7 @@ import androidx.recyclerview.widget.ChatListItemAnimator; import org.json.JSONObject; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ContactsController; import org.telegram.messenger.FileLog; import org.telegram.messenger.GenericProvider; import org.telegram.messenger.LocaleController; @@ -42,6 +44,7 @@ import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.ActionBarMenuSubItem; +import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; @@ -78,6 +81,8 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert private boolean hasCustomBackground; private int customBackground; + private boolean needCloseConfirmation; + private boolean destroyed; private Runnable pollRunnable = () -> { if (!destroyed) { @@ -128,8 +133,8 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert @Override public void onItemClick(int id) { if (id == -1) { - if (!onBackPressed()) { - parentAlert.dismiss(); + if (!webViewContainer.onBackPressed()) { + onCheckDismissByUser(); } } else if (id == R.id.menu_open_bot) { Bundle bundle = new Bundle(); @@ -187,7 +192,11 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert lastSwipeTime = System.currentTimeMillis(); }); swipeContainer.setScrollEndListener(()-> webViewContainer.invalidateViewPortHeight(true)); - swipeContainer.setDelegate(() -> parentAlert.dismiss()); + swipeContainer.setDelegate(() -> { + if (!onCheckDismissByUser()) { + swipeContainer.stickTo(0); + } + }); swipeContainer.setIsKeyboardVisible(obj -> parentAlert.sizeNotifierFrameLayout.getKeyboardHeight() >= AndroidUtilities.dp(20)); addView(swipeContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); @@ -214,6 +223,39 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didSetNewTheme); } + public void setNeedCloseConfirmation(boolean needCloseConfirmation) { + this.needCloseConfirmation = needCloseConfirmation; + } + + @Override + boolean onDismissWithTouchOutside() { + onCheckDismissByUser(); + return false; + } + + public boolean onCheckDismissByUser() { + if (needCloseConfirmation) { + String botName = null; + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(botId); + if (user != null) { + botName = ContactsController.formatName(user.first_name, user.last_name); + } + AlertDialog dialog = new AlertDialog.Builder(getContext()) + .setTitle(botName) + .setMessage(LocaleController.getString(R.string.BotWebViewChangesMayNotBeSaved)) + .setPositiveButton(LocaleController.getString(R.string.BotWebViewCloseAnyway), (dialog2, which) -> parentAlert.dismiss()) + .setNegativeButton(LocaleController.getString(R.string.Cancel), null) + .create(); + dialog.show(); + TextView textView = (TextView) dialog.getButton(AlertDialog.BUTTON_POSITIVE); + textView.setTextColor(getThemedColor(Theme.key_dialogTextRed)); + return false; + } else { + parentAlert.dismiss(); + return true; + } + } + public void setCustomBackground(int customBackground) { this.customBackground = customBackground; hasCustomBackground = true; @@ -522,7 +564,11 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert @Override boolean onBackPressed() { - return webViewContainer.onBackPressed(); + if (webViewContainer.onBackPressed()) { + return true; + } + onCheckDismissByUser(); + return true; } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java index d0aead09d..828340299 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java @@ -44,24 +44,15 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.google.android.gms.maps.CameraUpdate; -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.MapView; -import com.google.android.gms.maps.MapsInitializer; -import com.google.android.gms.maps.Projection; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.CameraPosition; -import com.google.android.gms.maps.model.CircleOptions; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.MapStyleOptions; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.DialogObject; import org.telegram.messenger.FileLog; +import org.telegram.messenger.IMapsProvider; import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocationController; import org.telegram.messenger.MessagesController; @@ -92,10 +83,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.LinearSmoothScroller; -import androidx.recyclerview.widget.RecyclerView; - public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLayout implements NotificationCenter.NotificationCenterDelegate { private ImageView locationButton; @@ -108,9 +95,9 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa private ActionBarMenuItem searchItem; private MapOverlayView overlayView; - private GoogleMap googleMap; - private MapView mapView; - private CameraUpdate forceUpdate; + private IMapsProvider.IMap map; + private IMapsProvider.IMapView mapView; + private IMapsProvider.ICameraUpdate forceUpdate; private float yOffset; private boolean ignoreLayout; @@ -144,7 +131,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa private AnimatorSet animatorSet; - private Marker lastPressedMarker; + private IMapsProvider.IMarker lastPressedMarker; private VenueLocation lastPressedVenue; private FrameLayout lastPressedMarkerView; @@ -166,7 +153,6 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa private boolean userLocationMoved; private boolean searchedForCustomLocations; private boolean firstWas; - private CircleOptions circleOptions; private LocationActivityDelegate delegate; private int locationType; @@ -185,7 +171,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa public static class VenueLocation { public int num; - public Marker marker; + public IMapsProvider.IMarker marker; public TLRPC.TL_messageMediaVenue venue; } @@ -194,7 +180,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa public TLRPC.Message object; public TLRPC.User user; public TLRPC.Chat chat; - public Marker marker; + public IMapsProvider.IMarker marker; } private static class SearchButton extends TextView { @@ -229,13 +215,13 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa public class MapOverlayView extends FrameLayout { - private HashMap views = new HashMap<>(); + private HashMap views = new HashMap<>(); public MapOverlayView(Context context) { super(context); } - public void addInfoView(Marker marker) { + public void addInfoView(IMapsProvider.IMarker marker) { VenueLocation location = (VenueLocation) marker.getTag(); if (lastPressedVenue == location) { return; @@ -340,10 +326,10 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa views.put(marker, frameLayout); - googleMap.animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition()), 300, null); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(marker.getPosition()), 300, null); } - public void removeInfoView(Marker marker) { + public void removeInfoView(IMapsProvider.IMarker marker) { View view = views.get(marker); if (view != null) { removeView(view); @@ -352,12 +338,12 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } public void updatePositions() { - if (googleMap == null) { + if (map == null) { return; } - Projection projection = googleMap.getProjection(); - for (HashMap.Entry entry : views.entrySet()) { - Marker marker = entry.getKey(); + IMapsProvider.IProjection projection = map.getProjection(); + for (HashMap.Entry entry : views.entrySet()) { + IMapsProvider.IMarker marker = entry.getKey(); View view = entry.getValue(); Point point = projection.toScreenLocation(marker.getPosition()); view.setTranslationX(point.x - view.getMeasuredWidth() / 2); @@ -584,15 +570,15 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa mapViewClip.addView(mapTypeButton, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 40 : 44, Build.VERSION.SDK_INT >= 21 ? 40 : 44, Gravity.RIGHT | Gravity.TOP, 0, 12, 12, 0)); mapTypeButton.setOnClickListener(v -> mapTypeButton.toggleSubMenu()); mapTypeButton.setDelegate(id -> { - if (googleMap == null) { + if (map == null) { return; } if (id == map_list_menu_map) { - googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); + map.setMapType(IMapsProvider.MAP_TYPE_NORMAL); } else if (id == map_list_menu_satellite) { - googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); + map.setMapType(IMapsProvider.MAP_TYPE_SATELLITE); } else if (id == map_list_menu_hybrid) { - googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); + map.setMapType(IMapsProvider.MAP_TYPE_HYBRID); } }); @@ -635,13 +621,13 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } } } - if (myLocation != null && googleMap != null) { + if (myLocation != null && map != null) { locationButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_actionActiveIcon), PorterDuff.Mode.MULTIPLY)); locationButton.setTag(Theme.key_location_actionActiveIcon); adapter.setCustomLocation(null); userLocationMoved = false; showSearchPlacesButton(false); - googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()))); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude()))); if (searchedForCustomLocations) { if (myLocation != null) { adapter.searchPlacesWithQuery(null, myLocation, true, true); @@ -792,7 +778,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } } else if (object instanceof LiveLocation) { LiveLocation liveLocation = (LiveLocation) object; - googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(liveLocation.marker.getPosition(), googleMap.getMaxZoomLevel() - 4)); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(new IMapsProvider.LatLng(liveLocation.marker.getPosition().latitude, liveLocation.marker.getPosition().longitude), map.getMaxZoomLevel() - 4)); } } }); @@ -801,61 +787,56 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa addView(mapViewClip, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP)); - mapView = new MapView(context) { - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - MotionEvent eventToRecycle = null; - if (yOffset != 0) { - ev = eventToRecycle = MotionEvent.obtain(ev); - eventToRecycle.offsetLocation(0, -yOffset / 2); - } - boolean result = super.dispatchTouchEvent(ev); - if (eventToRecycle != null) { - eventToRecycle.recycle(); - } - return result; + mapView = ApplicationLoader.getMapsProvider().onCreateMapView(context); + mapView.setOnDispatchTouchEventInterceptor((ev, origMethod) -> { + MotionEvent eventToRecycle = null; + if (yOffset != 0) { + ev = eventToRecycle = MotionEvent.obtain(ev); + eventToRecycle.offsetLocation(0, -yOffset / 2); } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - if (animatorSet != null) { - animatorSet.cancel(); - } - animatorSet = new AnimatorSet(); - animatorSet.setDuration(200); - animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop - AndroidUtilities.dp(10))); - animatorSet.start(); - } else if (ev.getAction() == MotionEvent.ACTION_UP) { - if (animatorSet != null) { - animatorSet.cancel(); - } - yOffset = 0; - animatorSet = new AnimatorSet(); - animatorSet.setDuration(200); - animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop)); - animatorSet.start(); - adapter.fetchLocationAddress(); - } - if (ev.getAction() == MotionEvent.ACTION_MOVE) { - if (!userLocationMoved) { - locationButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_actionIcon), PorterDuff.Mode.MULTIPLY)); - locationButton.setTag(Theme.key_location_actionIcon); - userLocationMoved = true; - } - if (googleMap != null) { - if (userLocation != null) { - userLocation.setLatitude(googleMap.getCameraPosition().target.latitude); - userLocation.setLongitude(googleMap.getCameraPosition().target.longitude); - } - } - adapter.setCustomLocation(userLocation); - } - return super.onInterceptTouchEvent(ev); + boolean result = origMethod.call(ev); + if (eventToRecycle != null) { + eventToRecycle.recycle(); } - }; - final MapView map = mapView; + return result; + }); + mapView.setOnInterceptTouchEventInterceptor((ev, origMethod) -> { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (animatorSet != null) { + animatorSet.cancel(); + } + animatorSet = new AnimatorSet(); + animatorSet.setDuration(200); + animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop - AndroidUtilities.dp(10))); + animatorSet.start(); + } else if (ev.getAction() == MotionEvent.ACTION_UP) { + if (animatorSet != null) { + animatorSet.cancel(); + } + yOffset = 0; + animatorSet = new AnimatorSet(); + animatorSet.setDuration(200); + animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop)); + animatorSet.start(); + adapter.fetchLocationAddress(); + } + if (ev.getAction() == MotionEvent.ACTION_MOVE) { + if (!userLocationMoved) { + locationButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_location_actionIcon), PorterDuff.Mode.MULTIPLY)); + locationButton.setTag(Theme.key_location_actionIcon); + userLocationMoved = true; + } + if (map != null) { + if (userLocation != null) { + userLocation.setLatitude(map.getCameraPosition().target.latitude); + userLocation.setLongitude(map.getCameraPosition().target.longitude); + } + } + adapter.setCustomLocation(userLocation); + } + return origMethod.call(ev); + }); + final IMapsProvider.IMapView map = mapView; new Thread(() -> { try { map.onCreate(null); @@ -866,17 +847,17 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa if (mapView != null && getParentActivity() != null) { try { map.onCreate(null); - MapsInitializer.initialize(ApplicationLoader.applicationContext); + ApplicationLoader.getMapsProvider().initializeMaps(ApplicationLoader.applicationContext); mapView.getMapAsync(map1 -> { - googleMap = map1; - googleMap.setOnMapLoadedCallback(() -> AndroidUtilities.runOnUIThread(() -> { + this.map = map1; + this.map.setOnMapLoadedCallback(() -> AndroidUtilities.runOnUIThread(() -> { loadingMapView.setTag(1); loadingMapView.animate().alpha(0.0f).setDuration(180).start(); })); if (isActiveThemeDark()) { currentMapStyleDark = true; - MapStyleOptions style = MapStyleOptions.loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); - googleMap.setMapStyle(style); + IMapsProvider.IMapStyleOptions style = ApplicationLoader.getMapsProvider().loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); + this.map.setMapStyle(style); } onMapInit(); }); @@ -964,14 +945,14 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.locationPermissionGranted); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.locationPermissionDenied); try { - if (googleMap != null) { - googleMap.setMyLocationEnabled(false); + if (map != null) { + map.setMyLocationEnabled(false); } } catch (Exception e) { FileLog.e(e); } if (mapView != null) { - mapView.setTranslationY(-AndroidUtilities.displaySize.y * 3); + mapView.getView().setTranslationY(-AndroidUtilities.displaySize.y * 3); } try { if (mapView != null) { @@ -1204,14 +1185,14 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa for (int a = 0, N = places.size(); a < N; a++) { TLRPC.TL_messageMediaVenue venue = places.get(a); try { - MarkerOptions options = new MarkerOptions().position(new LatLng(venue.geo.lat, venue.geo._long)); - options.icon(BitmapDescriptorFactory.fromBitmap(createPlaceBitmap(a))); + IMapsProvider.IMarkerOptions options = ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(new IMapsProvider.LatLng(venue.geo.lat, venue.geo._long)); + options.icon(createPlaceBitmap(a)); options.anchor(0.5f, 0.5f); options.title(venue.title); options.snippet(venue.address); VenueLocation venueLocation = new VenueLocation(); venueLocation.num = a; - venueLocation.marker = googleMap.addMarker(options); + venueLocation.marker = map.addMarker(options); venueLocation.venue = venue; venueLocation.marker.setTag(venueLocation); placeMarkers.add(venueLocation); @@ -1238,7 +1219,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } private void onMapInit() { - if (googleMap == null) { + if (map == null) { return; } @@ -1247,15 +1228,15 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa userLocation.setLongitude(-11.406250); try { - googleMap.setMyLocationEnabled(true); + map.setMyLocationEnabled(true); } catch (Exception e) { FileLog.e(e); } - googleMap.getUiSettings().setMyLocationButtonEnabled(false); - googleMap.getUiSettings().setZoomControlsEnabled(false); - googleMap.getUiSettings().setCompassEnabled(false); - googleMap.setOnCameraMoveStartedListener(reason -> { - if (reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE) { + map.getUiSettings().setMyLocationButtonEnabled(false); + map.getUiSettings().setZoomControlsEnabled(false); + map.getUiSettings().setCompassEnabled(false); + map.setOnCameraMoveStartedListener(reason -> { + if (reason == IMapsProvider.OnCameraMoveStartedListener.REASON_GESTURE) { showSearchPlacesButton(true); removeInfoView(); @@ -1267,8 +1248,8 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa int min = locationType == LOCATION_TYPE_SEND ? 0 : AndroidUtilities.dp(66); int top = view.getTop(); if (top < -min) { - CameraPosition cameraPosition = googleMap.getCameraPosition(); - forceUpdate = CameraUpdateFactory.newLatLngZoom(cameraPosition.target, cameraPosition.zoom); + IMapsProvider.CameraPosition cameraPosition = map.getCameraPosition(); + forceUpdate = ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(cameraPosition.target, cameraPosition.zoom); listView.smoothScrollBy(0, top + min); } } @@ -1276,15 +1257,15 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } } }); - googleMap.setOnMyLocationChangeListener(location -> { + map.setOnMyLocationChangeListener(location -> { if (parentAlert == null || parentAlert.baseFragment == null) { return; } positionMarker(location); - getLocationController().setGoogleMapLocation(location, isFirstLocation); + getLocationController().setMapLocation(location, isFirstLocation); isFirstLocation = false; }); - googleMap.setOnMarkerClickListener(marker -> { + map.setOnMarkerClickListener(marker -> { if (!(marker.getTag() instanceof VenueLocation)) { return true; } @@ -1297,7 +1278,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa overlayView.addInfoView(marker); return true; }); - googleMap.setOnCameraMoveListener(() -> { + map.setOnCameraMoveListener(() -> { if (overlayView != null) { overlayView.updatePositions(); } @@ -1383,18 +1364,18 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mapViewClip.getLayoutParams(); if (layoutParams != null) { if (height <= 0) { - if (mapView.getVisibility() == View.VISIBLE) { - mapView.setVisibility(INVISIBLE); + if (mapView.getView().getVisibility() == View.VISIBLE) { + mapView.getView().setVisibility(INVISIBLE); mapViewClip.setVisibility(INVISIBLE); if (overlayView != null) { overlayView.setVisibility(INVISIBLE); } } - mapView.setTranslationY(top); + mapView.getView().setTranslationY(top); return; } - if (mapView.getVisibility() == View.INVISIBLE) { - mapView.setVisibility(VISIBLE); + if (mapView.getView().getVisibility() == View.INVISIBLE) { + mapView.getView().setVisibility(VISIBLE); mapViewClip.setVisibility(VISIBLE); if (overlayView != null) { overlayView.setVisibility(VISIBLE); @@ -1410,13 +1391,13 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } clipSize = (int) (maxClipSize * moveProgress); - mapView.setTranslationY(trY); + mapView.getView().setTranslationY(trY); nonClipSize = maxClipSize - clipSize; mapViewClip.invalidate(); mapViewClip.setTranslationY(top - nonClipSize); - if (googleMap != null) { - googleMap.setPadding(0, AndroidUtilities.dp(6), 0, clipSize + AndroidUtilities.dp(6)); + if (map != null) { + map.setPadding(0, AndroidUtilities.dp(6), 0, clipSize + AndroidUtilities.dp(6)); } if (overlayView != null) { overlayView.setTranslationY(trY); @@ -1427,18 +1408,18 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa locationButton.setTranslationY(-clipSize); markerImageView.setTranslationY(markerTop = (mapHeight - clipSize) / 2 - AndroidUtilities.dp(48) + trY); if (prevClipSize != clipSize) { - LatLng location; + IMapsProvider.LatLng location; if (lastPressedMarker != null) { - location = lastPressedMarker.getPosition(); + location = new IMapsProvider.LatLng(lastPressedMarker.getPosition().latitude, lastPressedMarker.getPosition().longitude); } else if (userLocationMoved) { - location = new LatLng(userLocation.getLatitude(), userLocation.getLongitude()); + location = new IMapsProvider.LatLng(userLocation.getLatitude(), userLocation.getLongitude()); } else if (myLocation != null) { - location = new LatLng(myLocation.getLatitude(), myLocation.getLongitude()); + location = new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude()); } else { location = null; } if (location != null) { - googleMap.moveCamera(CameraUpdateFactory.newLatLng(location)); + map.moveCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(location)); } } @@ -1494,10 +1475,10 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa searchListView.setLayoutParams(layoutParams); adapter.setOverScrollHeight(locationDenied && isTypeSend() ? overScrollHeight - listView.getPaddingTop() : overScrollHeight); - layoutParams = (FrameLayout.LayoutParams) mapView.getLayoutParams(); + layoutParams = (FrameLayout.LayoutParams) mapView.getView().getLayoutParams(); if (layoutParams != null) { layoutParams.height = mapHeight + AndroidUtilities.dp(10); - mapView.setLayoutParams(layoutParams); + mapView.getView().setLayoutParams(layoutParams); } if (overlayView != null) { layoutParams = (FrameLayout.LayoutParams) overlayView.getLayoutParams(); @@ -1511,6 +1492,7 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa updateClipView(); } + @SuppressLint("MissingPermission") private Location getLastLocation() { LocationManager lm = (LocationManager) ApplicationLoader.applicationContext.getSystemService(Context.LOCATION_SERVICE); List providers = lm.getProviders(true); @@ -1530,8 +1512,8 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } myLocation = new Location(location); - if (googleMap != null) { - LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + if (map != null) { + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(location.getLatitude(), location.getLongitude()); if (adapter != null) { if (!searchedForCustomLocations) { adapter.searchPlacesWithQuery(null, myLocation, true); @@ -1541,12 +1523,12 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa if (!userLocationMoved) { userLocation = new Location(location); if (firstWas) { - CameraUpdate position = CameraUpdateFactory.newLatLng(latLng); - googleMap.animateCamera(position); + IMapsProvider.ICameraUpdate position = ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(latLng); + map.animateCamera(position); } else { firstWas = true; - CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 4); - googleMap.moveCamera(position); + IMapsProvider.ICameraUpdate position = ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(latLng, map.getMaxZoomLevel() - 4); + map.moveCamera(position); } } } else { @@ -1561,9 +1543,9 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa if (adapter != null) { adapter.setMyLocationDenied(locationDenied); } - if (googleMap != null) { + if (map != null) { try { - googleMap.setMyLocationEnabled(true); + map.setMyLocationEnabled(true); } catch (Exception e) { FileLog.e(e); } @@ -1593,8 +1575,8 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa @Override void onShow(ChatAttachAlert.AttachAlertLayout previousLayout) { parentAlert.actionBar.setTitle(LocaleController.getString("ShareLocation", R.string.ShareLocation)); - if (mapView.getParent() == null) { - mapViewClip.addView(mapView, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, overScrollHeight + AndroidUtilities.dp(10), Gravity.TOP | Gravity.LEFT)); + if (mapView.getView().getParent() == null) { + mapViewClip.addView(mapView.getView(), 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, overScrollHeight + AndroidUtilities.dp(10), Gravity.TOP | Gravity.LEFT)); mapViewClip.addView(overlayView, 1, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, overScrollHeight + AndroidUtilities.dp(10), Gravity.TOP | Gravity.LEFT)); mapViewClip.addView(loadingMapView, 2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); } @@ -1608,9 +1590,9 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa } } onResumeCalled = true; - if (googleMap != null) { + if (map != null) { try { - googleMap.setMyLocationEnabled(true); + map.setMyLocationEnabled(true); } catch (Exception e) { FileLog.e(e); } @@ -1648,17 +1630,17 @@ public class ChatAttachAlertLocationLayout extends ChatAttachAlert.AttachAlertLa mapTypeButton.setPopupItemsColor(getThemedColor(Theme.key_actionBarDefaultSubmenuItemIcon), true); mapTypeButton.setPopupItemsColor(getThemedColor(Theme.key_actionBarDefaultSubmenuItem), false); - if (googleMap != null) { + if (map != null) { if (isActiveThemeDark()) { if (!currentMapStyleDark) { currentMapStyleDark = true; - MapStyleOptions style = MapStyleOptions.loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); - googleMap.setMapStyle(style); + IMapsProvider.IMapStyleOptions style = ApplicationLoader.getMapsProvider().loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); + map.setMapStyle(style); } } else { if (currentMapStyleDark) { currentMapStyleDark = false; - googleMap.setMapStyle(null); + map.setMapStyle(null); } } } 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 0892815fa..31f0b199b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java @@ -406,6 +406,9 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou if (selectedPhotos.isEmpty() && photoEntry != null) { addToSelectedPhotos(photoEntry, -1); } + if (parentAlert.checkCaption(parentAlert.commentTextView.getText())) { + return; + } parentAlert.applyCaption(); if (PhotoViewer.getInstance().hasCaptionForAllMedia) { HashMap selectedPhotos = getSelectedPhotos(); @@ -417,6 +420,9 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou MediaController.PhotoEntry photoEntry1 = (MediaController.PhotoEntry) o; if (a == 0) { photoEntry1.caption = PhotoViewer.getInstance().captionForAllMedia; + if (parentAlert.checkCaption(photoEntry1.caption)) { + return; + } } else { photoEntry1.caption = null; } @@ -1976,6 +1982,7 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou FileOutputStream stream = new FileOutputStream(file); lastBitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream); lastBitmap.recycle(); + stream.close(); } } } catch (Throwable ignore) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayoutPreview.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayoutPreview.java index 21e32b8f8..498475d87 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayoutPreview.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayoutPreview.java @@ -456,7 +456,6 @@ public class ChatAttachAlertPhotoLayoutPreview extends ChatAttachAlert.AttachAle position1.set(0, 0, 0, 1, leftWidth, 1.0f, POSITION_FLAG_LEFT | POSITION_FLAG_BOTTOM | POSITION_FLAG_TOP); position2.set(1, 1, 0, 0, rightWidth, secondHeight / maxSizeHeight, POSITION_FLAG_RIGHT | POSITION_FLAG_TOP); - // dkaraush: wtf, why it had minX=0 ? position3.set(1, 1, 1, 1, rightWidth, thirdHeight / maxSizeHeight, POSITION_FLAG_RIGHT | POSITION_FLAG_BOTTOM); position3.spanSize = maxSizeWidth; @@ -512,10 +511,8 @@ public class ChatAttachAlertPhotoLayoutPreview extends ChatAttachAlert.AttachAle position1.set(0, 0, 0, 2, w0, h0 + h1 + h2, POSITION_FLAG_LEFT | POSITION_FLAG_TOP | POSITION_FLAG_BOTTOM); position2.set(1, 1, 0, 0, w, h0, POSITION_FLAG_RIGHT | POSITION_FLAG_TOP); - // dkaraush: wtf, why it had minX=0 ? position3.set(1, 1, 1, 1, w, h1, POSITION_FLAG_RIGHT); position3.spanSize = maxSizeWidth; - // dkaraush: wtf, why it had minX=0 ? position4.set(1, 1, 2, 2, w, h2, POSITION_FLAG_RIGHT | POSITION_FLAG_BOTTOM); position4.spanSize = maxSizeWidth; 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 76f384c55..e650cbbfa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java @@ -413,7 +413,7 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int actionBarHeight = ActionBar.getCurrentActionBarHeight(); int viewTop = (actionBarHeight - AndroidUtilities.dp(42)) / 2 + (Build.VERSION.SDK_INT >= 21 && occupyStatusBar ? AndroidUtilities.statusBarHeight : 0); - avatarImageView.layout(leftPadding, viewTop, leftPadding + AndroidUtilities.dp(42), viewTop + AndroidUtilities.dp(42)); + avatarImageView.layout(leftPadding, viewTop + 1, leftPadding + AndroidUtilities.dp(42), viewTop + 1 + AndroidUtilities.dp(42)); int l = leftPadding + (avatarImageView.getVisibility() == VISIBLE ? AndroidUtilities.dp( 54) : 0); if (subtitleTextView.getVisibility() != GONE) { titleTextView.layout(l, viewTop + AndroidUtilities.dp(1.3f), l + titleTextView.getMeasuredWidth(), viewTop + titleTextView.getTextHeight() + AndroidUtilities.dp(1.3f)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBox2.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBox2.java index bf86ff1ea..6626ca270 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBox2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBox2.java @@ -2,10 +2,12 @@ package org.telegram.ui.Components; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Paint; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.CheckBox; +import org.telegram.messenger.GenericProvider; import org.telegram.ui.ActionBar.Theme; public class CheckBox2 extends View { @@ -21,6 +23,10 @@ public class CheckBox2 extends View { checkBoxBase = new CheckBoxBase(this, sz, resourcesProvider); } + public void setCirclePaintProvider(GenericProvider circlePaintProvider) { + checkBoxBase.setCirclePaintProvider(circlePaintProvider); + } + public void setProgressDelegate(CheckBoxBase.ProgressDelegate delegate) { checkBoxBase.setProgressDelegate(delegate); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBoxBase.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBoxBase.java index 62b055096..4e1642f73 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBoxBase.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CheckBoxBase.java @@ -20,6 +20,7 @@ import android.view.View; import androidx.annotation.Keep; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.GenericProvider; import org.telegram.ui.ActionBar.Theme; public class CheckBoxBase { @@ -68,6 +69,8 @@ public class CheckBoxBase { private Theme.MessageDrawable messageDrawable; private final Theme.ResourcesProvider resourcesProvider; + private GenericProvider circlePaintProvider = obj -> paint; + public interface ProgressDelegate { void setProgress(float progress); } @@ -375,12 +378,17 @@ public class CheckBoxBase { } if (backgroundType != -1) { + Paint circlePaint = circlePaintProvider.provide(null); if (backgroundType == 12 || backgroundType == 13) { - paint.setAlpha((int) (255 * roundProgress)); - bitmapCanvas.drawCircle(drawBitmap.getWidth() / 2, drawBitmap.getHeight() / 2, rad * roundProgress, paint); + int a = circlePaint.getAlpha(); + circlePaint.setAlpha((int) (255 * roundProgress)); + bitmapCanvas.drawCircle(drawBitmap.getWidth() / 2, drawBitmap.getHeight() / 2, rad * roundProgress, circlePaint); + if (circlePaint != paint) { + circlePaint.setAlpha(a); + } } else { rad -= AndroidUtilities.dp(0.5f); - bitmapCanvas.drawCircle(drawBitmap.getWidth() / 2, drawBitmap.getHeight() / 2, rad, paint); + bitmapCanvas.drawCircle(drawBitmap.getWidth() / 2, drawBitmap.getHeight() / 2, rad, circlePaint); bitmapCanvas.drawCircle(drawBitmap.getWidth() / 2, drawBitmap.getHeight() / 2, rad * (1.0f - roundProgress), eraser); } canvas.drawBitmap(drawBitmap, cx - drawBitmap.getWidth() / 2, cy - drawBitmap.getHeight() / 2, null); @@ -436,6 +444,10 @@ public class CheckBoxBase { } } + public void setCirclePaintProvider(GenericProvider circlePaintProvider) { + this.circlePaintProvider = circlePaintProvider; + } + private int getThemedColor(String key) { Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null; return color != null ? color : Theme.getColor(key); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java index 9aed2dcb0..d9d165076 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java @@ -100,6 +100,8 @@ public class CrossOutDrawable extends Drawable { startY = startY + (stopY - startY) * (1f - progress); } canvas.drawLine(startX, startY - paint.getStrokeWidth(), stopX, stopY - paint.getStrokeWidth(), xRefPaint); + float offsetY = (xRefPaint.getStrokeWidth() - paint.getStrokeWidth()) / 2f + 1; + canvas.drawLine(startX, startY - offsetY, stopX, stopY - offsetY, xRefPaint); canvas.drawLine(startX, startY, stopX, stopY, paint); canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/DrawingInBackgroundThreadDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/DrawingInBackgroundThreadDrawable.java new file mode 100644 index 000000000..0f0fb81e5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/DrawingInBackgroundThreadDrawable.java @@ -0,0 +1,254 @@ +package org.telegram.ui.Components; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DispatchQueue; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.SharedConfig; + +import java.util.ArrayList; + +public class DrawingInBackgroundThreadDrawable implements NotificationCenter.NotificationCenterDelegate { + + boolean attachedToWindow; + + Bitmap backgroundBitmap; + Canvas backgroundCanvas; + + Bitmap bitmap; + Canvas bitmapCanvas; + + Bitmap nextRenderingBitmap; + Canvas nextRenderingCanvas; + + private boolean bitmapUpdating; + + public int currentLayerNum = 1; + private int currentOpenedLayerFlags; + protected boolean paused; + + private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + int frameGuid; + + int height; + int width; + int padding; + + private static DispatchQueue backgroundQueue; + boolean error; + + Runnable bitmapCreateTask = new Runnable() { + @Override + public void run() { + try { + int heightInternal = height + padding; + if (backgroundBitmap == null || backgroundBitmap.getWidth() != width || backgroundBitmap.getHeight() != heightInternal) { + if (backgroundBitmap != null) { + backgroundBitmap.recycle(); + } + backgroundBitmap = Bitmap.createBitmap(width, heightInternal, Bitmap.Config.ARGB_8888); + + backgroundCanvas = new Canvas(backgroundBitmap); + } + + backgroundBitmap.eraseColor(Color.TRANSPARENT); + backgroundCanvas.save(); + backgroundCanvas.translate(0, padding); + drawInBackground(backgroundCanvas); + backgroundCanvas.restore(); + + } catch (Exception e) { + FileLog.e(e); + error = true; + } + + AndroidUtilities.runOnUIThread(uiFrameRunnable); + } + }; + + Runnable uiFrameRunnable = new Runnable() { + @Override + public void run() { + bitmapUpdating = false; + onFrameReady(); + if (!attachedToWindow) { + if (backgroundBitmap != null) { + backgroundBitmap.recycle(); + backgroundBitmap = null; + } + return; + } + if (frameGuid != lastFrameId) { + return; + } + Bitmap bitmapTmp = bitmap; + Canvas bitmapCanvasTmp = bitmapCanvas; + + bitmap = nextRenderingBitmap; + bitmapCanvas = nextRenderingCanvas; + + nextRenderingBitmap = backgroundBitmap; + nextRenderingCanvas = backgroundCanvas; + + backgroundBitmap = bitmapTmp; + backgroundCanvas = bitmapCanvasTmp; + } + }; + private boolean reset; + private int lastFrameId; + + DrawingInBackgroundThreadDrawable() { + if (backgroundQueue == null) { + backgroundQueue = new DispatchQueue("draw_background_queue"); + } + } + + public void draw(Canvas canvas, long time, int w, int h, float alpha) { + if (error) { + return; + } + height = h; + width = w; + + if ((bitmap == null && nextRenderingBitmap == null) || reset) { + reset = false; + + if (bitmap != null) { + ArrayList bitmaps = new ArrayList<>(); + bitmaps.add(bitmap); + AndroidUtilities.recycleBitmaps(bitmaps); + bitmap = null; + } + int heightInternal = height + padding; + if (nextRenderingBitmap == null || nextRenderingBitmap.getHeight() != heightInternal || nextRenderingBitmap.getWidth() != width) { + nextRenderingBitmap = Bitmap.createBitmap(width, heightInternal, Bitmap.Config.ARGB_8888); + nextRenderingCanvas = new Canvas(nextRenderingBitmap); + } else { + nextRenderingBitmap.eraseColor(Color.TRANSPARENT); + } + nextRenderingCanvas.save(); + nextRenderingCanvas.translate(0, padding); + drawInUiThread(nextRenderingCanvas); + nextRenderingCanvas.restore(); + } + + if (!bitmapUpdating && !paused) { + bitmapUpdating = true; + prepareDraw(time); + lastFrameId = frameGuid; + backgroundQueue.postRunnable(bitmapCreateTask); + } + + if (bitmap != null || nextRenderingBitmap != null) { + Bitmap drawingBitmap = bitmap; + if (drawingBitmap == null) { + drawingBitmap = nextRenderingBitmap; + } + paint.setAlpha((int) (255 * alpha)); + canvas.save(); + canvas.translate(0, -padding); + canvas.drawBitmap(drawingBitmap, 0, 0, paint); + canvas.restore(); + } + } + + protected void drawInUiThread(Canvas nextRenderingCanvas) { + + } + + public void drawInBackground(Canvas canvas) { + + } + + public void prepareDraw(long time) { + + } + + public void onFrameReady() { + + } + + public void onAttachToWindow() { + attachedToWindow = true; + currentOpenedLayerFlags = NotificationCenter.getGlobalInstance().getCurrentHeavyOperationFlags(); + currentOpenedLayerFlags &= ~currentLayerNum; + if (currentOpenedLayerFlags == 0) { + if (paused) { + paused = false; + onResume(); + } + } + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.stopAllHeavyOperations); + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.startAllHeavyOperations); + } + + public void onDetachFromWindow() { + ArrayList bitmaps = new ArrayList<>(); + if (bitmap != null) { + bitmaps.add(bitmap); + } + if (nextRenderingBitmap != null) { + bitmaps.add(nextRenderingBitmap); + } + bitmap = null; + nextRenderingBitmap = null; + AndroidUtilities.recycleBitmaps(bitmaps); + attachedToWindow = false; + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.stopAllHeavyOperations); + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.startAllHeavyOperations); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.stopAllHeavyOperations) { + Integer layer = (Integer) args[0]; + if (currentLayerNum >= layer || (layer == 512 && (SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH))) { + return; + } + currentOpenedLayerFlags |= layer; + if (currentOpenedLayerFlags != 0) { + if (!paused) { + paused = true; + onPaused(); + } + } + } else if (id == NotificationCenter.startAllHeavyOperations) { + Integer layer = (Integer) args[0]; + if (currentLayerNum >= layer || currentOpenedLayerFlags == 0) { + return; + } + currentOpenedLayerFlags &= ~layer; + if (currentOpenedLayerFlags == 0) { + if (paused) { + paused = false; + onResume(); + } + } + } + } + + public void onResume() { + + } + + public void onPaused() { + + } + + public void reset() { + reset = true; + frameGuid++; + + if (bitmap != null) { + ArrayList bitmaps = new ArrayList<>(); + bitmaps.add(bitmap); + bitmap = null; + AndroidUtilities.recycleBitmaps(bitmaps); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java index 0a62881f8..92179118c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java @@ -27,6 +27,7 @@ import android.os.SystemClock; import androidx.annotation.Keep; import androidx.annotation.Nullable; +import androidx.core.graphics.ColorUtils; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import android.text.Layout; @@ -69,6 +70,7 @@ public class EditTextBoldCursor extends EditTextEffects { private static Method getVerticalOffsetMethod; private static Class editorClass; private static Field mCursorDrawableResField; + private static Method mEditorInvalidateDisplayList; private Drawable mCursorDrawable; private Object editor; @@ -331,9 +333,11 @@ public class EditTextBoldCursor extends EditTextEffects { try { mShowCursorField = editorClass.getDeclaredField("mShowCursor"); mShowCursorField.setAccessible(true); - } catch (Exception ignore) { - - } + } catch (Exception ignore) {} + try { + mEditorInvalidateDisplayList = editorClass.getDeclaredMethod("invalidateTextDisplayList"); + mEditorInvalidateDisplayList.setAccessible(true); + } catch (Exception ignore) {} getVerticalOffsetMethod = TextView.class.getDeclaredMethod("getVerticalOffset", boolean.class); getVerticalOffsetMethod.setAccessible(true); } @@ -634,6 +638,20 @@ public class EditTextBoldCursor extends EditTextEffects { return super.onTouchEvent(event); } + public void invalidateForce() { + if (!isHardwareAccelerated()) { + invalidate(); + return; + } + try { + // on hardware accelerated edittext to invalidate imagespan display list must be invalidated + if (mEditorInvalidateDisplayList != null && editor != null) { + mEditorInvalidateDisplayList.invoke(editor); + } + } catch (Exception ignore) {}; + invalidate(); + } + @Override protected void onDraw(Canvas canvas) { if ((length() == 0 || transformHintToHeader) && hintLayout != null && (hintVisible || hintAlpha != 0)) { @@ -682,7 +700,7 @@ public class EditTextBoldCursor extends EditTextEffects { } canvas.scale(scale, scale); canvas.translate(0, -AndroidUtilities.dp(22) * headerAnimationProgress); - getPaint().setColor(AndroidUtilities.lerpColor(hintColor, headerHintColor, headerAnimationProgress)); + getPaint().setColor(ColorUtils.blendARGB(hintColor, headerHintColor, headerAnimationProgress)); } else { getPaint().setColor(hintColor); getPaint().setAlpha((int) (255 * hintAlpha * (Color.alpha(hintColor) / 255.0f))); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextCaption.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextCaption.java index eb9bd6bc8..6fc099840 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextCaption.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextCaption.java @@ -9,6 +9,8 @@ package org.telegram.ui.Components; import android.annotation.SuppressLint; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; @@ -17,6 +19,8 @@ import android.os.Build; import android.os.Bundle; import android.text.Editable; import android.text.Layout; +import android.text.Spannable; +import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.StaticLayout; import android.text.TextPaint; @@ -37,10 +41,12 @@ import android.widget.FrameLayout; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.R; +import org.telegram.messenger.utils.CopyUtilities; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.Theme; @@ -95,6 +101,7 @@ public class EditTextCaption extends EditTextBoldCursor { } } }); + setClipToPadding(true); } protected void onLineCountChanged(int oldLineCount, int newLineCount) { @@ -198,14 +205,16 @@ public class EditTextCaption extends EditTextBoldCursor { if (spans != null && spans.length > 0) { for (int a = 0; a < spans.length; a++) { CharacterStyle oldSpan = spans[a]; - int spanStart = editable.getSpanStart(oldSpan); - int spanEnd = editable.getSpanEnd(oldSpan); - editable.removeSpan(oldSpan); - if (spanStart < start) { - editable.setSpan(oldSpan, spanStart, start, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - if (spanEnd > end) { - editable.setSpan(oldSpan, end, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + if (!(oldSpan instanceof AnimatedEmojiSpan)) { + int spanStart = editable.getSpanStart(oldSpan); + int spanEnd = editable.getSpanEnd(oldSpan); + editable.removeSpan(oldSpan); + if (spanStart < start) { + editable.setSpan(oldSpan, spanStart, start, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + if (spanEnd > end) { + editable.setSpan(oldSpan, end, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } } } } @@ -275,11 +284,20 @@ public class EditTextCaption extends EditTextBoldCursor { } } + protected void onContextMenuOpen() { + + } + + protected void onContextMenuClose() { + + } + private ActionMode.Callback overrideCallback(final ActionMode.Callback callback) { ActionMode.Callback wrap = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { copyPasteShowed = true; + onContextMenuOpen(); return callback.onCreateActionMode(mode, menu); } @@ -305,6 +323,7 @@ public class EditTextCaption extends EditTextBoldCursor { @Override public void onDestroyActionMode(ActionMode mode) { copyPasteShowed = false; + onContextMenuClose(); callback.onDestroyActionMode(mode); } }; @@ -504,4 +523,59 @@ public class EditTextCaption extends EditTextBoldCursor { Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null; return color != null ? color : Theme.getColor(key); } + + @Override + public boolean onTextContextMenuItem(int id) { + if (id == android.R.id.paste) { + ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = clipboard.getPrimaryClip(); + if (clipData != null && clipData.getItemCount() == 1 && clipData.getDescription().hasMimeType("text/html")) { + try { + String html = clipData.getItemAt(0).getHtmlText(); + Spannable pasted = CopyUtilities.fromHTML(html); + Emoji.replaceEmoji(pasted, getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false, null, true); + AnimatedEmojiSpan[] spans = pasted.getSpans(0, pasted.length(), AnimatedEmojiSpan.class); + if (spans != null) { + for (int k = 0; k < spans.length; ++k) { + spans[k].applyFontMetrics(getPaint().getFontMetricsInt(), AnimatedEmojiDrawable.getCacheTypeForEnterView()); + } + } + int start = Math.max(0, getSelectionStart()); + int end = Math.min(getText().length(), getSelectionEnd()); + setText(getText().replace(start, end, pasted)); + setSelection(start + pasted.length(), start + pasted.length()); + return true; + } catch (Exception e) { + FileLog.e(e); + } + } + } else if (id == android.R.id.copy) { + int start = Math.max(0, getSelectionStart()); + int end = Math.min(getText().length(), getSelectionEnd()); + try { + AndroidUtilities.addToClipboard(getText().subSequence(start, end)); + return true; + } catch (Exception e) { + + } + } else if (id == android.R.id.cut) { + int start = Math.max(0, getSelectionStart()); + int end = Math.min(getText().length(), getSelectionEnd()); + try { + AndroidUtilities.addToClipboard(getText().subSequence(start, end)); + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); + if (start != 0) { + stringBuilder.append(getText().subSequence(0, start)); + } + if (end != getText().length()) { + stringBuilder.append(getText().subSequence(end, getText().length())); + } + setText(stringBuilder); + return true; + } catch (Exception e) { + + } + } + return super.onTextContextMenuItem(id); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEffects.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEffects.java index 5a61d9152..6ed158267 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEffects.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEffects.java @@ -11,6 +11,7 @@ import android.text.Spannable; import android.view.MotionEvent; import android.widget.EditText; +import org.telegram.messenger.AndroidUtilities; import org.telegram.ui.Components.spoilers.SpoilerEffect; import org.telegram.ui.Components.spoilers.SpoilersClickDetector; @@ -31,6 +32,10 @@ public class EditTextEffects extends EditText { private int selStart, selEnd; private float lastRippleX, lastRippleY; private boolean postedSpoilerTimeout; + private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiDrawables; + private Layout lastLayout = null; + private int lastTextLength; + private Runnable spoilerTimeout = () -> { postedSpoilerTimeout = false; isSpoilersRevealed = false; @@ -45,6 +50,7 @@ public class EditTextEffects extends EditText { } }; private Rect rect = new Rect(); + private boolean clipToPadding; public EditTextEffects(Context context) { super(context); @@ -118,6 +124,13 @@ public class EditTextEffects extends EditText { super.onDetachedFromWindow(); removeCallbacks(spoilerTimeout); + AnimatedEmojiSpan.release(this, animatedEmojiDrawables); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + updateAnimatedEmoji(false); } @Override @@ -149,6 +162,8 @@ public class EditTextEffects extends EditText { } } } + updateAnimatedEmoji(true); + invalidate(); } @Override @@ -161,6 +176,12 @@ public class EditTextEffects extends EditText { super.setText(text, type); } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + updateAnimatedEmoji(false); + } + /** * Sets if spoilers should be revealed by touch or not */ @@ -210,13 +231,20 @@ public class EditTextEffects extends EditText { @Override protected void onDraw(Canvas canvas) { canvas.save(); + if (clipToPadding && getScrollY() != 0) { + canvas.clipRect(0, getScrollY(), getMeasuredWidth(), getMeasuredHeight() + getScrollY()); + } path.rewind(); for (SpoilerEffect eff : spoilers) { Rect bounds = eff.getBounds(); path.addRect(bounds.left, bounds.top, bounds.right, bounds.bottom, Path.Direction.CW); } canvas.clipPath(path, Region.Op.DIFFERENCE); + updateAnimatedEmoji(false); super.onDraw(canvas); + if (animatedEmojiDrawables != null) { + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, getLayout(), animatedEmojiDrawables, 0, spoilers, computeVerticalScrollOffset() - AndroidUtilities.dp(6), computeVerticalScrollOffset() + computeVerticalScrollExtent(), 0, 1f); + } canvas.restore(); canvas.save(); @@ -242,6 +270,15 @@ public class EditTextEffects extends EditText { canvas.restore(); } + public void updateAnimatedEmoji(boolean force) { + int newTextLength = (getLayout() == null || getLayout().getText() == null) ? 0 : getLayout().getText().length(); + if (force || lastLayout != getLayout() || lastTextLength != newTextLength) { + animatedEmojiDrawables = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.getCacheTypeForEnterView(), this, animatedEmojiDrawables, getLayout()); + lastLayout = getLayout(); + lastTextLength = newTextLength; + } + } + public void invalidateEffects() { Editable text = getText(); if (text != null) { @@ -266,8 +303,18 @@ public class EditTextEffects extends EditText { Layout layout = getLayout(); if (layout != null && layout.getText() instanceof Spannable) { + if (animatedEmojiDrawables != null) { + animatedEmojiDrawables.recordPositions(false); + } SpoilerEffect.addSpoilers(this, spoilersPool, spoilers); + if (animatedEmojiDrawables != null) { + animatedEmojiDrawables.recordPositions(true); + } } invalidate(); } + + public void setClipToPadding(boolean clipToPadding) { + this.clipToPadding = clipToPadding; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java index 121a9b867..76a3e2c4b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java @@ -3,19 +3,25 @@ package org.telegram.ui.Components; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.app.Activity; +import android.app.Dialog; import android.content.Context; +import android.content.ContextWrapper; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.os.Build; import android.text.Editable; import android.text.InputFilter; import android.text.InputType; +import android.text.SpannableString; +import android.text.Spanned; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.EditorInfo; +import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; @@ -27,10 +33,16 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.AdjustPanLayoutHelper; 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.Premium.PremiumFeatureBottomSheet; +import org.telegram.ui.PhotoViewer; +import org.telegram.ui.PremiumPreviewFragment; public class EditTextEmoji extends FrameLayout implements NotificationCenter.NotificationCenterDelegate, SizeNotifierFrameLayout.SizeNotifierFrameLayoutDelegate { @@ -52,6 +64,7 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not private int lastSizeChangeValue1; private boolean lastSizeChangeValue2; private int innerTextChange; + private boolean allowAnimatedEmoji; AdjustPanLayoutHelper adjustPanLayoutHelper; private EditTextEmojiDelegate delegate; @@ -96,12 +109,13 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not void onWindowSizeChanged(int size); } - public EditTextEmoji(Context context, SizeNotifierFrameLayout parent, BaseFragment fragment, int style) { - this(context, parent, fragment, style, null); + public EditTextEmoji(Context context, SizeNotifierFrameLayout parent, BaseFragment fragment, int style, boolean allowAnimatedEmoji) { + this(context, parent, fragment, style, allowAnimatedEmoji, null); } - public EditTextEmoji(Context context, SizeNotifierFrameLayout parent, BaseFragment fragment, int style, Theme.ResourcesProvider resourcesProvider) { + public EditTextEmoji(Context context, SizeNotifierFrameLayout parent, BaseFragment fragment, int style, boolean allowAnimatedEmoji, Theme.ResourcesProvider resourcesProvider) { super(context); + this.allowAnimatedEmoji = allowAnimatedEmoji; this.resourcesProvider = resourcesProvider; currentStyle = style; @@ -386,9 +400,7 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not protected void showPopup(int show) { if (show == 1) { boolean emojiWasVisible = emojiView != null && emojiView.getVisibility() == View.VISIBLE; - if (emojiView == null) { - createEmojiView(); - } + createEmojiView(); emojiView.setVisibility(VISIBLE); emojiViewVisible = true; @@ -477,11 +489,19 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not } } + protected void closeParent() { + + } + protected void createEmojiView() { + if (emojiView != null && emojiView.currentAccount != UserConfig.selectedAccount) { + sizeNotifierLayout.removeView(emojiView); + emojiView = null; + } if (emojiView != null) { return; } - emojiView = new EmojiView(false, false, getContext(), false, null, null, resourcesProvider); + emojiView = new EmojiView(parentFragment, allowAnimatedEmoji, false, false, getContext(), false, null, null, resourcesProvider); emojiView.setVisibility(GONE); if (AndroidUtilities.isTablet()) { emojiView.setForseMultiwindowLayout(true); @@ -496,6 +516,50 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not return true; } + @Override + public void onAnimatedEmojiUnlockClick() { + BaseFragment fragment = parentFragment; + if (fragment == null) { + fragment = new BaseFragment() { + @Override + public int getCurrentAccount() { + return currentAccount; + } + + @Override + public Context getContext() { + return EditTextEmoji.this.getContext(); + } + + @Override + public Activity getParentActivity() { + Context context = getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; + } + context = ((ContextWrapper) context).getBaseContext(); + } + return null; + } + + @Override + public Dialog getVisibleDialog() { + return new Dialog(EditTextEmoji.this.getContext()) { + @Override + public void dismiss() { + hidePopup(false); + closeParent(); + } + }; + } + }; + new PremiumFeatureBottomSheet(fragment, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false).show(); + } else { + fragment.showDialog(new PremiumFeatureBottomSheet(fragment, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false)); + } + } + @Override public void onEmojiSelected(String symbol) { int i = editText.getSelectionEnd(); @@ -515,11 +579,37 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not } } + @Override + public void onCustomEmojiSelected(long documentId, TLRPC.Document document, String emoticon) { + int i = editText.getSelectionEnd(); + if (i < 0) { + i = 0; + } + try { + innerTextChange = 2; + SpannableString spannable = new SpannableString(emoticon); + AnimatedEmojiSpan span; + if (document != null) { + span = new AnimatedEmojiSpan(document, editText.getPaint().getFontMetricsInt()); + } else { + span = new AnimatedEmojiSpan(documentId, editText.getPaint().getFontMetricsInt()); + } + spannable.setSpan(span, 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + editText.setText(editText.getText().insert(i, spannable)); + int j = i + spannable.length(); + editText.setSelection(j, j); + } catch (Exception e) { + FileLog.e(e); + } finally { + innerTextChange = 0; + } + } + @Override public void onClearEmojiRecent() { AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), resourcesProvider); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("ClearRecentEmoji", R.string.ClearRecentEmoji)); + builder.setTitle(LocaleController.getString("ClearRecentEmojiTitle", R.string.ClearRecentEmojiTitle)); + builder.setMessage(LocaleController.getString("ClearRecentEmojiText", R.string.ClearRecentEmojiText)); builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), (dialogInterface, i) -> emojiView.clearRecentEmoji()); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); if (parentFragment != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java new file mode 100644 index 000000000..d67366d94 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java @@ -0,0 +1,1374 @@ +package org.telegram.ui.Components; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.os.SystemClock; +import android.text.TextUtils; +import android.util.Log; +import android.util.LongSparseArray; +import android.util.SparseArray; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.FrameLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.core.math.MathUtils; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageReceiver; +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.Utilities; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.Premium.PremiumButtonView; +import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; +import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PremiumPreviewFragment; + +import java.util.ArrayList; + +public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate { + + private LongSparseArray animatedEmojiDrawables; + + private BaseFragment fragment; + + private View paddingView; + private EmojiPacksLoader customEmojiPacks; + + private RecyclerListView listView; + private View shadowView; + private FrameLayout buttonsView; + private TextView addButtonView; + private TextView removeButtonView; + private PremiumButtonView premiumButtonView; + private GridLayoutManager gridLayoutManager; + + private CircularProgressDrawable progressDrawable; + + private boolean hasDescription; + private float loadT; + private float lastY; + private Float fromY; + + @Override + protected boolean canDismissWithSwipe() { + return false; + } + + public EmojiPacksAlert(BaseFragment fragment, Context context, Theme.ResourcesProvider resourceProvider, ArrayList stickerSets) { + super(context, false, resourceProvider); + boolean single = stickerSets.size() <= 1; + this.fragment = fragment; + fixNavigationBar(); + + customEmojiPacks = new EmojiPacksLoader(currentAccount, stickerSets) { + @Override + protected void onUpdate() { + updateButton(); + if (listView != null && listView.getAdapter() != null) { + listView.getAdapter().notifyDataSetChanged(); + } + } + }; + + progressDrawable = new CircularProgressDrawable(AndroidUtilities.dp(32), AndroidUtilities.dp(3.5f), getThemedColor(Theme.key_featuredStickers_addButton)); + + containerView = new FrameLayout(context) { + + private Paint paint = new Paint(); + private Path path = new Path(); + private Boolean lastOpen = null; + boolean attached; + SparseArray> viewsGroupedByLines = new SparseArray<>(); + ArrayList lineDrawables = new ArrayList<>(); + ArrayList lineDrawablesTmp = new ArrayList<>(); + ArrayList> unusedArrays = new ArrayList<>(); + ArrayList unusedLineDrawables = new ArrayList<>(); + + @Override + protected void dispatchDraw(Canvas canvas) { + if (!attached) { + return; + } + paint.setColor(getThemedColor(Theme.key_dialogBackground)); + paint.setShadowLayer(dp(2), 0, dp(-0.66f), 0x1e000000); + path.reset(); + float y = lastY = getListTop(); + float pad = 0; + if (fromY != null) { + float wasY = y; + y = AndroidUtilities.lerp(fromY, y + containerView.getY(), loadT) - containerView.getY(); + pad = y - wasY; + } + float stickToTop = (1f - MathUtils.clamp((y - containerView.getPaddingTop()) / AndroidUtilities.dp(32), 0, 1)); + y -= stickToTop * containerView.getPaddingTop(); + float r = dp((1f - stickToTop) * 14); + AndroidUtilities.rectTmp.set(getPaddingLeft(), y, getWidth() - getPaddingRight(), getBottom() + r); + path.addRoundRect(AndroidUtilities.rectTmp, r, r, Path.Direction.CW); + canvas.drawPath(path, paint); + + boolean open = stickToTop > .75f; + if (lastOpen == null || open != lastOpen) { + updateLightStatusBar(lastOpen = open); + } + + Theme.dialogs_onlineCirclePaint.setColor(getThemedColor(Theme.key_sheet_scrollUp)); + Theme.dialogs_onlineCirclePaint.setAlpha((int) (MathUtils.clamp(y / (float) AndroidUtilities.dp(20), 0, 1) * Theme.dialogs_onlineCirclePaint.getAlpha())); + int w = AndroidUtilities.dp(36); + y += AndroidUtilities.dp(10); + AndroidUtilities.rectTmp.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + AndroidUtilities.dp(4)); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(2), AndroidUtilities.dp(2), Theme.dialogs_onlineCirclePaint); + + shadowView.setVisibility(listView.canScrollVertically(1) || removeButtonView.getVisibility() == View.VISIBLE ? View.VISIBLE : View.INVISIBLE); + if (listView != null) { + canvas.save(); + canvas.translate(listView.getLeft(), listView.getTop() + pad); + canvas.clipRect(0, 0, listView.getWidth(), listView.getHeight()); + canvas.saveLayerAlpha(0, 0, listView.getWidth(), listView.getHeight(), (int) (255 * listView.getAlpha()), Canvas.ALL_SAVE_FLAG); + + for (int i = 0; i < viewsGroupedByLines.size(); i++) { + ArrayList arrayList = viewsGroupedByLines.valueAt(i); + arrayList.clear(); + unusedArrays.add(arrayList); + } + viewsGroupedByLines.clear(); + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + if (child instanceof EmojiImageView) { + if (animatedEmojiDrawables == null) { + animatedEmojiDrawables = new LongSparseArray<>(); + } + AnimatedEmojiSpan span = ((EmojiImageView) child).span; + if (span == null) { + continue; + } + long documentId = span.getDocumentId(); + AnimatedEmojiDrawable drawable = animatedEmojiDrawables.get(documentId); + if (drawable == null) { + animatedEmojiDrawables.put(documentId, drawable = AnimatedEmojiDrawable.make(currentAccount, AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW, documentId)); + } + drawable.addView(this); + ArrayList arrayList = viewsGroupedByLines.get(child.getTop()); + if (arrayList == null) { + if (!unusedArrays.isEmpty()) { + arrayList = unusedArrays.remove(unusedArrays.size() - 1); + } else { + arrayList = new ArrayList<>(); + } + viewsGroupedByLines.put(child.getTop(), arrayList); + } + arrayList.add((EmojiImageView) child); + } else { + canvas.save(); + canvas.translate(child.getLeft(), child.getTop()); + child.draw(canvas); + canvas.restore(); + } + } + + lineDrawablesTmp.clear(); + lineDrawablesTmp.addAll(lineDrawables); + lineDrawables.clear(); + + long time = System.currentTimeMillis(); + for (int i = 0; i < viewsGroupedByLines.size(); i++) { + ArrayList arrayList = viewsGroupedByLines.valueAt(i); + View firstView = arrayList.get(0); + int position = listView.getChildAdapterPosition(firstView); + DrawingInBackgroundLine drawable = null; + for (int k = 0; k < lineDrawablesTmp.size(); k++) { + if (lineDrawablesTmp.get(k).position == position) { + drawable = lineDrawablesTmp.get(k); + lineDrawablesTmp.remove(k); + break; + } + } + if (drawable == null) { + if (!unusedLineDrawables.isEmpty()) { + drawable = unusedLineDrawables.remove(unusedLineDrawables.size() - 1); + } else { + drawable = new DrawingInBackgroundLine(); + drawable.currentLayerNum = 7; + } + drawable.position = position; + drawable.onAttachToWindow(); + } + lineDrawables.add(drawable); + drawable.imageViewEmojis = arrayList; + canvas.save(); + canvas.translate(0, firstView.getY() + firstView.getPaddingTop()); + drawable.draw(canvas, time, getMeasuredWidth(), firstView.getMeasuredHeight() - firstView.getPaddingBottom(), 1f); + canvas.restore(); + } + + for (int i = 0; i < lineDrawablesTmp.size(); i++) { + if (unusedLineDrawables.size() < 3) { + unusedLineDrawables.add(lineDrawablesTmp.get(i)); + lineDrawablesTmp.get(i).imageViewEmojis = null; + lineDrawablesTmp.get(i).reset(); + + } else { + lineDrawablesTmp.get(i).onDetachFromWindow(); + } + } + lineDrawablesTmp.clear(); + canvas.restore(); + canvas.restore(); + + if (listView.getAlpha() < 1) { + int cx = getWidth() / 2; + int cy = ((int) y + getHeight()) / 2; + int R = AndroidUtilities.dp(16); + progressDrawable.setAlpha((int) (255 * (1f - listView.getAlpha()))); + progressDrawable.setBounds(cx - R, cy - R, cx + R, cy + R); + progressDrawable.draw(canvas); + invalidate(); + } + } + super.dispatchDraw(canvas); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN && event.getY() < getListTop() - AndroidUtilities.dp(6)) { + dismiss(); + } + return super.dispatchTouchEvent(event); + } + + class DrawingInBackgroundLine extends DrawingInBackgroundThreadDrawable { + public int position; + ArrayList imageViewEmojis; + ArrayList drawInBackgroundViews = new ArrayList<>(); + + + @Override + public void prepareDraw(long time) { + drawInBackgroundViews.clear(); + for (int i = 0; i < imageViewEmojis.size(); i++) { + EmojiImageView imageView = imageViewEmojis.get(i); + AnimatedEmojiSpan span = imageView.span; + if (span == null) { + continue; + } + AnimatedEmojiDrawable drawable = animatedEmojiDrawables.get(imageView.span.getDocumentId()); + if (drawable == null || drawable.getImageReceiver() == null) { + continue; + } + + drawable.update(time); + imageView.backgroundThreadDrawHolder = drawable.getImageReceiver().setDrawInBackgroundThread(imageView.backgroundThreadDrawHolder); + imageView.backgroundThreadDrawHolder.time = time; + drawable.setAlpha(255); + AndroidUtilities.rectTmp2.set(imageView.getLeft() + imageView.getPaddingLeft(), imageView.getPaddingTop(), imageView.getRight() - imageView.getPaddingRight(), imageView.getMeasuredHeight() - imageView.getPaddingBottom()); + imageView.backgroundThreadDrawHolder.setBounds(AndroidUtilities.rectTmp2); + imageView.imageReceiver = drawable.getImageReceiver(); + drawInBackgroundViews.add(imageView); + } + } + + @Override + public void drawInBackground(Canvas canvas) { + for (int i = 0; i < drawInBackgroundViews.size(); i++) { + EmojiImageView imageView = drawInBackgroundViews.get(i); + imageView.imageReceiver.draw(canvas, imageView.backgroundThreadDrawHolder); + } + } + + @Override + protected void drawInUiThread(Canvas canvas) { + if (imageViewEmojis != null) { + for (int i = 0; i < imageViewEmojis.size(); i++) { + EmojiImageView imageView = imageViewEmojis.get(i); + AnimatedEmojiSpan span = imageView.span; + if (span == null) { + continue; + } + AnimatedEmojiDrawable drawable = animatedEmojiDrawables.get(imageView.span.getDocumentId()); + if (drawable == null || drawable.getImageReceiver() == null) { + continue; + } + if (imageView.imageReceiver != null) { + drawable.setAlpha((int) (255 * imageView.getAlpha())); + drawable.setBounds(imageView.getLeft() + imageView.getPaddingLeft(), imageView.getPaddingTop(), imageView.getRight() - imageView.getPaddingRight(), imageView.getMeasuredHeight() - imageView.getPaddingBottom()); + drawable.draw(canvas); + } + } + } + } + + @Override + public void onFrameReady() { + super.onFrameReady(); + for (int i = 0; i < drawInBackgroundViews.size(); i++) { + EmojiImageView imageView = drawInBackgroundViews.get(i); + imageView.backgroundThreadDrawHolder.release(); + } + containerView.invalidate(); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + attached = true; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + attached = false; + for (int i = 0; i < lineDrawables.size(); i++) { + lineDrawables.get(i).onDetachFromWindow(); + } + for (int i = 0; i < unusedLineDrawables.size(); i++) { + unusedLineDrawables.get(i).onDetachFromWindow(); + } + lineDrawables.clear(); + } + }; + + paddingView = new View(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + boolean isPortrait = AndroidUtilities.displaySize.x < AndroidUtilities.displaySize.y; + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec((int) (AndroidUtilities.displaySize.y * (isPortrait ? .56f : .3f)), MeasureSpec.EXACTLY)); + } + }; + listView = new RecyclerListView(context) { + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + int width = MeasureSpec.getSize(widthSpec); + gridLayoutManager.setSpanCount(Math.max(1, width / AndroidUtilities.dp(AndroidUtilities.isTablet() ? 60 : 45))); + super.onMeasure(widthSpec, heightSpec); + } + + @Override + public void onScrolled(int dx, int dy) { + super.onScrolled(dx, dy); + containerView.invalidate(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + AnimatedEmojiSpan.release(containerView, animatedEmojiDrawables); + } + + @Override + public boolean drawChild(Canvas canvas, View child, long drawingTime) { + return false; + } + }; + containerView.setPadding(backgroundPaddingLeft, AndroidUtilities.statusBarHeight, backgroundPaddingLeft, 0); + containerView.setClipChildren(false); + containerView.setClipToPadding(false); + containerView.setWillNotDraw(false); + listView.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), AndroidUtilities.dp(68)); + listView.setAdapter(new Adapter()); + listView.setLayoutManager(gridLayoutManager = new GridLayoutManager(context, 8)); + listView.addItemDecoration(new RecyclerView.ItemDecoration() { + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + if (view instanceof SeparatorView) { + outRect.left = -listView.getPaddingLeft(); + outRect.right = -listView.getPaddingRight(); + } else if (listView.getChildAdapterPosition(view) == 1) { + outRect.top = AndroidUtilities.dp(14); + } + } + }); + listView.setOnItemClickListener((view, position) -> { + if (stickerSets == null || stickerSets.size() <= 1) { + return; + } + if (SystemClock.elapsedRealtime() - premiumButtonClicked < 250) { + return; + } + int i = 0; + int sz = 0; + for (int j = 0; i < customEmojiPacks.data.length; ++i) { + sz = customEmojiPacks.data[i].size(); + if (customEmojiPacks.data.length > 1) { + sz = Math.min(gridLayoutManager.getSpanCount() * 2, sz); + } + j += 1 + sz + 1; + if (position < j) { + break; + } + } + TLRPC.TL_messages_stickerSet stickerSet = customEmojiPacks.stickerSets == null || i >= customEmojiPacks.stickerSets.size() ? null : customEmojiPacks.stickerSets.get(i); + if (stickerSet != null && stickerSet.set != null) { + ArrayList inputStickerSets = new ArrayList<>(); + TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID(); + inputStickerSet.id = stickerSet.set.id; + inputStickerSet.access_hash = stickerSet.set.access_hash; + inputStickerSets.add(inputStickerSet); + new EmojiPacksAlert(fragment, getContext(), resourceProvider, inputStickerSets).show(); + } + }); + gridLayoutManager.setReverseLayout(false); + gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + return listView.getAdapter() != null && listView.getAdapter().getItemViewType(position) != 1 ? gridLayoutManager.getSpanCount() : 1; + } + }); + + containerView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); + + shadowView = new View(context); + shadowView.setBackgroundColor(Theme.getColor(Theme.key_dialogShadowLine)); + containerView.addView(shadowView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 1f / AndroidUtilities.density, Gravity.BOTTOM)); + shadowView.setTranslationY(-AndroidUtilities.dp(68)); + + buttonsView = new FrameLayout(context); + buttonsView.setBackgroundColor(getThemedColor(Theme.key_dialogBackground)); + containerView.addView(buttonsView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 68, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL)); + + addButtonView = new TextView(context); + addButtonView.setVisibility(View.GONE); + addButtonView.setBackground(Theme.AdaptiveRipple.filledRect(getThemedColor(Theme.key_featuredStickers_addButton), 6)); + addButtonView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText)); + addButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addButtonView.setGravity(Gravity.CENTER); + buttonsView.addView(addButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 12, 10, 12, 10)); + + removeButtonView = new TextView(context) { + @Override + public void setVisibility(int visibility) { + super.setVisibility(visibility); + } + }; + removeButtonView.setVisibility(View.GONE); + removeButtonView.setBackground(Theme.createRadSelectorDrawable(0x0fffffff & getThemedColor(Theme.key_dialogTextRed), 0, 0)); + removeButtonView.setTextColor(getThemedColor(Theme.key_dialogTextRed)); + removeButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + removeButtonView.setGravity(Gravity.CENTER); + removeButtonView.setClickable(true); + buttonsView.addView(removeButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.BOTTOM, 0, 0, 0, 19)); + + premiumButtonView = new PremiumButtonView(context, false); + premiumButtonView.setButton(LocaleController.getString("UnlockPremiumEmoji", R.string.UnlockPremiumEmoji), ev -> { + showPremiumAlert(); + }); + premiumButtonView.setIcon(R.raw.unlock_icon); + premiumButtonView.buttonLayout.setClickable(true); + buttonsView.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 12, 10, 12, 10)); + + updateButton(); + MediaDataController.getInstance(fragment.getCurrentAccount()).checkStickers(MediaDataController.TYPE_EMOJIPACKS); + } + + protected void onButtonClicked(boolean install) { + + } + + private void updateShowButton(boolean show, boolean animated) { + final float removeOffset = (removeButtonView.getVisibility() == View.VISIBLE ? AndroidUtilities.dp(19) : 0); + if (animated) { + buttonsView.animate().translationY(show ? removeOffset : AndroidUtilities.dp(16)).alpha(show ? 1 : 0).setDuration(250).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + shadowView.animate().translationY(show ? -(AndroidUtilities.dp(68) - removeOffset) : 0).alpha(show ? 1 : 0).setDuration(250).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + listView.animate().translationY(!show ? (AndroidUtilities.dp(68) - removeOffset) : 0).setDuration(250).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } else { + buttonsView.setAlpha(show ? 1f : 0); + buttonsView.setTranslationY(show ? removeOffset : AndroidUtilities.dp(16)); + shadowView.setAlpha(show ? 1f : 0); + shadowView.setTranslationY(show ? -(AndroidUtilities.dp(68) - removeOffset) : 0); + listView.setTranslationY(!show ? (AndroidUtilities.dp(68) - removeOffset) : 0); + } + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.stickersDidLoad); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.stickersDidLoad); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.stickersDidLoad) { + updateInstallment(); + } + } + + private long premiumButtonClicked; + public void showPremiumAlert() { + if (fragment != null) { + new PremiumFeatureBottomSheet(fragment, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false).show(); + } else if (getContext() instanceof LaunchActivity) { + ((LaunchActivity) getContext()).presentFragment(new PremiumPreviewFragment(null)); + } + } + + private void updateLightStatusBar(boolean open) { + boolean openBgLight = AndroidUtilities.computePerceivedBrightness(getThemedColor(Theme.key_dialogBackground)) > .721f; + boolean closedBgLight = AndroidUtilities.computePerceivedBrightness(Theme.blendOver(getThemedColor(Theme.key_actionBarDefault), 0x33000000)) > .721f; + boolean isLight = open ? openBgLight : closedBgLight; + AndroidUtilities.setLightStatusBar(getWindow(), isLight); + } + + public void updateInstallment() { + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + if (child instanceof EmojiPackHeader) { + EmojiPackHeader header = (EmojiPackHeader) child; + if (header.set != null && header.set.set != null) { + header.toggle(MediaDataController.getInstance(currentAccount).isStickerPackInstalled(header.set.set.id), true); + } + } + } + updateButton(); + } + + public static void installSet(BaseFragment fragment, TLRPC.TL_messages_stickerSet set, boolean showBulletIn) { + installSet(fragment, set, showBulletIn, null, null); + } + public static void installSet(BaseFragment fragment, TLRPC.TL_messages_stickerSet set, boolean showBulletIn, Utilities.Callback onDone, Runnable onStickersLoaded) { + if (set == null || fragment == null) { + return; + } + if (MediaDataController.getInstance(fragment.getCurrentAccount()).cancelRemovingStickerSet(set.set.id)) { + if (onDone != null) { + onDone.run(true); + } + return; + } + TLRPC.TL_messages_installStickerSet req = new TLRPC.TL_messages_installStickerSet(); + req.stickerset = new TLRPC.TL_inputStickerSetID(); + req.stickerset.id = set.set.id; + req.stickerset.access_hash = set.set.access_hash; + ConnectionsManager.getInstance(fragment.getCurrentAccount()).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + int type = MediaDataController.TYPE_IMAGE; + if (set.set.masks) { + type = MediaDataController.TYPE_MASK; + } else if (set.set.emojis) { + type = MediaDataController.TYPE_EMOJIPACKS; + }; + try { + if (error == null) { + if (showBulletIn && fragment.getFragmentView() != null) { + Bulletin.make(fragment, new StickerSetBulletinLayout(fragment.getFragmentView().getContext(), set, StickerSetBulletinLayout.TYPE_ADDED, null, fragment.getResourceProvider()), Bulletin.DURATION_SHORT).show(); + } + if (response instanceof TLRPC.TL_messages_stickerSetInstallResultArchive) { + MediaDataController.getInstance(fragment.getCurrentAccount()).processStickerSetInstallResultArchive(fragment, true, type, (TLRPC.TL_messages_stickerSetInstallResultArchive) response); + } + if (onDone != null) { + onDone.run(true); + } + } else if (fragment.getFragmentView() != null) { + Toast.makeText(fragment.getFragmentView().getContext(), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred), Toast.LENGTH_SHORT).show(); + if (onDone != null) { + onDone.run(false); + } + } else { + if (onDone != null) { + onDone.run(false); + } + } + } catch (Exception e) { + FileLog.e(e); + } + MediaDataController.getInstance(fragment.getCurrentAccount()).loadStickers(type, false, true, false, p -> { + if (onStickersLoaded != null) { + onStickersLoaded.run(); + } + }); + })); + } + + public static void uninstallSet(BaseFragment fragment, TLRPC.TL_messages_stickerSet set, boolean showBulletin, Runnable onUndo) { + if (fragment == null || set == null || fragment.getFragmentView() == null) { + return; + } + // set.set.official ? 1 : 0 + MediaDataController.getInstance(fragment.getCurrentAccount()).toggleStickerSet(fragment.getFragmentView().getContext(), set, 0, fragment, true, showBulletin, onUndo); + } + + private ValueAnimator loadAnimator; + private void loadAnimation() { + if (loadAnimator != null) { + return; + } + loadAnimator = ValueAnimator.ofFloat(loadT, 1); + fromY = lastY + containerView.getY(); + loadAnimator.addUpdateListener(a -> { + loadT = (float) a.getAnimatedValue(); + listView.setAlpha(loadT); + addButtonView.setAlpha(loadT); + removeButtonView.setAlpha(loadT); + containerView.invalidate(); + }); + loadAnimator.setDuration(250); + loadAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + loadAnimator.start(); + } + + boolean first = false; + boolean loaded = true; + private void updateButton() { + if (buttonsView == null) { + return; + } + + ArrayList allPacks = customEmojiPacks.stickerSets == null ? new ArrayList<>() : new ArrayList<>(customEmojiPacks.stickerSets); + for (int i = 0; i < allPacks.size(); ++i) { + if (allPacks.get(i) == null) { + allPacks.remove(i--); + } + } + MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + ArrayList installedPacks = new ArrayList<>(); + ArrayList notInstalledPacks = new ArrayList<>(); + for (int i = 0; i < allPacks.size(); ++i) { + TLRPC.TL_messages_stickerSet stickerSet = allPacks.get(i); + if (stickerSet != null && stickerSet.set != null) { + if (!mediaDataController.isStickerPackInstalled(stickerSet.set.id)) { + notInstalledPacks.add(stickerSet); + } else { + installedPacks.add(stickerSet); + } + } + } + + boolean mePremium = UserConfig.getInstance(currentAccount).isPremium(); + ArrayList canInstallPacks = new ArrayList<>(notInstalledPacks); + for (int i = 0; i < canInstallPacks.size(); ++i) { + if (MessageObject.isPremiumEmojiPack(canInstallPacks.get(i)) && !mePremium) { + canInstallPacks.remove(i--); + } + } + + boolean loadedNow = customEmojiPacks.inputStickerSets != null && allPacks.size() == customEmojiPacks.inputStickerSets.size(); + if (!loaded && loadedNow) { + loadAnimation(); + } + loaded = loadedNow; + if (!loaded) { + listView.setAlpha(0); + } + + if (canInstallPacks.size() <= 0 && notInstalledPacks.size() >= 0 && !mePremium || !loaded) { + premiumButtonView.setVisibility(View.VISIBLE); + addButtonView.setVisibility(View.GONE); + removeButtonView.setVisibility(View.GONE); + updateShowButton(true, !first); + } else { + premiumButtonView.setVisibility(View.INVISIBLE); + if (canInstallPacks.size() > 0) { + addButtonView.setVisibility(View.VISIBLE); + removeButtonView.setVisibility(View.GONE); + if (canInstallPacks.size() == 1) { + addButtonView.setText(LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("EmojiCountButton", canInstallPacks.get(0).documents.size()))); + } else { + addButtonView.setText(LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("EmojiPackCount", canInstallPacks.size()))); + } + addButtonView.setOnClickListener(ev -> { + final int count = canInstallPacks.size(); + final int[] status = new int[2]; + for (int i = 0; i < canInstallPacks.size(); ++i) { + installSet(fragment, canInstallPacks.get(i), count == 1, count > 1 ? + result -> { + status[0]++; + if (result) { + status[1]++; + } + if (status[0] == count && status[1] > 0) { + dismiss(); + Bulletin.make(fragment, new StickerSetBulletinLayout(fragment.getFragmentView().getContext(), canInstallPacks.get(0), status[1], StickerSetBulletinLayout.TYPE_ADDED,null, fragment.getResourceProvider()), Bulletin.DURATION_SHORT).show(); + } + } : null, + null + ); + } + onButtonClicked(true); + if (count <= 1) { + dismiss(); + } + }); + updateShowButton(true, !first); + } else if (installedPacks.size() > 0) { + addButtonView.setVisibility(View.GONE); + removeButtonView.setVisibility(View.VISIBLE); + if (installedPacks.size() == 1) { + removeButtonView.setText(LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("EmojiCountButton", installedPacks.get(0).documents.size()))); + } else { + removeButtonView.setText(LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("EmojiPackCount", installedPacks.size()))); + } + + removeButtonView.setOnClickListener(ev -> { + dismiss(); + if (fragment != null) { + MediaDataController.getInstance(fragment.getCurrentAccount()).removeMultipleStickerSets(fragment.getFragmentView().getContext(), fragment, installedPacks); + } else { + for (int i = 0; i < installedPacks.size(); ++i) { + TLRPC.TL_messages_stickerSet stickerSet = installedPacks.get(i); + uninstallSet(fragment, stickerSet, i == 0, null); + } + } + onButtonClicked(false); + }); + updateShowButton(true, !first); + } else { + addButtonView.setVisibility(View.GONE); + removeButtonView.setVisibility(View.GONE); + updateShowButton(false, !first); + } + } + first = false; + } + + private int getListTop() { + if (containerView == null) { + return 0; + } + if (listView == null || listView.getChildCount() < 1) { + return containerView.getPaddingTop(); + } + View view = listView.getChildAt(0); + if (view != paddingView) { + return containerView.getPaddingTop(); + } + return paddingView.getBottom() + containerView.getPaddingTop(); + } + + @Override + public void show() { + super.show(); + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 4); + } + + @Override + public void dismiss() { + super.dismiss(); + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 4); + } + + @Override + public int getContainerViewHeight() { + return (listView == null ? 0 : listView.getMeasuredHeight()) - getListTop() + (containerView == null ? 0 : containerView.getPaddingTop()) + AndroidUtilities.navigationBarHeight + AndroidUtilities.dp(8); + } + + class SeparatorView extends View { + public SeparatorView(Context context) { + super(context); + setBackgroundColor(getThemedColor(Theme.key_chat_emojiPanelShadowLine)); + RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AndroidUtilities.getShadowHeight()); + params.topMargin = AndroidUtilities.dp(14); + setLayoutParams(params); + } + } + + private class Adapter extends RecyclerView.Adapter { + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = null; + if (viewType == 0) { + view = paddingView; + } else if (viewType == 1) { + view = new EmojiImageView(getContext()); + } else if (viewType == 2) { + view = new EmojiPackHeader(getContext(), customEmojiPacks.data.length <= 1); + } else if (viewType == 3) { + view = new TextView(getContext()); + } else if (viewType == 4) { + view = new SeparatorView(getContext()); + } + return new RecyclerListView.Holder(view); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + position--; + switch (holder.getItemViewType()) { + case 3: + TextView textView = (TextView) holder.itemView; + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + textView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelTrendingDescription)); + textView.setText(AndroidUtilities.replaceTags(LocaleController.getString("PremiumPreviewEmojiPack", R.string.PremiumPreviewEmojiPack))); + textView.setPadding(AndroidUtilities.dp(14), 0, AndroidUtilities.dp(30), AndroidUtilities.dp(14)); + break; + case 1: + if (hasDescription) { + position--; + } + EmojiImageView view = (EmojiImageView) holder.itemView; + EmojiView.CustomEmoji customEmoji = null; + for (int i = 0, j = 0; i < customEmojiPacks.data.length; ++i) { + int size = customEmojiPacks.data[i].size(); + if (customEmojiPacks.data.length > 1) { + size = Math.min(gridLayoutManager.getSpanCount() * 2, size); + } + if (position > j && position <= j + size) { + customEmoji = customEmojiPacks.data[i].get(position - j - 1); + break; + } + j += 1 + size + 1; + } + if (view.span == null && customEmoji != null || customEmoji == null && view.span != null || customEmoji != null && view.span.documentId != customEmoji.documentId) { + if (customEmoji == null) { + view.span = null; + } else { + TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID(); + inputStickerSet.id = customEmoji.stickerSet.set.id; + inputStickerSet.short_name = customEmoji.stickerSet.set.short_name; + inputStickerSet.access_hash = customEmoji.stickerSet.set.access_hash; + view.span = new AnimatedEmojiSpan(customEmoji.documentId, null); + } + } + break; + case 2: + if (hasDescription && position > 0) { + position--; + } + int i = 0; + for (int j = 0; i < customEmojiPacks.data.length; ++i) { + int sz = customEmojiPacks.data[i].size(); + if (customEmojiPacks.data.length > 1) { + sz = Math.min(gridLayoutManager.getSpanCount() * 2, sz); + } + if (position == j) { + break; + } + j += 1 + sz + 1; + } + TLRPC.TL_messages_stickerSet stickerSet = customEmojiPacks.stickerSets == null || i >= customEmojiPacks.stickerSets.size() ? null : customEmojiPacks.stickerSets.get(i); + boolean premium = false; + if (stickerSet != null && stickerSet.documents != null) { + for (int j = 0; j < stickerSet.documents.size(); ++j) { + if (!MessageObject.isFreeEmoji(stickerSet.documents.get(j))) { + premium = true; + break; + } + } + } + if (i < customEmojiPacks.data.length) { + ((EmojiPackHeader) holder.itemView).set(stickerSet, stickerSet == null || stickerSet.documents == null ? 0 : stickerSet.documents.size(), premium); + } + break; + } + } + + @Override + public int getItemViewType(int position) { + if (position == 0) { + return 0; + } + position--; + if (hasDescription) { + if (position == 1) { + return 3; + } else if (position > 0) { + position--; + } + } + for (int i = 0, j = 0; i < customEmojiPacks.data.length; ++i) { + if (position == j) { + return 2; + } + int count = customEmojiPacks.data[i].size(); + if (customEmojiPacks.data.length > 1) { + count = Math.min(gridLayoutManager.getSpanCount() * 2, count); + } + j += 1 + count; + if (position == j) { + return 4; + } + j++; + } + return 1; + } + + @Override + public int getItemCount() { + hasDescription = !UserConfig.getInstance(currentAccount).isPremium() && customEmojiPacks.stickerSets != null && customEmojiPacks.stickerSets.size() == 1 && MessageObject.isPremiumEmojiPack(customEmojiPacks.stickerSets.get(0)); + return 1 + (hasDescription ? 1 : 0) + customEmojiPacks.getItemsCount() + Math.max(0, customEmojiPacks.data.length - 1); + } + } + + private void onSubItemClick(int id) { + if (customEmojiPacks == null || customEmojiPacks.stickerSets == null || customEmojiPacks.stickerSets.isEmpty()) { + return; + } + TLRPC.TL_messages_stickerSet stickerSet = customEmojiPacks.stickerSets.get(0); + String stickersUrl; + if (stickerSet.set != null && stickerSet.set.emojis) { + stickersUrl = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addemoji/" + stickerSet.set.short_name; + } else { + stickersUrl = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addstickers/" + stickerSet.set.short_name; + } + if (id == 1) { + Context context = null; + if (fragment != null) { + context = fragment.getParentActivity(); + } + if (context == null) { + context = getContext(); + } + ShareAlert alert = new ShareAlert(context, null, stickersUrl, false, stickersUrl, false, resourcesProvider); + if (fragment != null) { + fragment.showDialog(alert); + } else { + alert.show(); + } + } else if (id == 2) { + try { + AndroidUtilities.addToClipboard(stickersUrl); + BulletinFactory.of((FrameLayout) containerView, resourcesProvider).createCopyLinkBulletin().show(); + } catch (Exception e) { + FileLog.e(e); + } + } + } + private class EmojiImageView extends View { + public ImageReceiver.BackgroundThreadDrawHolder backgroundThreadDrawHolder; + public ImageReceiver imageReceiver; + + public EmojiImageView(Context context) { + super(context); + } + + public AnimatedEmojiSpan span; + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setPadding(AndroidUtilities.dp(2), AndroidUtilities.dp(2), AndroidUtilities.dp(2), AndroidUtilities.dp(2)); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY)); + } + } + + private class EmojiPackHeader extends FrameLayout { + + public TextView titleView; + public TextView subtitleView; + public TextView addButtonView; + public TextView removeButtonView; + public PremiumButtonView unlockButtonView; + public ActionBarMenuItem optionsButton; + + private boolean single; + + public BaseFragment dummyFragment = new BaseFragment() { + @Override + public int getCurrentAccount() { + return currentAccount; + } + + @Override + public View getFragmentView() { + return EmojiPacksAlert.this.containerView; + } + + @Override + public FrameLayout getLayoutContainer() { + return (FrameLayout) EmojiPacksAlert.this.containerView; + } + + @Override + public Theme.ResourcesProvider getResourceProvider() { + return resourcesProvider; + } + }; + + public EmojiPackHeader(Context context, boolean single) { + super(context); + + this.single = single; + + float endMarginDp = 8; + if (!single) { + if (!UserConfig.getInstance(currentAccount).isPremium()) { + unlockButtonView = new PremiumButtonView(context, AndroidUtilities.dp(4), false); + unlockButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), ev -> { + premiumButtonClicked = SystemClock.elapsedRealtime(); + showPremiumAlert(); + }); + unlockButtonView.setIcon(R.raw.unlock_icon); + + MarginLayoutParams iconLayout = (MarginLayoutParams) unlockButtonView.getIconView().getLayoutParams(); + iconLayout.leftMargin = AndroidUtilities.dp(1); + iconLayout.topMargin = AndroidUtilities.dp(1); + iconLayout.width = iconLayout.height = AndroidUtilities.dp(20); + MarginLayoutParams layout = (MarginLayoutParams) unlockButtonView.getTextView().getLayoutParams(); + layout.leftMargin = AndroidUtilities.dp(3); + unlockButtonView.getChildAt(0).setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); + + addView(unlockButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.END | Gravity.TOP, 0, 15.66f, 5.66f, 0)); + + unlockButtonView.measure(MeasureSpec.makeMeasureSpec(99999, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(28), MeasureSpec.EXACTLY)); + endMarginDp = (unlockButtonView.getMeasuredWidth() + AndroidUtilities.dp(8 + 8)) / AndroidUtilities.density; + } + + addButtonView = new TextView(context); + addButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addButtonView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText)); + addButtonView.setBackground(Theme.AdaptiveRipple.filledRect(getThemedColor(Theme.key_featuredStickers_addButton), 4)); + addButtonView.setText(LocaleController.getString("Add", R.string.Add)); + addButtonView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); + addButtonView.setGravity(Gravity.CENTER); + addButtonView.setOnClickListener(e -> { + installSet(dummyFragment, set, true); + toggle(true, true); + }); + addView(addButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.END | Gravity.TOP, 0, 15.66f, 5.66f, 0)); + + addButtonView.measure(MeasureSpec.makeMeasureSpec(99999, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(28), MeasureSpec.EXACTLY)); + endMarginDp = Math.max(endMarginDp, (addButtonView.getMeasuredWidth() + AndroidUtilities.dp(8 + 8)) / AndroidUtilities.density); + + removeButtonView = new TextView(context); + removeButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + removeButtonView.setTextColor(getThemedColor(Theme.key_featuredStickers_addButton)); + removeButtonView.setBackground(Theme.createRadSelectorDrawable(0x0fffffff & getThemedColor(Theme.key_featuredStickers_addButton), 4, 4)); + removeButtonView.setText(LocaleController.getString("StickersRemove", R.string.StickersRemove)); + removeButtonView.setPadding(AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12), 0); + removeButtonView.setGravity(Gravity.CENTER); + removeButtonView.setOnClickListener(e -> { + uninstallSet(dummyFragment, set, true, () -> { + toggle(true, true); + }); + toggle(false, true); + }); + removeButtonView.setClickable(false); + addView(removeButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 28, Gravity.END | Gravity.TOP, 0, 15.66f, 5.66f, 0)); + + removeButtonView.setScaleX(0); + removeButtonView.setScaleY(0); + removeButtonView.setAlpha(0); + + removeButtonView.measure(MeasureSpec.makeMeasureSpec(99999, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(28), MeasureSpec.EXACTLY)); + endMarginDp = Math.max(endMarginDp, (removeButtonView.getMeasuredWidth() + AndroidUtilities.dp(8 + 8)) / AndroidUtilities.density); + } + + titleView = new TextView(context); + titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + titleView.setEllipsize(TextUtils.TruncateAt.END); + titleView.setSingleLine(true); + titleView.setLines(1); + titleView.setTextColor(getThemedColor(Theme.key_dialogTextBlack)); + if (single) { + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.TOP, 14, 11, endMarginDp, 0)); + } else { + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.TOP, 8, 10, endMarginDp, 0)); + } + + if (!single) { + subtitleView = new TextView(context); + subtitleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + subtitleView.setTextColor(getThemedColor(Theme.key_dialogTextGray2)); + subtitleView.setEllipsize(TextUtils.TruncateAt.END); + subtitleView.setSingleLine(true); + subtitleView.setLines(1); + addView(subtitleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.TOP, 8, 31.66f, endMarginDp, 0)); + } + + if (single) { + optionsButton = new ActionBarMenuItem(context, null, 0, getThemedColor(Theme.key_sheet_other), resourcesProvider); + optionsButton.setLongClickEnabled(false); + optionsButton.setSubMenuOpenSide(2); + optionsButton.setIcon(R.drawable.ic_ab_other); + optionsButton.setBackgroundDrawable(Theme.createSelectorDrawable(getThemedColor(Theme.key_player_actionBarSelector), 1)); + addView(optionsButton, LayoutHelper.createFrame(40, 40, Gravity.TOP | Gravity.RIGHT, 0, 5, 5 - backgroundPaddingLeft / AndroidUtilities.density, 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.setDelegate(EmojiPacksAlert.this::onSubItemClick); + optionsButton.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); + } + } + + private TLRPC.TL_messages_stickerSet set; + private boolean toggled = false; + private float toggleT = 0; + private ValueAnimator animator; + private void toggle(boolean enable, boolean animated) { + if (toggled == enable) { + return; + } + toggled = enable; + + if (animator != null) { + animator.cancel(); + animator = null; + } + + if (addButtonView == null || removeButtonView == null) { + return; + } + + addButtonView.setClickable(!enable); + removeButtonView.setClickable(enable); + + if (animated) { + animator = ValueAnimator.ofFloat(toggleT, enable ? 1f : 0f); // 1 - remove button, 0 - add button + animator.addUpdateListener(a -> { + toggleT = (float) a.getAnimatedValue(); + addButtonView.setScaleX(1f - toggleT); + addButtonView.setScaleY(1f - toggleT); + addButtonView.setAlpha(1f - toggleT); + removeButtonView.setScaleX(toggleT); + removeButtonView.setScaleY(toggleT); + removeButtonView.setAlpha(toggleT); + }); + animator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + animator.setDuration(250); + animator.start(); + } else { + toggleT = enable ? 1 : 0; + addButtonView.setScaleX(enable ? 0 : 1); + addButtonView.setScaleY(enable ? 0 : 1); + addButtonView.setAlpha(enable ? 0 : 1); + removeButtonView.setScaleX(enable ? 1 : 0); + removeButtonView.setScaleY(enable ? 1 : 0); + removeButtonView.setAlpha(enable ? 1 : 0); + } + } + + public void set(TLRPC.TL_messages_stickerSet set, int size, boolean premium) { + this.set = set; + + if (set != null && set.set != null) { + titleView.setText(set.set.title); + } else { + titleView.setText(null); + } + + if (subtitleView != null) { + subtitleView.setText(LocaleController.formatPluralString("EmojiCount", size)); + } + + if (premium && unlockButtonView != null && !UserConfig.getInstance(currentAccount).isPremium()) { + unlockButtonView.setVisibility(VISIBLE); + if (addButtonView != null) { + addButtonView.setVisibility(GONE); + } + if (removeButtonView != null) { + removeButtonView.setVisibility(GONE); + } + } else { + if (unlockButtonView != null) { + unlockButtonView.setVisibility(GONE); + } + if (addButtonView != null) { + addButtonView.setVisibility(VISIBLE); + } + if (removeButtonView != null) { + removeButtonView.setVisibility(VISIBLE); + } + + toggle(set != null && MediaDataController.getInstance(currentAccount).isStickerPackInstalled(set.set.id), false); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(single ? 42 : 56), MeasureSpec.EXACTLY)); + } + } + + class EmojiPacksLoader implements NotificationCenter.NotificationCenterDelegate { + final int loadingStickersCount = 12; + + public ArrayList inputStickerSets; + public ArrayList stickerSets; + public ArrayList[] data; + private int currentAccount; + + public EmojiPacksLoader(int currentAccount, ArrayList inputStickerSets) { + this.currentAccount = currentAccount; + if (inputStickerSets == null) { + inputStickerSets = new ArrayList<>(); + } + this.inputStickerSets = inputStickerSets; + init(); + } + + private void init() { + stickerSets = new ArrayList<>(inputStickerSets.size()); + data = new ArrayList[inputStickerSets.size()]; + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); + final boolean[] failed = new boolean[1]; + for (int i = 0; i < data.length; ++i) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSets.get(i), false, () -> { + if (!failed[0]) { + failed[0] = true; + AndroidUtilities.runOnUIThread(() -> { + dismiss(); + BulletinFactory.of(fragment).createErrorBulletin(LocaleController.getString("AddEmojiNotFound", R.string.AddEmojiNotFound)).show(); + }); + } + }); + if (data.length == 1 && stickerSet != null && stickerSet.set != null && !stickerSet.set.emojis) { + AndroidUtilities.runOnUIThread(() -> EmojiPacksAlert.this.dismiss()); + StickersAlert alert = new StickersAlert(getContext(), fragment, inputStickerSets.get(i), null, fragment instanceof ChatActivity ? ((ChatActivity) fragment).getChatActivityEnterView() : null, resourcesProvider); + alert.show(); + return; + } + stickerSets.add(stickerSet); + putStickerSet(i, stickerSet); + } + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.groupStickersDidLoad) { + for (int i = 0; i < stickerSets.size(); ++i) { + if (stickerSets.get(i) == null) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(this.inputStickerSets.get(i), true); + if (stickerSets.size() == 1 && stickerSet != null && stickerSet.set != null && !stickerSet.set.emojis) { + EmojiPacksAlert.this.dismiss(); + StickersAlert alert = new StickersAlert(getContext(), fragment, inputStickerSets.get(i), null, fragment instanceof ChatActivity ? ((ChatActivity) fragment).getChatActivityEnterView() : null, resourcesProvider); + alert.show(); + return; + } + stickerSets.set(i, stickerSet); + if (stickerSet != null) { + putStickerSet(i, stickerSet); + } + } + } + onUpdate(); + } + } + + private void putStickerSet(int index, TLRPC.TL_messages_stickerSet stickerSet) { + if (index < 0 || index >= data.length) { + return; + } + if (stickerSet == null || stickerSet.documents == null) { + data[index] = new ArrayList<>(loadingStickersCount); + for (int j = 0; j < loadingStickersCount; ++j) { + data[index].add(null); + } + } else { + data[index] = new ArrayList<>(); + for (int j = 0; j < stickerSet.documents.size(); ++j) { + TLRPC.Document document = stickerSet.documents.get(j); + if (document == null) { + data[index].add(null); + } else { + EmojiView.CustomEmoji customEmoji = new EmojiView.CustomEmoji(); + customEmoji.emoticon = findEmoticon(stickerSet, document.id); + customEmoji.stickerSet = stickerSet; + customEmoji.documentId = document.id; + data[index].add(customEmoji); + } + } + } + } + + public void recycle() { + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.groupStickersDidLoad); + } + + public String getTitle(int index) { + if (index < 0 || index >= stickerSets.size()) { + return null; + } + TLRPC.TL_messages_stickerSet stickerSet = stickerSets.get(index); + if (stickerSet == null || stickerSet.set == null) { + return null; + } + return stickerSet.set.title; + } + + protected void onUpdate() { + + } + + public int getItemsCount() { + if (data == null) { + return 0; + } + int count = 0; + for (int i = 0; i < data.length; ++i) { + if (data[i] == null) { + continue; + } + if (data.length == 1) { + count += data[i].size(); + } else { + count += Math.min(gridLayoutManager.getSpanCount() * 2, data[i].size()); + } + count++; + } + return count; + } + + public String findEmoticon(long documentId) { + String emoticon; + for (int i = 0; i < stickerSets.size(); ++i) { + emoticon = findEmoticon(stickerSets.get(i), documentId); + if (emoticon != null) { + return emoticon; + } + } + return null; + } + + public String findEmoticon(TLRPC.InputStickerSet inputStickerSet, long documentId) { + if (inputStickerSet == null) { + return null; + } + TLRPC.TL_messages_stickerSet stickerSet = null; + for (int i = 0; i < stickerSets.size(); ++i) { + TLRPC.TL_messages_stickerSet s = stickerSets.get(i); + if (s != null && s.set != null && (inputStickerSet.id == s.set.id || inputStickerSet.short_name != null && inputStickerSet.short_name.equals(s.set.short_name))) { + stickerSet = s; + break; + } + } + return findEmoticon(stickerSet, documentId); + } + + public String findEmoticon(TLRPC.TL_messages_stickerSet stickerSet, long documentId) { + if (stickerSet == null) { + return null; + } + for (int o = 0; o < stickerSet.packs.size(); ++o) { + TLRPC.TL_stickerPack pack = stickerSet.packs.get(o); + if (pack.documents != null && pack.documents.contains(documentId)) { + return pack.emoticon; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java new file mode 100644 index 000000000..9c50856a8 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java @@ -0,0 +1,1098 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +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.graphics.RectF; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.OvershootInterpolator; +import android.widget.HorizontalScrollView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ViewAnimator; + +import androidx.core.graphics.ColorUtils; +import androidx.core.math.MathUtils; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.Premium.PremiumLockIconView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class EmojiTabsStrip extends ScrollableHorizontalScrollView { + + private int recentDrawableId = R.drawable.msg_emoji_recent; + private static int[] emojiTabsDrawableIds = { + R.drawable.msg_emoji_smiles, + R.drawable.msg_emoji_cat, + R.drawable.msg_emoji_food, + R.drawable.msg_emoji_activities, + R.drawable.msg_emoji_travel, + R.drawable.msg_emoji_objects, + R.drawable.msg_emoji_other, + R.drawable.msg_emoji_flags + }; + private static int[] emojiTabsAnimatedDrawableIds = { + R.raw.msg_emoji_smiles, + R.raw.msg_emoji_cat, + R.raw.msg_emoji_food, + R.raw.msg_emoji_activities, + R.raw.msg_emoji_travel, + R.raw.msg_emoji_objects, + R.raw.msg_emoji_other, + R.raw.msg_emoji_flags + }; + private int settingsDrawableId = R.drawable.smiles_tab_settings; + + private Theme.ResourcesProvider resourcesProvider; + private EmojiView parent; + private boolean includeAnimated; + private LinearLayout contentView; + + private EmojiTabButton recentTab; + private EmojiTabButton settingsTab; + private EmojiTabsView emojiTabs; + private ArrayList emojipackTabs; + private HashMap removingViews = new HashMap<>(); + + private ValueAnimator selectAnimator; + private float selectT = 0f; + private float selectAnimationT = 0f; + private int selected = 0; + private int wasIndex = 0; + + private Runnable onSettingsOpenRunnable; + private boolean wasDrawn; + + public EmojiTabsStrip(Context context, Theme.ResourcesProvider resourcesProvider, boolean includeAnimated, EmojiView parent, Runnable onSettingsOpen) { + super(context); + this.parent = parent; + this.includeAnimated = includeAnimated; + this.resourcesProvider = resourcesProvider; + this.onSettingsOpenRunnable = onSettingsOpen; + + contentView = new LinearLayout(context) { + + HashMap lastX = new HashMap<>(); + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int cy = (b - t) / 2; + if (includeAnimated) { + int x = getPaddingLeft() - (!recentIsShown ? AndroidUtilities.dp(30 + 3) : 0); + for (int i = 0; i < getChildCount(); ++i) { + View child = getChildAt(i); + if (child == settingsTab || removingViews.containsKey(child)) { + continue; + } + if (child != null) { + child.layout(x, cy - child.getMeasuredHeight() / 2, x + child.getMeasuredWidth(), cy + child.getMeasuredHeight() / 2); + Integer id = child instanceof EmojiTabButton ? ((EmojiTabButton) child).id : (child instanceof EmojiTabsView ? ((EmojiTabsView) child).id : null); + if (child instanceof EmojiTabButton && ((EmojiTabButton) child).newly) { + ((EmojiTabButton) child).newly = false; + child.setScaleX(0); + child.setScaleY(0); + child.setAlpha(0); + child.animate().scaleX(1f).scaleY(1f).alpha(1f).setDuration(200).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } + if (id != null) { + if (lastX.get(id) != null && lastX.get(id) != x) { + child.setTranslationX(lastX.get(id) - x); + child.animate().translationX(0).setDuration(250).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } + lastX.put(id, x); + } + x += child.getMeasuredWidth() + AndroidUtilities.dp(3); + } + } + if (settingsTab != null) { + x += (!recentIsShown ? AndroidUtilities.dp(30 + 3) : 0); + Integer id = settingsTab.id; + if (x + settingsTab.getMeasuredWidth() + getPaddingRight() <= EmojiTabsStrip.this.getMeasuredWidth()) { + settingsTab.layout(x = (r - l - getPaddingRight() - settingsTab.getMeasuredWidth()), cy - settingsTab.getMeasuredHeight() / 2, r - l - getPaddingRight(), cy + settingsTab.getMeasuredHeight() / 2); + } else { + settingsTab.layout(x, cy - settingsTab.getMeasuredHeight() / 2, x + settingsTab.getMeasuredWidth(), cy + settingsTab.getMeasuredHeight() / 2); + } + if (id != null) { + if (lastX.get(id) != null && lastX.get(id) != x) { + settingsTab.setTranslationX(lastX.get(id) - x); + settingsTab.animate().translationX(0).setDuration(350).start(); + } + lastX.put(id, x); + } + } + } else { + final int childCount = getChildCount() - (!recentIsShown ? 1 : 0); + int margin = (int) ((r - l - getPaddingLeft() - getPaddingRight() - childCount * AndroidUtilities.dp(30)) / (float) Math.max(1, childCount - 1)); + int x = getPaddingLeft(); + for (int i = 0; i < childCount; ++i) { + View child = getChildAt((!recentIsShown ? 1 : 0) + i); + if (child != null) { + child.layout(x, cy - child.getMeasuredHeight() / 2, x + child.getMeasuredWidth(), cy + child.getMeasuredHeight() / 2); + x += child.getMeasuredWidth() + margin; + } + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int AT_MOST = MeasureSpec.makeMeasureSpec(99999999, MeasureSpec.AT_MOST); + int width = getPaddingLeft() + getPaddingRight() - (int) (recentIsShown ? 0 : recentTab.getAlpha() * AndroidUtilities.dp(30 + 3)); + for (int i = 0; i < getChildCount(); ++i) { + View child = getChildAt(i); + if (child != null) { + child.measure(AT_MOST, heightMeasureSpec); + width += child.getMeasuredWidth() + (i + 1 < getChildCount() ? AndroidUtilities.dp(3) : 0); + } + } + if (!includeAnimated) { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); + return; + } + setMeasuredDimension(Math.max(width, MeasureSpec.getSize(widthMeasureSpec)), MeasureSpec.getSize(heightMeasureSpec)); + } + + private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private RectF from = new RectF(); + private RectF to = new RectF(); + private RectF rect = new RectF(); + private Path path = new Path(); + @Override + protected void dispatchDraw(Canvas canvas) { + for (Map.Entry entry : removingViews.entrySet()) { + View view = entry.getKey(); + Rect bounds = entry.getValue(); + canvas.save(); + canvas.translate(bounds.left, bounds.top); + canvas.scale(view.getScaleX(), view.getScaleY(), bounds.width() / 2f, bounds.height() / 2f); + view.draw(canvas); + canvas.restore(); + } + + int selectFrom = (int) Math.floor(selectT), selectTo = (int) Math.ceil(selectT); + getChildBounds(selectFrom, from); + getChildBounds(selectTo, to); + AndroidUtilities.lerp(from, to, selectT - selectFrom, rect); + float isEmojiTabs = emojiTabs == null ? 0 : MathUtils.clamp(1f - Math.abs(selectT - 1), 0, 1); + float isMiddle = 4f * selectAnimationT * (1f - selectAnimationT); + float hw = rect.width() / 2 * (1f + isMiddle * .3f); + float hh = rect.height() / 2 * (1f - isMiddle * .05f); + rect.set(rect.centerX() - hw, rect.centerY() - hh, rect.centerX() + hw, rect.centerY() + hh); + float r = AndroidUtilities.dp(AndroidUtilities.lerp(8f, 16f, isEmojiTabs)); + paint.setColor(selectorColor()); + + path.rewind(); + path.addRoundRect(rect, r, r, Path.Direction.CW); + canvas.drawPath(path, paint); + + if (emojiTabs != null) { + path.addCircle(emojiTabs.getLeft() + AndroidUtilities.dp(15), (emojiTabs.getTop() + emojiTabs.getBottom()) / 2f, AndroidUtilities.dp(15), Path.Direction.CW); + } + + super.dispatchDraw(canvas); + wasDrawn = true; + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child == emojiTabs) { + canvas.save(); + canvas.clipPath(path); + boolean res = super.drawChild(canvas, child, drawingTime); + canvas.restore(); + return res; + } + return super.drawChild(canvas, child, drawingTime); + } + + private void getChildBounds(int i, RectF out) { + View child = getChildAt(MathUtils.clamp(i, 0, getChildCount() - 1)); + out.set(child.getLeft(), child.getTop(), child.getRight(), child.getBottom()); +// out.offset(recentIsShown ? recentTab.getTranslationX() : AndroidUtilities.dp(30 + 3) - recentTab.getTranslationX(), 0); + } + }; + contentView.setClipToPadding(false); + contentView.setPadding(AndroidUtilities.dp(5 + 6), 0, AndroidUtilities.dp(3), 0); + contentView.setOrientation(LinearLayout.HORIZONTAL); + setVerticalScrollBarEnabled(false); + setHorizontalScrollBarEnabled(false); + addView(contentView); + + contentView.addView(recentTab = new EmojiTabButton(context, recentDrawableId, false, false)); + recentTab.id = "recent".hashCode(); + if (!includeAnimated) { + for (int i = 0; i < emojiTabsDrawableIds.length; ++i) { + contentView.addView(new EmojiTabButton(context, emojiTabsDrawableIds[i], false, i == 0)); + } + updateClickListeners(); + } else { + contentView.addView(emojiTabs = new EmojiTabsView(context)); + emojiTabs.id = "tabs".hashCode(); + if (onSettingsOpen != null) { + contentView.addView(settingsTab = new EmojiTabButton(context, settingsDrawableId, false, true)); + settingsTab.id = "settings".hashCode(); + settingsTab.setAlpha(0); + } + updateClickListeners(); + updateEmojiPacks(); + } + } + + private boolean recentFirstChange = true; + private boolean recentIsShown = true; + public void showRecent(boolean show) { + if (recentIsShown == show) { + return; + } + recentIsShown = show; + if (recentFirstChange) { + recentTab.setAlpha(show ? 1f : 0f); + } else { + recentTab.animate().alpha(show ? 1f : 0f).setDuration(200).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } + if (!show && selected == 0 || show && selected == 1) { + select(0, !recentFirstChange); + } + contentView.requestLayout(); + recentFirstChange = false; + } + + private boolean isFreeEmojiPack(TLRPC.StickerSet set, ArrayList documents) { + if (set == null || documents == null) { + return false; + } + for (int i = 0; i < documents.size(); ++i) { + if (!MessageObject.isFreeEmoji(documents.get(i))) { + return false; + } + } + return true; + } + + private TLRPC.Document getThumbDocument(TLRPC.StickerSet set, ArrayList documents) { + if (set == null) { + return null; + } + if (documents != null) { + for (int i = 0; i < documents.size(); ++i) { + TLRPC.Document d = documents.get(i); + if (d.id == set.thumb_document_id) { + return d; + } + } + } + if (documents != null && documents.size() >= 1) { + return documents.get(0); + } + return null; + } + + boolean first = true; + private ValueAnimator appearAnimation; + private int appearCount; + public void updateEmojiPacks() { + if (!includeAnimated) { + return; + } + if (first && !MediaDataController.getInstance(UserConfig.selectedAccount).areStickersLoaded(MediaDataController.TYPE_EMOJIPACKS)) { + return; + } + first = false; + ArrayList emojiPacks = parent.getEmojipacks(); + if (emojiPacks == null) { + return; + } + if (emojipackTabs == null) { + emojipackTabs = new ArrayList<>(); + } + boolean first = emojipackTabs.size() == 0 && emojiPacks.size() > 0 && appearCount != emojiPacks.size() && wasDrawn; + boolean doAppearAnimation = false;//emojipackTabs.size() == 0 && emojiPacks.size() > 0 && appearCount != emojiPacks.size() && wasDrawn; + if (appearAnimation != null && appearCount != emojiPacks.size()) { + appearAnimation.cancel(); + appearAnimation = null; + } + appearCount = emojiPacks.size(); + final boolean isPremium = UserConfig.getInstance(UserConfig.selectedAccount).isPremium(); + for (int i = 0; i < emojipackTabs.size(); ++i) { + EmojiTabButton emojipackTab = emojipackTabs.get(i); + EmojiView.EmojiPack pack = null; + if (emojipackTab != null && emojipackTab.id != null) { + for (int j = 0; j < emojiPacks.size(); ++j) { + EmojiView.EmojiPack p = emojiPacks.get(j); + final int id = Objects.hash(p.set.id, p.featured); + if (id == emojipackTab.id) { + pack = p; + break; + } + } + } + + if (pack == null && emojipackTab != null) { + Rect bounds = new Rect(); + bounds.set(emojipackTab.getLeft(), emojipackTab.getTop(), emojipackTab.getRight(), emojipackTab.getBottom()); + removingViews.put(emojipackTab, bounds); + ValueAnimator anm = ValueAnimator.ofFloat(emojipackTab.getAlpha(), 0f); + anm.addUpdateListener(a -> { + float alpha = (float) a.getAnimatedValue(); + emojipackTab.setAlpha(alpha); + emojipackTab.setScaleX(alpha); + emojipackTab.setScaleY(alpha); + contentView.invalidate(); + }); + anm.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + removingViews.remove(emojipackTab); + contentView.invalidate(); + } + }); + anm.setDuration(200); + anm.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + anm.start(); + emojipackTabs.remove(i--); + } + contentView.removeView(emojipackTab); + } + for (int i = 0; i < emojiPacks.size(); ++i) { + EmojiView.EmojiPack pack = emojiPacks.get(i); + final int id = Objects.hash(pack.set.id, pack.featured); + EmojiTabButton emojipackTab = null; + for (int j = 0; j < emojipackTabs.size(); ++j) { + EmojiTabButton tab = emojipackTabs.get(j); + if (tab != null && tab.id != null && tab.id == id) { + emojipackTab = tab; + break; + } + } + final boolean free = isFreeEmojiPack(pack.set, pack.documents); + AnimatedEmojiDrawable drawable = emojipackTab == null ? null : (AnimatedEmojiDrawable) emojipackTab.getDrawable(); + TLRPC.Document thumbDocument = getThumbDocument(pack.set, pack.documents); + if (thumbDocument != null && (drawable == null || drawable.getDocumentId() != thumbDocument.id)) { + drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, AnimatedEmojiDrawable.CACHE_TYPE_TAB_STRIP, thumbDocument); + } + if (emojipackTab == null) { + emojipackTab = new EmojiTabButton(getContext(), drawable, free, false,false); + emojipackTab.id = id; + if (drawable != null) { + drawable.addView(emojipackTab.imageView); + } + emojipackTabs.add(emojipackTab); + } else { + if (emojipackTab.getDrawable() instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) emojipackTab.getDrawable()).removeView(emojipackTab.imageView); + } + emojipackTab.setDrawable(drawable); + if (drawable != null) { + drawable.addView(emojipackTab.imageView); + } + } + if (!isPremium && !free) { + emojipackTab.setLock(true); + } else if (!pack.installed && !parent.installedEmojiSets.contains(pack.set.id)) { + emojipackTab.setLock(false); + } else { + emojipackTab.setLock(null); + } + if (doAppearAnimation && !first) { + emojipackTab.newly = false; + } + if (emojipackTab.getParent() instanceof ViewGroup) { + ((ViewGroup) emojipackTab.getParent()).removeView(emojipackTab); + } + contentView.addView(emojipackTab); + } + if (settingsTab != null) { + settingsTab.bringToFront(); + if (settingsTab.getAlpha() < 1) { + settingsTab.animate().alpha(1f).setDuration(200).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + } + } + if (doAppearAnimation) { + if (emojipackTabs != null) { + for (int i = 0; i < emojipackTabs.size(); ++i) { + emojipackTabs.get(i).setScaleX(0); + emojipackTabs.get(i).setScaleY(0); + } + } + appearAnimation = ValueAnimator.ofFloat(0, 1); + final OvershootInterpolator innerInterpolator = new OvershootInterpolator(3f); + appearAnimation.addUpdateListener(anm -> { + if (emojipackTabs == null) { + return; + } + final float t = (float) anm.getAnimatedValue(); + final int count = emojipackTabs.size(); + final float dur = 1f / count * 4.5f; + for (int i = 0; i < count; ++i) { + final float off = i / (float) count * (1f - dur); + final float T = MathUtils.clamp((t - off) / dur, 0, 1); + final float scale = innerInterpolator.getInterpolation(T); + emojipackTabs.get(i).setScaleX(scale); + emojipackTabs.get(i).setScaleY(scale); + } + }); + appearAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + if (emojipackTabs == null) { + return; + } + for (int i = 0; i < emojipackTabs.size(); ++i) { + emojipackTabs.get(i).setScaleX(1); + emojipackTabs.get(i).setScaleY(1); + } + } + }); + appearAnimation.setStartDelay(150); + appearAnimation.setDuration((emojipackTabs == null ? 0 : emojipackTabs.size()) * 75L); + appearAnimation.setInterpolator(CubicBezierInterpolator.EASE_OUT); + appearAnimation.start(); + } + updateClickListeners(); + } + + public void updateClickListeners() { + for (int i = 0, j = 0; i < contentView.getChildCount(); ++i, ++j) { + View child = contentView.getChildAt(i); + if (child instanceof EmojiTabsView) { + EmojiTabsView tabsView = (EmojiTabsView) child; + for (int a = 0; a < tabsView.contentView.getChildCount(); ++a, ++j) { + final int index = j; + tabsView.contentView.getChildAt(a).setOnClickListener(e -> { + onTabClick(index); + }); + } + --j; + } else if (child != null) { + final int index = j; + child.setOnClickListener(e -> { + onTabClick(index); + }); + } + } + if (settingsTab != null) { + settingsTab.setOnClickListener(e -> { + if (onSettingsOpenRunnable != null) { + onSettingsOpenRunnable.run(); + } + }); + } + } + + protected boolean onTabClick(int index) { + return true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + contentView.setPadding(AndroidUtilities.dp(5 + 6), 0, AndroidUtilities.dp(5 + 6), 0); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + public void updateColors() { + if (recentTab != null) { + recentTab.updateColor(); + } + } + + public void select(int index) { + select(index, true); + } + + public void select(int index, boolean animated) { + animated = animated && !first; + if (!recentIsShown) { + index = Math.max(1, index); + } + final int wasSelected = selected; + for (int i = 0, j = 0; i < contentView.getChildCount(); ++i, ++j) { + View child = contentView.getChildAt(i); + int from = j; + if (child instanceof EmojiTabsView) { + EmojiTabsView tabs = (EmojiTabsView) child; + for (int a = 0; a < tabs.contentView.getChildCount(); ++a, ++j) { + View child2 = tabs.contentView.getChildAt(a); + if (child2 instanceof EmojiTabButton) { + ((EmojiTabButton) child2).updateSelect(index == j, animated); + } + } + --j; + } else if (child instanceof EmojiTabButton) { + ((EmojiTabButton) child).updateSelect(index == j, animated); + } + if (index >= from && index <= j) { + selected = i; + } + } + if (wasSelected != selected) { + if (selectAnimator != null) { + selectAnimator.cancel(); + } + final float from = selectT, to = selected; + if (animated) { + selectAnimator = ValueAnimator.ofFloat(0, 1); + selectAnimator.addUpdateListener(a -> { + selectAnimationT = (float) a.getAnimatedValue(); + selectT = AndroidUtilities.lerp(from, to, selectAnimationT); + contentView.invalidate(); + }); + selectAnimator.setDuration(350); + selectAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + selectAnimator.start(); + } else { + selectAnimationT = 1f; + selectT = AndroidUtilities.lerp(from, to, selectAnimationT); + contentView.invalidate(); + } + + if (emojiTabs != null) { + emojiTabs.show(selected == 1, animated); + } + + View child = contentView.getChildAt(selected); + if (selected >= 2) { + scrollToVisible(child.getLeft(), child.getRight()); + } else { + scrollTo(0); + } + } + + if (wasIndex != index) { + if (emojiTabs != null && selected == 1 && index >= 1 && index <= 1 + emojiTabs.contentView.getChildCount()) { + emojiTabs.scrollToVisible(AndroidUtilities.dp(36 * (index - 1) - 6), AndroidUtilities.dp(36 * (index - 1) - 6 + 30)); + } + wasIndex = index; + } + } + + private int selectorColor() { + return 0x2effffff & Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider); + } + + private class EmojiTabButton extends ViewGroup { + public boolean shown = true; + + public Integer id; + public boolean newly; + + private ImageView imageView; + private RLottieDrawable lottieDrawable; + private PremiumLockIconView lockView; + private boolean round, forceSelector; + + public EmojiTabButton(Context context, int drawableId, int lottieId, boolean roundSelector, boolean forceSelector) { + super(context); + this.round = roundSelector; + this.forceSelector = forceSelector; + if (round) { + setBackground(Theme.createCircleSelectorDrawable(selectorColor(), 0, 0)); + } else if (forceSelector) { + setBackground(Theme.createRadSelectorDrawable(selectorColor(), 8, 8)); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + lottieDrawable = new RLottieDrawable(lottieId, "" + lottieId, AndroidUtilities.dp(24), AndroidUtilities.dp(24), false, null); + lottieDrawable.setBounds(AndroidUtilities.dp(3), AndroidUtilities.dp(3), AndroidUtilities.dp(27), AndroidUtilities.dp(27)); + lottieDrawable.setMasterParent(this); + lottieDrawable.setAllowDecodeSingleFrame(true); + lottieDrawable.start(); + } else { + imageView = new ImageView(context); + imageView.setImageDrawable(context.getResources().getDrawable(drawableId).mutate()); + addView(imageView); + } + setColor(Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider)); + } + + public EmojiTabButton(Context context, int drawableId, boolean roundSelector, boolean forceSelector) { + super(context); + this.round = roundSelector; + this.forceSelector = forceSelector; + if (round) { + setBackground(Theme.createCircleSelectorDrawable(selectorColor(), 0, 0)); + } else if (forceSelector) { + setBackground(Theme.createRadSelectorDrawable(selectorColor(), 8, 8)); + } + + imageView = new ImageView(context); + imageView.setImageDrawable(context.getResources().getDrawable(drawableId).mutate()); + setColor(Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider)); + + addView(imageView); + } + + public EmojiTabButton(Context context, Drawable drawable, boolean free, boolean roundSelector, boolean forceSelector) { + super(context); + this.newly = true; + this.round = roundSelector; + this.forceSelector = forceSelector; + if (round) { + setBackground(Theme.createCircleSelectorDrawable(selectorColor(), 0, 0)); + } else if (forceSelector) { + setBackground(Theme.createRadSelectorDrawable(selectorColor(), 8, 8)); + } + + imageView = new ImageView(context) { + @Override + public void invalidate() { + super.invalidate(); + updateLockImageReceiver(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (getDrawable() != null) { + getDrawable().setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + getDrawable().setAlpha(255); + getDrawable().draw(canvas); + } + } + }; + imageView.setImageDrawable(drawable); + addView(imageView); + + lockView = new PremiumLockIconView(context, PremiumLockIconView.TYPE_STICKERS_PREMIUM_LOCKED); + lockView.setAlpha(0f); + lockView.setScaleX(0); + lockView.setScaleY(0); + updateLockImageReceiver(); + addView(lockView); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (lottieDrawable != null) { + lottieDrawable.draw(canvas); + } + } + + @Override + public boolean performClick() { +// if (lottieDrawable != null) { +// lottieDrawable.setProgress(0); +// AndroidUtilities.runOnUIThread(() -> lottieDrawable.start(), 75); +// } + return super.performClick(); + } + + private boolean wasVisible; + public void updateVisibilityInbounds(boolean visible, boolean ignore) { + if (!wasVisible && visible) { + if (lottieDrawable != null && !lottieDrawable.isRunning() && !ignore) { + lottieDrawable.setProgress(0); + lottieDrawable.start(); + } + } + wasVisible = visible; + } + + public void setLock(Boolean lock) { + if (lockView == null) { + return; + } + if (lock == null) { + updateLock(false); + } else { + updateLock(true); + if (lock) { + lockView.setImageResource(R.drawable.msg_mini_lockedemoji); + } else { + Drawable addIcon = getResources().getDrawable(R.drawable.msg_mini_addemoji).mutate(); + addIcon.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY)); + lockView.setImageDrawable(addIcon); + } + } + } + + private float lockT; + private ValueAnimator lockAnimator; + private void updateLock(boolean enable) { + if (lockAnimator != null) { + lockAnimator.cancel(); + } + if (Math.abs(lockT - (enable ? 1f : 0f)) < 0.01f) { + return; + } + lockView.setVisibility(View.VISIBLE); + lockAnimator = ValueAnimator.ofFloat(lockT, enable ? 1f : 0f); + lockAnimator.addUpdateListener(anm -> { + lockT = (float) anm.getAnimatedValue(); + lockView.setScaleX(lockT); + lockView.setScaleY(lockT); + lockView.setAlpha(lockT); + }); + lockAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (!enable) { + lockView.setVisibility(View.GONE); + } + } + }); + lockAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + lockAnimator.setDuration(200); + lockAnimator.start(); + } + + public void updateLockImageReceiver() { + if (lockView != null && !lockView.ready() && getDrawable() instanceof AnimatedEmojiDrawable) { + ImageReceiver imageReceiver = ((AnimatedEmojiDrawable) getDrawable()).getImageReceiver(); + if (imageReceiver != null) { + lockView.setImageReceiver(imageReceiver); + lockView.invalidate(); + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(AndroidUtilities.dp(30), AndroidUtilities.dp(30)); + if (imageView != null) { + imageView.measure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24), MeasureSpec.EXACTLY) + ); + } + if (lockView != null) { + lockView.measure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(12), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(12), MeasureSpec.EXACTLY) + ); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (imageView != null) { + int cx = (r - l) / 2, cy = (b - t) / 2; + imageView.layout(cx - imageView.getMeasuredWidth() / 2, cy - imageView.getMeasuredHeight() / 2, cx + imageView.getMeasuredWidth() / 2, cy + imageView.getMeasuredHeight() / 2); + } + if (lockView != null) { + lockView.layout(r - l - lockView.getMeasuredWidth(), b - t - lockView.getMeasuredHeight(), r - l, b - t); + } + } + + public Drawable getDrawable() { + return imageView != null ? imageView.getDrawable() : null; + } + + public void setDrawable(Drawable drawable) { + if (lockView != null && drawable instanceof AnimatedEmojiDrawable) { + ImageReceiver imageReceiver = ((AnimatedEmojiDrawable) drawable).getImageReceiver(); + if (imageReceiver != null) { + lockView.setImageReceiver(imageReceiver); + } + } + if (imageView != null) { + imageView.setImageDrawable(drawable); + } + } + + private float selectT; + private boolean selected; + private ValueAnimator selectAnimator; + public void updateSelect(boolean selected, boolean animated) { + if (imageView != null && imageView.getDrawable() == null) { + return; + } + if (this.selected == selected) { + return; + } + this.selected = selected; + if (selectAnimator != null) { + selectAnimator.cancel(); + selectAnimator = null; + } + + if (animated) { + selectAnimator = ValueAnimator.ofFloat(selectT, selected ? 1f : 0f); + selectAnimator.addUpdateListener(a -> { + selectT = (float) a.getAnimatedValue(); + setColor(ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider), Theme.getColor(Theme.key_chat_emojiPanelIconSelected, resourcesProvider), selectT)); + }); + selectAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (!round) { + if (selected || forceSelector) { + if (getBackground() == null) { + setBackground(Theme.createRadSelectorDrawable(selectorColor(), 8, 8)); + } + } else { + setBackground(null); + } + } + } + }); + selectAnimator.setDuration(350); + selectAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + selectAnimator.start(); + } else { + selectT = selected ? 1f : 0f; + updateColor(); + } + } + + public void updateColor() { + Theme.setSelectorDrawableColor(getBackground(), selectorColor(), false); + setColor( + ColorUtils.blendARGB( + Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider), + Theme.getColor(Theme.key_chat_emojiPanelIconSelected, resourcesProvider), + selectT + ) + ); + } + + private void setColor(int color) { + PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY); + if (imageView != null) { + imageView.setColorFilter(colorFilter); + imageView.invalidate(); + } + if (lottieDrawable != null) { + lottieDrawable.setColorFilter(colorFilter); + invalidate(); + } + } + } + + private class EmojiTabsView extends ScrollableHorizontalScrollView { + public int id; + + private LinearLayout contentView; + + public EmojiTabsView(Context context) { + super(context); + setSmoothScrollingEnabled(true); + setHorizontalScrollBarEnabled(false); + setVerticalScrollBarEnabled(false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setNestedScrollingEnabled(true); + } + contentView = new LinearLayout(context) { + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int x = getPaddingLeft(), cy = (b - t) / 2; + for (int i = 0; i < getChildCount(); ++i) { + View child = getChildAt(i); + if (child == settingsTab) { + continue; + } + if (child != null) { + child.layout(x, cy - child.getMeasuredHeight() / 2, x + child.getMeasuredWidth(), cy + child.getMeasuredHeight() / 2); + x += child.getMeasuredWidth() + AndroidUtilities.dp(2); + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + Math.max(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp((30 + 2) * contentView.getChildCount()), MeasureSpec.EXACTLY)), + heightMeasureSpec + ); + } + }; + contentView.setOrientation(LinearLayout.HORIZONTAL); + addView(contentView, new LayoutParams(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT)); + + for (int i = 0; i < emojiTabsDrawableIds.length; ++i) { + contentView.addView(new EmojiTabButton(context, emojiTabsDrawableIds[i], emojiTabsAnimatedDrawableIds[i], true, false) { + @Override + public boolean onTouchEvent(MotionEvent ev) { + intercept(ev); + return super.onTouchEvent(ev); + } + }); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.lerp(AndroidUtilities.dp(30), maxWidth(), showT), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(30), MeasureSpec.EXACTLY) + ); + } + + public int maxWidth() { + return AndroidUtilities.dp((30 + 2) * Math.min(5.7f, contentView.getChildCount())); + } + + private boolean touching = false; + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + if (Math.abs(t - oldt) < 2 || t >= getMeasuredHeight() || t == 0) { + if (!touching) { + EmojiTabsStrip.this.requestDisallowInterceptTouchEvent(false); + } + } + updateButtonsVisibility(); + } + + private void updateButtonsVisibility() { + final int count = contentView.getChildCount(); + for (int i = 0; i < count; ++i) { + View child = contentView.getChildAt(i); + if (child instanceof EmojiTabButton) { + ((EmojiTabButton) child).updateVisibilityInbounds(child.getRight() - getScrollX() > 0 && child.getLeft() - getScrollX() < getMeasuredWidth(), scrollingAnimation && !(showAnimator != null && showAnimator.isRunning())); + } + } + } + + private void intercept(MotionEvent ev) { + if (shown && !scrollingAnimation) { + switch (ev.getAction()) { + case MotionEvent.ACTION_UP: + touching = false; + break; + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + touching = true; + if (!scrollingAnimation) { + resetScrollTo(); + } + EmojiTabsStrip.this.requestDisallowInterceptTouchEvent(true); + break; + } + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + intercept(ev); + return super.onTouchEvent(ev); + } + + private boolean shown = false; + private float showT = 0f; + private ValueAnimator showAnimator; + public void show(boolean show, boolean animated) { + if (show == shown) { + return; + } + shown = show; + if (!show) { + scrollTo(0); + } + + if (showAnimator != null) { + showAnimator.cancel(); + } + if (animated) { + showAnimator = ValueAnimator.ofFloat(showT, show ? 1f : 0f); + showAnimator.addUpdateListener(a -> { + showT = (float) a.getAnimatedValue(); + invalidate(); + requestLayout(); + updateButtonsVisibility(); + EmojiTabsStrip.this.contentView.invalidate(); + }); + showAnimator.setDuration(475); + showAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + showAnimator.start(); + } else { + showT = show ? 1f : 0f; + invalidate(); + requestLayout(); + updateButtonsVisibility(); + EmojiTabsStrip.this.contentView.invalidate(); + } + } + } +} + +class ScrollableHorizontalScrollView extends HorizontalScrollView { + public ScrollableHorizontalScrollView(Context context) { + super(context); + } + + protected boolean scrollingAnimation; + public boolean isScrolling() { + return scrollingAnimation; + } + + public boolean scrollToVisible(int left, int right) { + if (getChildCount() <= 0) { + return false; + } + final int padding = AndroidUtilities.dp(50); + int to; + if (left < getScrollX() + padding) { + to = left - padding; + } else if (right > getScrollX() + (getMeasuredWidth() - padding)) { + to = right - getMeasuredWidth() + padding; + } else { + return false; + } + + scrollTo(MathUtils.clamp(to, 0, getChildAt(0).getMeasuredWidth() - getMeasuredWidth())); + return true; + } + + private int scrollingTo = -1; + private ValueAnimator scrollAnimator; + public void scrollTo(int x) { + if (scrollingTo == x) { + return; + } + scrollingTo = x; + if (scrollAnimator != null) { + scrollAnimator.cancel(); + } + if (this.getScrollX() == x) { + return; + } + scrollAnimator = ValueAnimator.ofFloat(this.getScrollX(), x); + scrollAnimator.addUpdateListener(a -> this.setScrollX((int) (float) a.getAnimatedValue())); + scrollAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + scrollAnimator.setDuration(250); + scrollAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + scrollingAnimation = false; + } + + @Override + public void onAnimationStart(Animator animation) { + scrollingAnimation = true; + if (getParent() instanceof HorizontalScrollView) { + ((HorizontalScrollView) getParent()).requestDisallowInterceptTouchEvent(false); + } + } + }); + scrollAnimator.start(); + } + + public void resetScrollTo() { + scrollingTo = -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 1179588c3..da8cc0dcd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -13,24 +13,29 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.StateListAnimator; +import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.annotation.TargetApi; -import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.DashPathEffect; import android.graphics.Outline; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.RippleDrawable; import android.graphics.drawable.ShapeDrawable; import android.os.Build; +import android.os.Bundle; +import android.os.SystemClock; import android.text.Editable; import android.text.SpannableStringBuilder; import android.text.TextUtils; @@ -51,6 +56,7 @@ import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.OvershootInterpolator; import android.view.inputmethod.EditorInfo; import android.widget.FrameLayout; import android.widget.ImageView; @@ -61,7 +67,11 @@ import android.widget.TextView; import androidx.annotation.IntDef; import androidx.annotation.MainThread; import androidx.annotation.NonNull; +import androidx.core.graphics.ColorUtils; +import androidx.core.math.MathUtils; import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearSmoothScroller; @@ -88,14 +98,17 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; +import org.telegram.messenger.SharedConfig; import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.RequestDelegate; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; 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.Cells.ContextLinkCell; @@ -104,25 +117,33 @@ import org.telegram.ui.Cells.FeaturedStickerSetInfoCell; import org.telegram.ui.Cells.StickerEmojiCell; import org.telegram.ui.Cells.StickerSetGroupInfoCell; import org.telegram.ui.Cells.StickerSetNameCell; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.ListView.RecyclerListViewWithOverlayDraw; +import org.telegram.ui.Components.Premium.PremiumButtonView; import org.telegram.ui.Components.Premium.PremiumGradient; import org.telegram.ui.ContentPreviewViewer; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; +import java.util.Objects; public class EmojiView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { - private ArrayList views = new ArrayList<>(); + private final static int TAB_EMOJI = 0; + private final static int TAB_GIFS = 1; + private final static int TAB_STICKERS = 2; + + private ArrayList allTabs = new ArrayList<>(); + private ArrayList currentTabs = new ArrayList<>(); private ViewPager pager; private FrameLayout bottomTabContainer; + private FrameLayout bulletinContainer; private View bottomTabContainerBackground; private ImageView floatingButton; private PagerSlidingTabStrip typeTabs; @@ -130,26 +151,28 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private ImageView stickerSettingsButton; private ImageView searchButton; private View shadowLine; - private View topShadow; private AnimatorSet bottomTabContainerAnimation; private AnimatorSet backspaceButtonAnimation; private AnimatorSet stickersButtonAnimation; private float lastBottomScrollDy; - private ScrollSlidingTabStrip emojiTabs; + private EmojiTabsStrip emojiTabs; private FrameLayout emojiContainer; private View emojiTabsShadow; - private RecyclerListView emojiGridView; + private EmojiGridView emojiGridView; private GridLayoutManager emojiLayoutManager; private EmojiGridAdapter emojiAdapter; private EmojiSearchAdapter emojiSearchAdapter; + private TrendingAdapter trendingEmojiAdapter; private SearchField emojiSearchField; private AnimatorSet emojiTabShadowAnimator; - private RecyclerAnimationScrollHelper scrollHelper; + private RecyclerAnimationScrollHelper stickersScrollHelper; + private RecyclerAnimationScrollHelper emojiScrollHelper; private boolean firstEmojiAttach = true; private boolean needEmojiSearch; private int hasRecentEmoji = -1; private boolean hasChatStickers; + private boolean emojiSmoothScrolling; private FrameLayout gifContainer; private RecyclerListView gifGridView; @@ -180,6 +203,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private boolean firstStickersAttach = true; private boolean ignoreStickersScroll; private boolean stickersContainerAttached; + EmojiPagesAdapter emojiPagerAdapter; private AnimatorSet searchAnimation; @@ -192,6 +216,27 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private boolean firstTabUpdate; private ChooseStickerActionTracker chooseStickerActionTracker; + public void setAllow(boolean allowStickers, boolean allowGifs, boolean animated) { + currentTabs.clear(); + for (int i = 0; i < allTabs.size(); i++) { + if (allTabs.get(i).type == TAB_EMOJI) { + currentTabs.add(allTabs.get(i)); + } if (allTabs.get(i).type == TAB_GIFS && allowGifs) { + currentTabs.add(allTabs.get(i)); + } if (allTabs.get(i).type == TAB_STICKERS && allowStickers) { + currentTabs.add(allTabs.get(i)); + } + } + if (typeTabs != null) { + AndroidUtilities.updateViewVisibilityAnimated(typeTabs, currentTabs.size() > 1, 1, animated); + } + pager.setAdapter(null); + pager.setAdapter(emojiPagerAdapter); + if (typeTabs != null) { + typeTabs.setViewPager(pager); + } + } + @IntDef({Type.STICKERS, Type.EMOJIS, Type.GIFS}) @Retention(RetentionPolicy.SOURCE) private @interface Type { @@ -203,14 +248,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private String[] lastSearchKeyboardLanguage; private Drawable[] tabIcons; - private Drawable[] emojiIcons; private Drawable[] stickerIcons; private Drawable[] gifIcons; private String[] emojiTitles; private int searchFieldHeight; - private int currentAccount = UserConfig.selectedAccount; + public int currentAccount = UserConfig.selectedAccount; private ArrayList stickerSets = new ArrayList<>(); private int groupStickerPackNum; private int groupStickerPackPosition; @@ -223,6 +267,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private ArrayList premiumStickers = new ArrayList<>(); private ArrayList featuredStickerSets = new ArrayList<>(); + private ArrayList featuredEmojiSets = new ArrayList<>(); + private ArrayList keepFeaturedDuplicate = new ArrayList<>(); + private ArrayList expandedEmojiSets = new ArrayList<>(); + public ArrayList installedEmojiSets = new ArrayList<>(); + private ArrayList emojipacksProcessed = new ArrayList<>(); + private HashMap> toInstall = new HashMap<>(); + private Paint dotPaint; private EmojiViewDelegate delegate; @@ -254,6 +305,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private Object outlineProvider; private boolean forseMultiwindowLayout; + private Paint emojiLockPaint; + private Drawable emojiLockDrawable; + private int lastNotifyWidth; private int lastNotifyHeight; private int lastNotifyHeight2; @@ -269,9 +323,15 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private float emojiTouchedY; private float lastStickersX; private boolean expandStickersByDragg; + private BaseFragment fragment; private final Theme.ResourcesProvider resourcesProvider; private Drawable searchIconDrawable; private Drawable searchIconDotDrawable; + private boolean allowAnimatedEmoji; + + private Long emojiScrollToStickerId; + + private LongSparseArray animatedEmojiDrawables; private Runnable checkExpandStickerTabsRunnable = new Runnable() { @Override @@ -288,10 +348,18 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific return false; } + default boolean isUserSelf() { + return false; + } + default void onEmojiSelected(String emoji) { } + default void onCustomEmojiSelected(long documentId, TLRPC.Document document, String emoticon) { + + } + default void onStickerSelected(View view, TLRPC.Document sticker, String query, Object parent, MessageObject.SendAnimationData sendAnimationData, boolean notify, int scheduleDate) { } @@ -300,6 +368,10 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } + default void onEmojiSettingsClick() { + + } + default void onStickersGroupClick(long chatId) { } @@ -332,6 +404,10 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } + default void onAnimatedEmojiUnlockClick() { + // should open premium bottom sheet feature + } + default boolean isSearchOpened() { return false; } @@ -842,8 +918,19 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } + private boolean premiumBulletin = true; private class ImageViewEmoji extends ImageView { + public int position; + + public ImageReceiver imageReceiver; + public AnimatedEmojiDrawable drawable; + public boolean ignoring; private boolean isRecent; + private AnimatedEmojiSpan span; + private EmojiPack pack; + private ImageReceiver.BackgroundThreadDrawHolder backgroundThreadDrawHolder; + float pressedProgress; + ValueAnimator backAnimator; public ImageViewEmoji(Context context) { super(context); @@ -852,6 +939,78 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } private void sendEmoji(String override) { + if (getSpan() != null) { +// if (pack != null && pack.set != null && (pack.free || UserConfig.getInstance(currentAccount).isPremium())) { +// openEmojiPackAlert(pack.set); +// return; +// } + if (delegate != null) { + long documentId = getSpan().documentId; + TLRPC.Document document = getSpan().document; + String emoticon = null; + if (document == null) { + for (int i = 0; i < emojipacksProcessed.size(); ++i) { + EmojiPack pack = emojipacksProcessed.get(i); + for (int j = 0; pack.documents != null && j < pack.documents.size(); ++j) { + if (pack.documents.get(j).id == documentId) { + document = pack.documents.get(j); + break; + } + } + } + } + if (document == null) { + document = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); + } + if (emoticon == null && document != null) { + emoticon = MessageObject.findAnimatedEmojiEmoticon(document); + } + if (!MessageObject.isFreeEmoji(document) && !UserConfig.getInstance(currentAccount).isPremium() && !(delegate != null && delegate.isUserSelf())) { + showBottomTab(false, true); + BulletinFactory factory = fragment != null ? BulletinFactory.of(fragment) : BulletinFactory.of(bulletinContainer, resourcesProvider); + if (premiumBulletin || fragment == null) { + factory.createEmojiBulletin( + document, + AndroidUtilities.replaceTags(LocaleController.getString("UnlockPremiumEmojiHint", R.string.UnlockPremiumEmojiHint)), + LocaleController.getString("PremiumMore", R.string.PremiumMore), + EmojiView.this::openPremiumAnimatedEmojiFeature + ).show(); + } else { + factory.createSimpleBulletin( + R.raw.saved_messages, + AndroidUtilities.replaceTags(LocaleController.getString("UnlockPremiumEmojiHint2", R.string.UnlockPremiumEmojiHint2)), + LocaleController.getString("Open", R.string.Open), + () -> { + Bundle args = new Bundle(); + args.putLong("user_id", UserConfig.getInstance(currentAccount).getClientUserId()); + fragment.presentFragment(new ChatActivity(args) { + @Override + public void onTransitionAnimationEnd(boolean isOpen, boolean backward) { + super.onTransitionAnimationEnd(isOpen, backward); + if (isOpen && chatActivityEnterView != null) { + chatActivityEnterView.showEmojiView(); + chatActivityEnterView.postDelayed(() -> { + if (chatActivityEnterView.getEmojiView() != null) { + chatActivityEnterView.getEmojiView().scrollEmojisToAnimated(); + } + }, 100); + } + } + }); + } + ).show(); + } + premiumBulletin = !premiumBulletin; + return; + } + shownBottomTabAfterClick = SystemClock.elapsedRealtime(); + showBottomTab(true, true); + addEmojiToRecent("animated_" + documentId); + delegate.onCustomEmojiSelected(documentId, document, emoticon); + } + return; + } + shownBottomTabAfterClick = SystemClock.elapsedRealtime(); showBottomTab(true, true); String code = override != null ? override : (String) getTag(); SpannableStringBuilder builder = new SpannableStringBuilder(); @@ -879,6 +1038,14 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific isRecent = recent; } + public void setSpan(AnimatedEmojiSpan span) { + this.span = span; + } + + public AnimatedEmojiSpan getSpan() { + return this.span; + } + @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(View.MeasureSpec.getSize(widthMeasureSpec), View.MeasureSpec.getSize(widthMeasureSpec)); @@ -889,6 +1056,52 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific super.onInitializeAccessibilityNodeInfo(info); info.setClassName("android.view.View"); } + + @Override + public void setPressed(boolean pressed) { + if (isPressed() != pressed) { + super.setPressed(pressed); + invalidate(); + if (pressed) { + if (backAnimator != null) { + backAnimator.removeAllListeners(); + backAnimator.cancel(); + } + } + if (!pressed && pressedProgress != 0) { + backAnimator = ValueAnimator.ofFloat(pressedProgress, 0); + backAnimator.addUpdateListener(animation -> { + pressedProgress = (float) animation.getAnimatedValue(); + invalidate(); + }); + backAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + backAnimator = null; + } + }); + backAnimator.setInterpolator(new OvershootInterpolator(5.0f)); + backAnimator.setDuration(350); + backAnimator.start(); + } + } + } + + + @Override + protected void onDraw(Canvas canvas) { + if (isPressed() && pressedProgress != 1f) { + pressedProgress += 16f / 100f; + pressedProgress = Utilities.clamp(pressedProgress, 1f, 0); + invalidate(); + } + float s = 0.8f + 0.2f * (1f - pressedProgress); + canvas.save(); + canvas.scale(s, s, getMeasuredWidth() / 2f, getMeasuredHeight() / 2f); + super.onDraw(canvas); + canvas.restore(); + } } private class EmojiPopupWindow extends PopupWindow { @@ -1002,6 +1215,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private class EmojiColorPickerView extends View { + private Drawable[] drawables = new Drawable[6]; private Drawable backgroundDrawable; private Drawable arrowDrawable; private String currentEmoji; @@ -1009,11 +1223,38 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private int selection; private Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private RectF rect = new RectF(); + private AnimatedFloat selectionAnimated = new AnimatedFloat(this, 125, CubicBezierInterpolator.EASE_OUT_QUINT); public void setEmoji(String emoji, int arrowPosition) { currentEmoji = emoji; arrowX = arrowPosition; - rectPaint.setColor(0x2f000000); + for (int i = 0; i < drawables.length; ++i) { + String coloredCode = emoji; + if (i != 0) { + String color; + switch (i) { + case 1: + color = "\uD83C\uDFFB"; + break; + case 2: + color = "\uD83C\uDFFC"; + break; + case 3: + color = "\uD83C\uDFFD"; + break; + case 4: + color = "\uD83C\uDFFE"; + break; + case 5: + color = "\uD83C\uDFFF"; + break; + default: + color = ""; + } + coloredCode = addColorToCode(emoji, color); + } + drawables[i] = Emoji.getEmojiBigDrawable(coloredCode); + } invalidate(); } @@ -1050,51 +1291,34 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific arrowDrawable.setBounds(arrowX - AndroidUtilities.dp(9), AndroidUtilities.dp(AndroidUtilities.isTablet() ? 55.5f : 47.5f), arrowX + AndroidUtilities.dp(9), AndroidUtilities.dp((AndroidUtilities.isTablet() ? 55.5f : 47.5f) + 8)); arrowDrawable.draw(canvas); + float select = selectionAnimated.set(selection); + float x = emojiSize * select + AndroidUtilities.dp(5 + 4 * select); + float y = AndroidUtilities.dp(9); + rect.set(x, y - (int) AndroidUtilities.dpf2(3.5f), x + emojiSize, y + emojiSize + AndroidUtilities.dp(3)); + rectPaint.setColor(getThemedColor(Theme.key_listSelector)); + canvas.drawRoundRect(rect, AndroidUtilities.dp(4), AndroidUtilities.dp(4), rectPaint); + if (currentEmoji != null) { - String code; for (int a = 0; a < 6; a++) { - int x = emojiSize * a + AndroidUtilities.dp(5 + 4 * a); - int y = AndroidUtilities.dp(9); - if (selection == a) { - rect.set(x, y - (int) AndroidUtilities.dpf2(3.5f), x + emojiSize, y + emojiSize + AndroidUtilities.dp(3)); - canvas.drawRoundRect(rect, AndroidUtilities.dp(4), AndroidUtilities.dp(4), rectPaint); - } - code = currentEmoji; - if (a != 0) { - String color; - switch (a) { - case 1: - color = "\uD83C\uDFFB"; - break; - case 2: - color = "\uD83C\uDFFC"; - break; - case 3: - color = "\uD83C\uDFFD"; - break; - case 4: - color = "\uD83C\uDFFE"; - break; - case 5: - color = "\uD83C\uDFFF"; - break; - default: - color = ""; - } - code = addColorToCode(code, color); - } - Drawable drawable = Emoji.getEmojiBigDrawable(code); + Drawable drawable = drawables[a]; if (drawable != null) { - drawable.setBounds(x, y, x + emojiSize, y + emojiSize); + x = emojiSize * a + AndroidUtilities.dp(5 + 4 * a); + float scale = .9f + .1f * (1f - Math.min(.5f, Math.abs(a - select)) * 2f); + canvas.save(); + canvas.scale(scale, scale, x + emojiSize / 2f, y + emojiSize / 2f); + drawable.setBounds((int) x, (int) y, (int) x + emojiSize, (int) y + emojiSize); drawable.draw(canvas); + canvas.restore(); } } } } } - public EmojiView(boolean needStickers, boolean needGif, final Context context, boolean needSearch, final TLRPC.ChatFull chatFull, ViewGroup parentView, Theme.ResourcesProvider resourcesProvider) { + public EmojiView(BaseFragment fragment, boolean needAnimatedEmoji, boolean needStickers, boolean needGif, final Context context, boolean needSearch, final TLRPC.ChatFull chatFull, ViewGroup parentView, Theme.ResourcesProvider resourcesProvider) { super(context); + this.fragment = fragment; + this.allowAnimatedEmoji = needAnimatedEmoji; this.resourcesProvider = resourcesProvider; int color = getThemedColor(Theme.key_chat_emojiBottomPanelIcon); @@ -1104,36 +1328,24 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific needEmojiSearch = needSearch; tabIcons = new Drawable[]{ - Theme.createEmojiIconSelectorDrawable(context, R.drawable.smiles_tab_smiles, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.smiles_tab_gif, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.smiles_tab_stickers, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)) - }; - - emojiIcons = new Drawable[]{ - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_recent, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_smiles, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_cat, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_food, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_activities, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_travel, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_objects, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_other, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_flags, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.smiles_tab_smiles, getThemedColor(Theme.key_chat_emojiPanelBackspace), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.smiles_tab_gif, getThemedColor(Theme.key_chat_emojiPanelBackspace), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.smiles_tab_stickers, getThemedColor(Theme.key_chat_emojiPanelBackspace), getThemedColor(Theme.key_chat_emojiPanelIconSelected)) }; stickerIcons = new Drawable[]{ - Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_recent, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_faves, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_new3, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_recent, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_faves, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_new3, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), new LayerDrawable(new Drawable[]{ - searchIconDrawable = Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_new1, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + searchIconDrawable = Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_new1, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), searchIconDotDrawable = Theme.createEmojiIconSelectorDrawable(context, R.drawable.emoji_tabs_new2, getThemedColor(Theme.key_chat_emojiPanelStickerPackSelectorLine), getThemedColor(Theme.key_chat_emojiPanelStickerPackSelectorLine)) }) }; gifIcons = new Drawable[]{ - Theme.createEmojiIconSelectorDrawable(context, R.drawable.stickers_recent, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), - Theme.createEmojiIconSelectorDrawable(context, R.drawable.stickers_gifs_trending, getThemedColor(Theme.key_chat_emojiBottomPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.msg_emoji_recent, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), + Theme.createEmojiIconSelectorDrawable(context, R.drawable.stickers_gifs_trending, getThemedColor(Theme.key_chat_emojiPanelIcon), getThemedColor(Theme.key_chat_emojiPanelIconSelected)), }; emojiTitles = new String[]{ @@ -1164,130 +1376,147 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } emojiContainer = new FrameLayout(context); - views.add(emojiContainer); - - emojiGridView = new RecyclerListView(context) { - - private boolean ignoreLayout; + Tab emojiTab = new Tab(); + emojiTab.type = TAB_EMOJI; + emojiTab.view = emojiContainer; + allTabs.add(emojiTab); + if (needAnimatedEmoji) { + MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_EMOJIPACKS); + MediaDataController.getInstance(currentAccount).checkFeaturedEmoji(); + } + emojiGridView = new EmojiGridView(context); + DefaultItemAnimator emojiItemAnimator = new DefaultItemAnimator(); + emojiItemAnimator.setAddDelay(0); + emojiItemAnimator.setAddDuration(220); + emojiItemAnimator.setMoveDuration(220); + emojiItemAnimator.setChangeDuration(160); + emojiItemAnimator.setMoveInterpolator(CubicBezierInterpolator.EASE_OUT); + emojiGridView.setItemAnimator(emojiItemAnimator); + emojiGridView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() { @Override - protected void onMeasure(int widthSpec, int heightSpec) { - ignoreLayout = true; - int width = MeasureSpec.getSize(widthSpec); - emojiLayoutManager.setSpanCount(Math.max(1, width / AndroidUtilities.dp(AndroidUtilities.isTablet() ? 60 : 45))); - ignoreLayout = false; - super.onMeasure(widthSpec, heightSpec); - } + public boolean onItemClick(View view, int position) { + if (view instanceof ImageViewEmoji) { + ImageViewEmoji viewEmoji = (ImageViewEmoji) view; - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - if (needEmojiSearch && firstEmojiAttach) { - ignoreLayout = true; - emojiLayoutManager.scrollToPositionWithOffset(1, 0); - firstEmojiAttach = false; - ignoreLayout = false; - } - super.onLayout(changed, l, t, r, b); - checkEmojiSearchFieldScroll(true); - } + if (viewEmoji.isRecent) { + RecyclerListView.ViewHolder holder = emojiGridView.findContainingViewHolder(view); + if (holder != null && holder.getAdapterPosition() <= getRecentEmoji().size()) { + delegate.onClearEmojiRecent(); + } + emojiGridView.clearTouchesFor(view); + return true; + } else if (viewEmoji.getSpan() == null) { + String code = (String) viewEmoji.getTag(); + if (code == null) { + return false; + } - @Override - public void requestLayout() { - if (ignoreLayout) { - return; - } - super.requestLayout(); - } + String color = null; - @Override - public boolean onTouchEvent(MotionEvent event) { - if (emojiTouchedView != null) { - if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { - if (pickerViewPopup != null && pickerViewPopup.isShowing()) { - pickerViewPopup.dismiss(); - - String color = null; - switch (pickerView.getSelection()) { - case 1: - color = "\uD83C\uDFFB"; - break; - case 2: - color = "\uD83C\uDFFC"; - break; - case 3: - color = "\uD83C\uDFFD"; - break; - case 4: - color = "\uD83C\uDFFE"; - break; - case 5: - color = "\uD83C\uDFFF"; - break; - } - String code = (String) emojiTouchedView.getTag(); - if (!emojiTouchedView.isRecent) { - if (color != null) { - Emoji.emojiColor.put(code, color); - code = addColorToCode(code, color); - } else { - Emoji.emojiColor.remove(code); - } - emojiTouchedView.setImageDrawable(Emoji.getEmojiBigDrawable(code), emojiTouchedView.isRecent); - emojiTouchedView.sendEmoji(null); - Emoji.saveEmojiColors(); - } else { - code = code.replace("\uD83C\uDFFB", "") - .replace("\uD83C\uDFFC", "") - .replace("\uD83C\uDFFD", "") - .replace("\uD83C\uDFFE", "") - .replace("\uD83C\uDFFF", ""); - - if (color != null) { - emojiTouchedView.sendEmoji(addColorToCode(code, color)); - } else { - emojiTouchedView.sendEmoji(code); - } + String toCheck = code.replace("\uD83C\uDFFB", ""); + if (toCheck != code) { + color = "\uD83C\uDFFB"; + } + if (color == null) { + toCheck = code.replace("\uD83C\uDFFC", ""); + if (toCheck != code) { + color = "\uD83C\uDFFC"; } } - emojiTouchedView = null; - emojiTouchedX = -10000; - emojiTouchedY = -10000; - } else if (event.getAction() == MotionEvent.ACTION_MOVE) { - boolean ignore = false; - if (emojiTouchedX != -10000) { - if (Math.abs(emojiTouchedX - event.getX()) > AndroidUtilities.getPixelsInCM(0.2f, true) || Math.abs(emojiTouchedY - event.getY()) > AndroidUtilities.getPixelsInCM(0.2f, false)) { - emojiTouchedX = -10000; - emojiTouchedY = -10000; - } else { - ignore = true; + if (color == null) { + toCheck = code.replace("\uD83C\uDFFD", ""); + if (toCheck != code) { + color = "\uD83C\uDFFD"; } } - if (!ignore) { - getLocationOnScreen(location); - float x = location[0] + event.getX(); - pickerView.getLocationOnScreen(location); - x -= location[0] + AndroidUtilities.dp(3); - int position = (int) (x / (emojiSize + AndroidUtilities.dp(4))); - if (position < 0) { - position = 0; - } else if (position > 5) { - position = 5; + if (color == null) { + toCheck = code.replace("\uD83C\uDFFE", ""); + if (toCheck != code) { + color = "\uD83C\uDFFE"; } - pickerView.setSelection(position); + } + if (color == null) { + toCheck = code.replace("\uD83C\uDFFF", ""); + if (toCheck != code) { + color = "\uD83C\uDFFF"; + } + } + if (EmojiData.emojiColoredMap.contains(toCheck)) { + emojiTouchedView = viewEmoji; + emojiTouchedX = emojiLastX; + emojiTouchedY = emojiLastY; + + if (color == null && !viewEmoji.isRecent) { + color = Emoji.emojiColor.get(toCheck); + } + + if (color != null) { + switch (color) { + case "\uD83C\uDFFB": + pickerView.setSelection(1); + break; + case "\uD83C\uDFFC": + pickerView.setSelection(2); + break; + case "\uD83C\uDFFD": + pickerView.setSelection(3); + break; + case "\uD83C\uDFFE": + pickerView.setSelection(4); + break; + case "\uD83C\uDFFF": + pickerView.setSelection(5); + break; + } + } else { + pickerView.setSelection(0); + } + viewEmoji.getLocationOnScreen(location); + int x = emojiSize * pickerView.getSelection() + AndroidUtilities.dp(4 * pickerView.getSelection() - (AndroidUtilities.isTablet() ? 5 : 1)); + if (location[0] - x < AndroidUtilities.dp(5)) { + x += (location[0] - x) - AndroidUtilities.dp(5); + } else if (location[0] - x + popupWidth > AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)) { + x += (location[0] - x + popupWidth) - (AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)); + } + int xOffset = -x; + int yOffset = viewEmoji.getTop() < 0 ? viewEmoji.getTop() : 0; + + pickerView.setEmoji(toCheck, AndroidUtilities.dp(AndroidUtilities.isTablet() ? 30 : 22) - xOffset + (int) AndroidUtilities.dpf2(0.5f)); + + pickerViewPopup.setFocusable(true); + pickerViewPopup.showAsDropDown(view, xOffset, -view.getMeasuredHeight() - popupHeight + (view.getMeasuredHeight() - emojiSize) / 2 - yOffset); + pager.requestDisallowInterceptTouchEvent(true); + emojiGridView.hideSelector(true); + emojiGridView.clearTouchesFor(view); + return true; } } - return true; } - emojiLastX = event.getX(); - emojiLastY = event.getY(); - return super.onTouchEvent(event); + return false; } - }; + }); emojiGridView.setInstantClick(true); - emojiGridView.setLayoutManager(emojiLayoutManager = new GridLayoutManager(context, 8)); + emojiGridView.setLayoutManager(emojiLayoutManager = new GridLayoutManager(context, 8) { + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + try { + LinearSmoothScrollerCustom linearSmoothScroller = new LinearSmoothScrollerCustom(recyclerView.getContext(), LinearSmoothScrollerCustom.POSITION_TOP) { + @Override + public void onEnd() { + emojiSmoothScrolling = false; + } + }; + linearSmoothScroller.setTargetPosition(position); + startSmoothScroll(linearSmoothScroller); + } catch (Exception e) { + FileLog.e(e); + } + } + }); emojiGridView.setTopGlowOffset(AndroidUtilities.dp(38)); emojiGridView.setBottomGlowOffset(AndroidUtilities.dp(36)); - emojiGridView.setPadding(0, AndroidUtilities.dp(38), 0, AndroidUtilities.dp(44)); + emojiGridView.setPadding(AndroidUtilities.dp(5), AndroidUtilities.dp(36), AndroidUtilities.dp(5), AndroidUtilities.dp(44)); emojiGridView.setGlowColor(getThemedColor(Theme.key_chat_emojiPanelBackground)); emojiGridView.setSelectorDrawableColor(0); emojiGridView.setClipToPadding(false); @@ -1295,150 +1524,78 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific @Override public int getSpanSize(int position) { if (emojiGridView.getAdapter() == emojiSearchAdapter) { - if (position == 0 || position == 1 && emojiSearchAdapter.searchWas && emojiSearchAdapter.result.isEmpty()) { + if ( + position == 0 || + position == 1 && emojiSearchAdapter.searchWas && emojiSearchAdapter.result.isEmpty() + ) { return emojiLayoutManager.getSpanCount(); } } else { - if (needEmojiSearch && position == 0 || emojiAdapter.positionToSection.indexOfKey(position) >= 0) { + if ( + needEmojiSearch && position == 0 || + position == emojiAdapter.trendingRow || + position == emojiAdapter.trendingHeaderRow || + emojiAdapter.positionToSection.indexOfKey(position) >= 0 || + emojiAdapter.positionToUnlock.indexOfKey(position) >= 0 + ) { return emojiLayoutManager.getSpanCount(); } } return 1; } + + @Override + public int getSpanGroupIndex(int adapterPosition, int spanCount) { + return super.getSpanGroupIndex(adapterPosition, spanCount); + } }); emojiGridView.setAdapter(emojiAdapter = new EmojiGridAdapter()); + emojiGridView.addItemDecoration(new EmojiGridSpacing()); emojiSearchAdapter = new EmojiSearchAdapter(); emojiContainer.addView(emojiGridView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + emojiScrollHelper = new RecyclerAnimationScrollHelper(emojiGridView, emojiLayoutManager); + emojiScrollHelper.setAnimationCallback(new RecyclerAnimationScrollHelper.AnimationCallback() { + + @Override + public void onPreAnimation() { + emojiGridView.updateEmojiDrawables(); + emojiSmoothScrolling = true; + } + + @Override + public void onEndAnimation() { + emojiSmoothScrolling = false; + emojiGridView.updateEmojiDrawables(); + } + + @Override + public void ignoreView(View view, boolean ignore) { + if (view instanceof ImageViewEmoji) { + ((ImageViewEmoji)view).ignoring = ignore; + } + } + }); emojiGridView.setOnScrollListener(new TypedScrollListener(Type.EMOJIS) { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - int position = emojiLayoutManager.findFirstVisibleItemPosition(); - if (position != RecyclerView.NO_POSITION) { - int tab = 0; - int count = Emoji.recentEmoji.size() + (needEmojiSearch ? 1 : 0); - if (position >= count) { - for (int a = 0; a < EmojiData.dataColored.length; a++) { - int size = EmojiData.dataColored[a].length + 1; - if (position < count + size) { - tab = a + (Emoji.recentEmoji.isEmpty() ? 0 : 1); - break; - } - count += size; - } - } - emojiTabs.onPageScrolled(tab, 0); - } + updateEmojiTabsPosition(); super.onScrolled(recyclerView, dx, dy); } - }); - emojiGridView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() { + @Override - public void onItemClick(View view, int position) { - if (view instanceof ImageViewEmoji) { - ImageViewEmoji viewEmoji = (ImageViewEmoji) view; - viewEmoji.sendEmoji(null); - performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + emojiSmoothScrolling = false; } - } - }); - emojiGridView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() { - @Override - public boolean onItemClick(View view, int position) { - if (view instanceof ImageViewEmoji) { - ImageViewEmoji viewEmoji = (ImageViewEmoji) view; - String code = (String) viewEmoji.getTag(); - - String color = null; - - String toCheck = code.replace("\uD83C\uDFFB", ""); - if (toCheck != code) { - color = "\uD83C\uDFFB"; - } - if (color == null) { - toCheck = code.replace("\uD83C\uDFFC", ""); - if (toCheck != code) { - color = "\uD83C\uDFFC"; - } - } - if (color == null) { - toCheck = code.replace("\uD83C\uDFFD", ""); - if (toCheck != code) { - color = "\uD83C\uDFFD"; - } - } - if (color == null) { - toCheck = code.replace("\uD83C\uDFFE", ""); - if (toCheck != code) { - color = "\uD83C\uDFFE"; - } - } - if (color == null) { - toCheck = code.replace("\uD83C\uDFFF", ""); - if (toCheck != code) { - color = "\uD83C\uDFFF"; - } - } - - if (EmojiData.emojiColoredMap.contains(toCheck)) { - emojiTouchedView = viewEmoji; - emojiTouchedX = emojiLastX; - emojiTouchedY = emojiLastY; - - if (color == null && !viewEmoji.isRecent) { - color = Emoji.emojiColor.get(toCheck); - } - - if (color != null) { - switch (color) { - case "\uD83C\uDFFB": - pickerView.setSelection(1); - break; - case "\uD83C\uDFFC": - pickerView.setSelection(2); - break; - case "\uD83C\uDFFD": - pickerView.setSelection(3); - break; - case "\uD83C\uDFFE": - pickerView.setSelection(4); - break; - case "\uD83C\uDFFF": - pickerView.setSelection(5); - break; - } - } else { - pickerView.setSelection(0); - } - viewEmoji.getLocationOnScreen(location); - int x = emojiSize * pickerView.getSelection() + AndroidUtilities.dp(4 * pickerView.getSelection() - (AndroidUtilities.isTablet() ? 5 : 1)); - if (location[0] - x < AndroidUtilities.dp(5)) { - x += (location[0] - x) - AndroidUtilities.dp(5); - } else if (location[0] - x + popupWidth > AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)) { - x += (location[0] - x + popupWidth) - (AndroidUtilities.displaySize.x - AndroidUtilities.dp(5)); - } - int xOffset = -x; - int yOffset = viewEmoji.getTop() < 0 ? viewEmoji.getTop() : 0; - - pickerView.setEmoji(toCheck, AndroidUtilities.dp(AndroidUtilities.isTablet() ? 30 : 22) - xOffset + (int) AndroidUtilities.dpf2(0.5f)); - - pickerViewPopup.setFocusable(true); - pickerViewPopup.showAsDropDown(view, xOffset, -view.getMeasuredHeight() - popupHeight + (view.getMeasuredHeight() - emojiSize) / 2 - yOffset); - pager.requestDisallowInterceptTouchEvent(true); - emojiGridView.hideSelector(true); - return true; - } else if (viewEmoji.isRecent) { - RecyclerListView.ViewHolder holder = emojiGridView.findContainingViewHolder(view); - if (holder != null && holder.getAdapterPosition() <= Emoji.recentEmoji.size()) { - delegate.onClearEmojiRecent(); - } - return true; - } - } - return false; + super.onScrollStateChanged(recyclerView, newState); } }); - emojiTabs = new ScrollSlidingTabStrip(context, resourcesProvider) { + emojiTabs = new EmojiTabsStrip(context, resourcesProvider, needAnimatedEmoji, this, fragment != null ? () -> { + if (delegate != null) { + delegate.onEmojiSettingsClick(); + } + } : null) { @Override public void setTranslationY(float translationY) { super.setTranslationY(translationY); @@ -1446,6 +1603,51 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific emojiTabsShadow.setTranslationY(translationY); } } + + @Override + protected boolean onTabClick(int index) { + if (emojiSmoothScrolling) { + return false; + } + Integer position = null; + int offset = 0; + if (index == 0) { + position = needEmojiSearch ? 1 : 0; + } else { + index--; + } + if (position == null) { + if (index < EmojiData.dataColored.length && emojiAdapter.sectionToPosition.indexOfKey(index) >= 0) { + position = emojiAdapter.sectionToPosition.get(index); + } + } + if (position == null) { + ArrayList packs = getEmojipacks(); + int i = index - EmojiData.dataColored.length; + if (packs != null && i >= 0 && i < packs.size()) { + int I = -1; + for (int j = 0; j < emojipacksProcessed.size(); ++j) { + if (emojipacksProcessed.get(j).set.id == packs.get(i).set.id) { + I = j; + break; + } + } + position = emojiAdapter.sectionToPosition.get(I + EmojiData.dataColored.length); +// if (I >= 0 && I < packs.size() && packs.get(I).featured) { + offset = AndroidUtilities.dp(-9); +// } else { +// offset = AndroidUtilities.dp(-2); +// } + } + } + if (position != null) { + emojiGridView.stopScroll(); + updateEmojiTabsPosition(position); + scrollEmojisToPosition(position, offset); + checkEmojiTabY(null, 0); + } + return true; + } }; if (needSearch) { emojiSearchField = new SearchField(context, 1); @@ -1461,40 +1663,28 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific }); } - emojiTabs.setShouldExpand(true); - emojiTabs.setIndicatorHeight(-1); - emojiTabs.setUnderlineHeight(-1); emojiTabs.setBackgroundColor(getThemedColor(Theme.key_chat_emojiPanelBackground)); - emojiContainer.addView(emojiTabs, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38)); - emojiTabs.setDelegate(new ScrollSlidingTabStrip.ScrollSlidingTabStripDelegate() { - @Override - public void onPageSelected(int page) { - if (!Emoji.recentEmoji.isEmpty()) { - if (page == 0) { - emojiLayoutManager.scrollToPositionWithOffset(needEmojiSearch ? 1 : 0, 0); - return; - } else { - page--; - } - } - emojiGridView.stopScroll(); - emojiLayoutManager.scrollToPositionWithOffset(emojiAdapter.sectionToPosition.get(page), 0); - checkEmojiTabY(null, 0); - } - }); + emojiAdapter.processEmoji(); + if (emojiTabs != null) { + emojiTabs.updateEmojiPacks(); + } + emojiContainer.addView(emojiTabs, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36)); emojiTabsShadow = new View(context); emojiTabsShadow.setAlpha(0.0f); emojiTabsShadow.setTag(1); emojiTabsShadow.setBackgroundColor(getThemedColor(Theme.key_chat_emojiPanelShadowLine)); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AndroidUtilities.getShadowHeight(), Gravity.TOP | Gravity.LEFT); - layoutParams.topMargin = AndroidUtilities.dp(38); + layoutParams.topMargin = AndroidUtilities.dp(36); emojiContainer.addView(emojiTabsShadow, layoutParams); if (needStickers) { if (needGif) { gifContainer = new FrameLayout(context); - views.add(gifContainer); + Tab gifTab = new Tab(); + gifTab.type = TAB_GIFS; + gifTab.view = gifContainer; + allTabs.add(gifTab); gifGridView = new RecyclerListView(context) { @@ -1673,7 +1863,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_IMAGE); MediaDataController.getInstance(currentAccount).checkFeaturedStickers(); - stickersGridView = new RecyclerListView(context) { + stickersGridView = new RecyclerListViewWithOverlayDraw(context) { boolean ignoreLayout; @@ -1762,7 +1952,11 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific }); stickersGridView.setPadding(0, AndroidUtilities.dp(4 + 36), 0, AndroidUtilities.dp(44)); stickersGridView.setClipToPadding(false); - views.add(stickersContainer); + + Tab stickersTabHolder = new Tab(); + stickersTabHolder.type = TAB_STICKERS; + stickersTabHolder.view = stickersContainer; + allTabs.add(stickersTabHolder); stickersSearchGridAdapter = new StickersSearchGridAdapter(context); stickersGridView.setAdapter(stickersGridAdapter = new StickersGridAdapter(context)); stickersGridView.setOnTouchListener((v, event) -> ContentPreviewViewer.getInstance().onTouch(event, stickersGridView, EmojiView.this.getMeasuredHeight(), stickersOnItemClickListener, contentPreviewViewerDelegate, resourcesProvider)); @@ -1795,13 +1989,12 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific stickersGridView.setOnItemClickListener(stickersOnItemClickListener); stickersGridView.setGlowColor(getThemedColor(Theme.key_chat_emojiPanelBackground)); stickersContainer.addView(stickersGridView); - scrollHelper = new RecyclerAnimationScrollHelper(stickersGridView, stickersLayoutManager); + stickersScrollHelper = new RecyclerAnimationScrollHelper(stickersGridView, stickersLayoutManager); stickersSearchField = new SearchField(context, 0); stickersContainer.addView(stickersSearchField, new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, searchFieldHeight + AndroidUtilities.getShadowHeight())); stickersTab = new DraggableScrollSlidingTabStrip(context, resourcesProvider) { - @Override protected void updatePosition() { updateStickerTabsPosition(); @@ -1842,6 +2035,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific MediaDataController.getInstance(currentAccount).calcNewHash(MediaDataController.TYPE_IMAGE); TLRPC.TL_messages_reorderStickerSets req = new TLRPC.TL_messages_reorderStickerSets(); req.masks = false; + req.emojis = false; for (int a = hasChatStickers ? 1 : 0; a < stickerSets.size(); a++) { req.order.add(stickerSets.get(a).set.id); } @@ -1868,7 +2062,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific @Override protected void dispatchDraw(Canvas canvas) { float searchProgress = delegate.getProgressToSearchOpened(); - float searchProgressOffset = AndroidUtilities.dp(50) * delegate.getProgressToSearchOpened(); + float searchProgressOffset = AndroidUtilities.dp(50) * searchProgress; if (searchProgressOffset > getMeasuredHeight()) { return; } @@ -1950,6 +2144,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific stickersGridView.setOnScrollListener(new TypedScrollListener(Type.STICKERS)); } + currentTabs.clear(); + currentTabs.addAll(allTabs); + pager = new ViewPager(context) { @Override public boolean onInterceptTouchEvent(MotionEvent ev) { @@ -1968,7 +2165,15 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific startStopVisibleGifs(item == 1); if (item == getCurrentItem()) { if (item == 0) { - emojiGridView.smoothScrollToPosition(needEmojiSearch ? 1 : 0); + tabsMinusDy[Type.EMOJIS] = 0; + ObjectAnimator animator = ObjectAnimator.ofFloat(emojiTabs, TRANSLATION_Y, 0); + animator.setDuration(150); + animator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + animator.start(); + scrollEmojisToPosition(0, 0); + if (emojiTabs != null) { + emojiTabs.select(0); + } } else if (item == 1) { gifGridView.smoothScrollToPosition(1); } else { @@ -1979,11 +2184,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific super.setCurrentItem(item, smoothScroll); } }; - pager.setAdapter(new EmojiPagesAdapter()); - - topShadow = new View(context); - topShadow.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, 0xffe2e5e7)); - addView(topShadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 6)); + pager.setAdapter(emojiPagerAdapter = new EmojiPagesAdapter()); backspaceButton = new ImageView(context) { @Override @@ -2017,6 +2218,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } }); + bulletinContainer = new FrameLayout(context); + if (needSearch) { + addView(bulletinContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 100, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 0, 0, 0, 40 + AndroidUtilities.getShadowHeight() / AndroidUtilities.density)); + } else { + addView(bulletinContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 100, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 0, 0, 0, 0)); + } + bottomTabContainer = new FrameLayout(context) { @Override public boolean onInterceptTouchEvent(MotionEvent ev) { @@ -2032,13 +2240,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific bottomTabContainer.addView(shadowLine, new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.getShadowHeight())); bottomTabContainerBackground = new View(context); - bottomTabContainer.addView(bottomTabContainerBackground, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, AndroidUtilities.dp(44), Gravity.LEFT | Gravity.BOTTOM)); + bottomTabContainer.addView(bottomTabContainerBackground, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, AndroidUtilities.dp(40), Gravity.LEFT | Gravity.BOTTOM)); if (needSearch) { - addView(bottomTabContainer, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, AndroidUtilities.dp(44) + AndroidUtilities.getShadowHeight(), Gravity.LEFT | Gravity.BOTTOM)); - bottomTabContainer.addView(backspaceButton, LayoutHelper.createFrame(52, 44, Gravity.BOTTOM | Gravity.RIGHT)); + addView(bottomTabContainer, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, AndroidUtilities.dp(40) + AndroidUtilities.getShadowHeight(), Gravity.LEFT | Gravity.BOTTOM)); + bottomTabContainer.addView(backspaceButton, LayoutHelper.createFrame(47, 40, Gravity.BOTTOM | Gravity.RIGHT)); if (Build.VERSION.SDK_INT >= 21) { - backspaceButton.setBackground(Theme.createSelectorDrawable(color)); + backspaceButton.setBackground(Theme.createSelectorDrawable(color, Theme.RIPPLE_MASK_CIRCLE_20DP, AndroidUtilities.dp(18))); } stickerSettingsButton = new ImageView(context); @@ -2047,10 +2255,10 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific stickerSettingsButton.setScaleType(ImageView.ScaleType.CENTER); stickerSettingsButton.setFocusable(true); if (Build.VERSION.SDK_INT >= 21) { - stickerSettingsButton.setBackground(Theme.createSelectorDrawable(color)); + stickerSettingsButton.setBackground(Theme.createSelectorDrawable(color, Theme.RIPPLE_MASK_CIRCLE_20DP, AndroidUtilities.dp(18))); } stickerSettingsButton.setContentDescription(LocaleController.getString("Settings", R.string.Settings)); - bottomTabContainer.addView(stickerSettingsButton, LayoutHelper.createFrame(52, 44, Gravity.BOTTOM | Gravity.RIGHT)); + bottomTabContainer.addView(stickerSettingsButton, LayoutHelper.createFrame(47, 40, Gravity.BOTTOM | Gravity.RIGHT)); stickerSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -2066,7 +2274,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific typeTabs.setIndicatorHeight(0); typeTabs.setUnderlineHeight(0); typeTabs.setTabPaddingLeftRight(AndroidUtilities.dp(10)); - bottomTabContainer.addView(typeTabs, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 44, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)); + bottomTabContainer.addView(typeTabs, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 40, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)); typeTabs.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { @@ -2137,9 +2345,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific searchButton.setContentDescription(LocaleController.getString("Search", R.string.Search)); searchButton.setFocusable(true); if (Build.VERSION.SDK_INT >= 21) { - searchButton.setBackground(Theme.createSelectorDrawable(color)); + searchButton.setBackground(Theme.createSelectorDrawable(color, Theme.RIPPLE_MASK_CIRCLE_20DP, AndroidUtilities.dp(18))); } - bottomTabContainer.addView(searchButton, LayoutHelper.createFrame(52, 44, Gravity.BOTTOM | Gravity.LEFT)); + bottomTabContainer.addView(searchButton, LayoutHelper.createFrame(47, 40, Gravity.BOTTOM | Gravity.LEFT)); searchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -2165,14 +2373,14 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } }); } else { - addView(bottomTabContainer, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 40 : 44) + 20, (Build.VERSION.SDK_INT >= 21 ? 40 : 44) + 12, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM, 0, 0, 2, 0)); + addView(bottomTabContainer, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 40 : 44) + 16, (Build.VERSION.SDK_INT >= 21 ? 40 : 44) + 8, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM, 0, 0, 2, 0)); Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), getThemedColor(Theme.key_chat_emojiPanelBackground), getThemedColor(Theme.key_chat_emojiPanelBackground)); if (Build.VERSION.SDK_INT < 21) { Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow).mutate(); shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY)); CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0); - combinedDrawable.setIconSize(AndroidUtilities.dp(40), AndroidUtilities.dp(40)); + combinedDrawable.setIconSize(AndroidUtilities.dp(36), AndroidUtilities.dp(36)); drawable = combinedDrawable; } else { StateListAnimator animator = new StateListAnimator(); @@ -2183,7 +2391,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific @SuppressLint("NewApi") @Override public void getOutline(View view, Outline outline) { - outline.setOval(0, 0, AndroidUtilities.dp(40), AndroidUtilities.dp(40)); + outline.setOval(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); } }); } @@ -2191,7 +2399,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific backspaceButton.setBackground(drawable); backspaceButton.setContentDescription(LocaleController.getString("AccDescrBackspace", R.string.AccDescrBackspace)); backspaceButton.setFocusable(true); - bottomTabContainer.addView(backspaceButton, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 40 : 44), (Build.VERSION.SDK_INT >= 21 ? 40 : 44), Gravity.LEFT | Gravity.TOP, 10, 0, 10, 0)); + bottomTabContainer.addView(backspaceButton, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 40 : 44) - 4, (Build.VERSION.SDK_INT >= 21 ? 40 : 44) - 4, Gravity.LEFT | Gravity.TOP, 10, 0, 10, 0)); shadowLine.setVisibility(GONE); bottomTabContainerBackground.setVisibility(GONE); } @@ -2223,14 +2431,685 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific return false; }); currentPage = MessagesController.getGlobalEmojiSettings().getInt("selected_page", 0); + + Emoji.loadRecentEmoji(); emojiAdapter.notifyDataSetChanged(); - if (typeTabs != null) { - if (views.size() == 1 && typeTabs.getVisibility() == VISIBLE) { - typeTabs.setVisibility(INVISIBLE); - } else if (views.size() != 1 && typeTabs.getVisibility() != VISIBLE) { - typeTabs.setVisibility(VISIBLE); + setAllow(needStickers, needGif, false); + } + + private View animateExpandFromButton; + private int animateExpandFromPosition = -1, animateExpandToPosition = -1; + private long animateExpandStartTime = -1; + class EmojiGridView extends RecyclerListView { + public EmojiGridView(Context context) { + super(context); + } + + private boolean ignoreLayout; + + SparseArray> viewsGroupedByLines = new SparseArray<>(); + ArrayList lineDrawables = new ArrayList<>(); + ArrayList lineDrawablesTmp = new ArrayList<>(); + ArrayList> unusedArrays = new ArrayList<>(); + ArrayList unusedLineDrawables = new ArrayList<>(); + + private AnimatedEmojiSpan[] getAnimatedEmojiSpans() { + AnimatedEmojiSpan[] spans = new AnimatedEmojiSpan[emojiGridView.getChildCount()]; + for (int i = 0; i < emojiGridView.getChildCount(); ++i) { + View child = emojiGridView.getChildAt(i); + if (child instanceof ImageViewEmoji) { + spans[i] = ((ImageViewEmoji) child).getSpan(); + } + } + return spans; + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + ignoreLayout = true; + int width = MeasureSpec.getSize(widthSpec); + int wasSpanCount = emojiLayoutManager.getSpanCount(); + emojiLayoutManager.setSpanCount(Math.max(1, width / AndroidUtilities.dp(AndroidUtilities.isTablet() ? 60 : 45))); + ignoreLayout = false; + super.onMeasure(widthSpec, heightSpec); + if (wasSpanCount != emojiLayoutManager.getSpanCount()) { + emojiAdapter.notifyDataSetChanged(); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (needEmojiSearch && firstEmojiAttach) { + ignoreLayout = true; + emojiLayoutManager.scrollToPositionWithOffset(1, 0); + firstEmojiAttach = false; + ignoreLayout = false; + } + super.onLayout(changed, l, t, r, b); + checkEmojiSearchFieldScroll(true); + updateEmojiDrawables(); + } + + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (emojiTouchedView != null) { + if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (pickerViewPopup != null && pickerViewPopup.isShowing()) { + pickerViewPopup.dismiss(); + + String color = null; + switch (pickerView.getSelection()) { + case 1: + color = "\uD83C\uDFFB"; + break; + case 2: + color = "\uD83C\uDFFC"; + break; + case 3: + color = "\uD83C\uDFFD"; + break; + case 4: + color = "\uD83C\uDFFE"; + break; + case 5: + color = "\uD83C\uDFFF"; + break; + } + String code = (String) emojiTouchedView.getTag(); + if (!emojiTouchedView.isRecent) { + if (color != null) { + Emoji.emojiColor.put(code, color); + code = addColorToCode(code, color); + } else { + Emoji.emojiColor.remove(code); + } + emojiTouchedView.setImageDrawable(Emoji.getEmojiBigDrawable(code), emojiTouchedView.isRecent); + emojiTouchedView.sendEmoji(null); + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {} + + Emoji.saveEmojiColors(); + } else { + code = code.replace("\uD83C\uDFFB", "") + .replace("\uD83C\uDFFC", "") + .replace("\uD83C\uDFFD", "") + .replace("\uD83C\uDFFE", "") + .replace("\uD83C\uDFFF", ""); + + if (color != null) { + emojiTouchedView.sendEmoji(addColorToCode(code, color)); + } else { + emojiTouchedView.sendEmoji(code); + } + } + } + emojiTouchedView = null; + emojiTouchedX = -10000; + emojiTouchedY = -10000; + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + boolean ignore = false; + if (emojiTouchedX != -10000) { + if (Math.abs(emojiTouchedX - event.getX()) > AndroidUtilities.getPixelsInCM(0.2f, true) || Math.abs(emojiTouchedY - event.getY()) > AndroidUtilities.getPixelsInCM(0.2f, false)) { + emojiTouchedX = -10000; + emojiTouchedY = -10000; + } else { + ignore = true; + } + } + if (!ignore) { + getLocationOnScreen(location); + float x = location[0] + event.getX(); + pickerView.getLocationOnScreen(location); + x -= location[0] + AndroidUtilities.dp(3); + int position = (int) (x / (emojiSize + AndroidUtilities.dp(4))); + if (position < 0) { + position = 0; + } else if (position > 5) { + position = 5; + } + if (pickerView.getSelection() != position) { + try { + performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignoreException) {} + } + pickerView.setSelection(position); + } + } + return true; + } + emojiLastX = event.getX(); + emojiLastY = event.getY(); + return super.onTouchEvent(event); + } + + public void updateEmojiDrawables() { + animatedEmojiDrawables = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_KEYBOARD, this, getAnimatedEmojiSpans(), animatedEmojiDrawables); + } + + @Override + public void onScrollStateChanged(int state) { + super.onScrollStateChanged(state); + if (state == SCROLL_STATE_IDLE) { + if (!canScrollVertically(-1) || !canScrollVertically(1)) { + showBottomTab(true, true); + } + if (!canScrollVertically(1)) { + checkTabsY(Type.EMOJIS, AndroidUtilities.dp(36)); + } + } + } + + private int lastChildCount = -1; + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + + if (lastChildCount != getChildCount()) { + updateEmojiDrawables(); + lastChildCount = getChildCount(); + } +// drawDashedOutlines(canvas); + + for (int i = 0; i < viewsGroupedByLines.size(); i++) { + ArrayList arrayList = viewsGroupedByLines.valueAt(i); + arrayList.clear(); + unusedArrays.add(arrayList); + } + viewsGroupedByLines.clear(); + final boolean animatedExpandIn = animateExpandStartTime > 0 && (SystemClock.elapsedRealtime() - animateExpandStartTime) < animateExpandDuration(); + final boolean drawButton = animatedExpandIn && animateExpandFromButton != null && animateExpandFromPosition >= 0; + if (animatedEmojiDrawables != null && emojiGridView != null) { + for (int i = 0; i < emojiGridView.getChildCount(); ++i) { + View child = emojiGridView.getChildAt(i); + if (child instanceof ImageViewEmoji) { + int top = child.getTop() + (int) child.getTranslationY(); + ArrayList arrayList = viewsGroupedByLines.get(top); + if (arrayList == null) { + if (!unusedArrays.isEmpty()) { + arrayList = unusedArrays.remove(unusedArrays.size() - 1); + } else { + arrayList = new ArrayList<>(); + } + viewsGroupedByLines.put(top, arrayList); + } + arrayList.add((ImageViewEmoji) child); + } + if (drawButton && child != null) { + int position = getChildAdapterPosition(child); + if (position == animateExpandFromPosition - 1) { + float t = CubicBezierInterpolator.EASE_OUT.getInterpolation(MathUtils.clamp((SystemClock.elapsedRealtime() - animateExpandStartTime) / 140f, 0, 1)); + if (t < 1) { + canvas.saveLayerAlpha(child.getLeft(), child.getTop(), child.getRight(), child.getBottom(), (int) (255 * (1f - t)), Canvas.ALL_SAVE_FLAG); + canvas.translate(child.getLeft(), child.getTop()); + final float scale = .5f + .5f * (1f - t); + canvas.scale(scale, scale, child.getWidth() / 2f, child.getHeight() / 2f); + animateExpandFromButton.draw(canvas); + canvas.restore(); + } + } + } + + } + } + + lineDrawablesTmp.clear(); + lineDrawablesTmp.addAll(lineDrawables); + lineDrawables.clear(); + + long time = System.currentTimeMillis(); + for (int i = 0; i < viewsGroupedByLines.size(); i++) { + ArrayList arrayList = viewsGroupedByLines.valueAt(i); + ImageViewEmoji firstView = arrayList.get(0); + int position = firstView.position; + DrawingInBackgroundLine drawable = null; + for (int k = 0; k < lineDrawablesTmp.size(); k++) { + if (lineDrawablesTmp.get(k).position == position) { + drawable = lineDrawablesTmp.get(k); + lineDrawablesTmp.remove(k); + break; + } + } + if (drawable == null) { + if (!unusedLineDrawables.isEmpty()) { + drawable = unusedLineDrawables.remove(unusedLineDrawables.size() - 1); + } else { + drawable = new DrawingInBackgroundLine(); + } + drawable.position = position; + drawable.onAttachToWindow(); + } + lineDrawables.add(drawable); + drawable.imageViewEmojis = arrayList; + canvas.save(); + canvas.translate(firstView.getLeft(), firstView.getY() + firstView.getPaddingTop()); + drawable.startOffset = firstView.getLeft(); + int w = getMeasuredWidth() - firstView.getLeft() * 2; + int h = firstView.getMeasuredHeight() - firstView.getPaddingBottom(); + if (w > 0 && h > 0) { + drawable.draw(canvas, time, w, h, 1f); + } + canvas.restore(); + } + + for (int i = 0; i < lineDrawablesTmp.size(); i++) { + if (unusedLineDrawables.size() < 3) { + unusedLineDrawables.add(lineDrawablesTmp.get(i)); + lineDrawablesTmp.get(i).imageViewEmojis = null; + lineDrawablesTmp.get(i).reset(); + } else { + lineDrawablesTmp.get(i).onDetachFromWindow(); + } + } + lineDrawablesTmp.clear(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + updateEmojiDrawables(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + AnimatedEmojiSpan.release(this, animatedEmojiDrawables); + for (int i = 0; i < lineDrawables.size(); i++) { + lineDrawables.get(i).onDetachFromWindow(); + } + for (int i = 0; i < unusedLineDrawables.size(); i++) { + unusedLineDrawables.get(i).onDetachFromWindow(); + } + unusedLineDrawables.addAll(lineDrawables); + lineDrawables.clear(); + } + + private HashMap touches; + class TouchDownInfo { + float x, y; + long time; + View view; + } + public void clearTouchesFor(View view) { + if (touches != null) { + for (Map.Entry e : touches.entrySet()) { + if (e != null && e.getValue().view == view) { + TouchDownInfo touch = touches.remove(e.getKey()); + if (touch != null) { + if (touch.view != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && touch.view.getBackground() instanceof RippleDrawable) { + touch.view.getBackground().setState(new int[]{}); + } + if (touch.view != null) { + touch.view.setPressed(false); + } + } + } + } + } + } + + public long animateExpandDuration() { + return animateExpandAppearDuration() + animateExpandCrossfadeDuration() + 150; + } + + public long animateExpandAppearDuration() { + int count = animateExpandToPosition - animateExpandFromPosition; + return Math.max(600, Math.min(55, count) * 40L); + } + + public long animateExpandCrossfadeDuration() { + int count = animateExpandToPosition - animateExpandFromPosition; + return Math.max(400, Math.min(45, count) * 35L); + } + + class DrawingInBackgroundLine extends DrawingInBackgroundThreadDrawable { + public int position; + public int startOffset; + ArrayList imageViewEmojis; + ArrayList drawInBackgroundViews = new ArrayList<>(); + + @Override + public void draw(Canvas canvas, long time, int w, int h, float alpha) { + if (imageViewEmojis == null) { + return; + } + boolean drawInUi = imageViewEmojis.size() <= 4 || SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW; + if (!drawInUi) { + boolean animatedExpandIn = animateExpandStartTime > 0 && (SystemClock.elapsedRealtime() - animateExpandStartTime) < animateExpandDuration(); + for (int i = 0; i < imageViewEmojis.size(); i++) { + ImageViewEmoji img = imageViewEmojis.get(i); + if (img.pressedProgress != 0 || img.backAnimator != null || (img.position > animateExpandFromPosition && img.position < animateExpandToPosition && animatedExpandIn)) { + drawInUi = true; + break; + } + } + } + if (drawInUi) { + prepareDraw(System.currentTimeMillis()); + drawInUiThread(canvas); + reset(); + } else { + super.draw(canvas, time, w, h, alpha); + } + } + + @Override + public void prepareDraw(long time) { + drawInBackgroundViews.clear(); + for (int i = 0; i < imageViewEmojis.size(); i++) { + ImageViewEmoji imageView = imageViewEmojis.get(i); + AnimatedEmojiSpan span = imageView.getSpan(); + if (span == null) { + continue; + } + AnimatedEmojiDrawable drawable = animatedEmojiDrawables.get(imageView.span.getDocumentId()); + if (drawable == null || drawable.getImageReceiver() == null) { + continue; + } + + drawable.update(time); + imageView.backgroundThreadDrawHolder = drawable.getImageReceiver().setDrawInBackgroundThread(imageView.backgroundThreadDrawHolder); + imageView.backgroundThreadDrawHolder.time = time; + drawable.setAlpha(255); + AndroidUtilities.rectTmp2.set(imageView.getLeft() + imageView.getPaddingLeft() - startOffset, 0, imageView.getRight() - imageView.getPaddingRight() - startOffset, imageView.getMeasuredHeight() - imageView.getPaddingTop() - imageView.getPaddingBottom()); + imageView.backgroundThreadDrawHolder.setBounds(AndroidUtilities.rectTmp2); + imageView.drawable = drawable; + imageView.imageReceiver = drawable.getImageReceiver(); + drawInBackgroundViews.add(imageView); + } + } + + @Override + public void drawInBackground(Canvas canvas) { + for (int i = 0; i < drawInBackgroundViews.size(); i++) { + ImageViewEmoji imageView = drawInBackgroundViews.get(i); + if (imageView.drawable != null) { + imageView.drawable.draw(canvas, imageView.backgroundThreadDrawHolder); + } + } + } + + private OvershootInterpolator appearScaleInterpolator = new OvershootInterpolator(3f); + + @Override + protected void drawInUiThread(Canvas canvas) { + if (imageViewEmojis != null) { + canvas.save(); + canvas.translate(-startOffset, 0); + for (int i = 0; i < imageViewEmojis.size(); i++) { + ImageViewEmoji imageView = imageViewEmojis.get(i); + AnimatedEmojiSpan span = imageView.getSpan(); + if (span == null) { + continue; + } + AnimatedEmojiDrawable drawable = animatedEmojiDrawables.get(imageView.span.getDocumentId()); + if (drawable == null) { + continue; + } + + AndroidUtilities.rectTmp2.set(imageView.getLeft() + imageView.getPaddingLeft(), 0, imageView.getRight() - imageView.getPaddingRight(), imageView.getMeasuredHeight() - imageView.getPaddingBottom() - imageView.getPaddingTop()); + float alpha = 1f, scale = 1; + if (imageView.pressedProgress != 0) { + scale *= 0.8f + 0.2f * (1f - imageView.pressedProgress); + } + boolean animatedExpandIn = animateExpandStartTime > 0 && (SystemClock.elapsedRealtime() - animateExpandStartTime) < animateExpandDuration(); + if (animatedExpandIn && animateExpandFromPosition >= 0 && animateExpandToPosition >= 0 && animateExpandStartTime > 0) { + int position = getChildAdapterPosition(imageView); + final int pos = position - animateExpandFromPosition; + final int count = animateExpandToPosition - animateExpandFromPosition; + if (pos >= 0 && pos < count) { + final float appearDuration = animateExpandAppearDuration(); + final float crossfadeDuration = animateExpandCrossfadeDuration(); + final float CrossfadeT = MathUtils.clamp((SystemClock.elapsedRealtime() - animateExpandStartTime - (appearDuration * .45f)) / crossfadeDuration, 0, 1); + final float AppearT = CubicBezierInterpolator.EASE_OUT.getInterpolation(MathUtils.clamp((SystemClock.elapsedRealtime() - animateExpandStartTime) / appearDuration, 0, 1)); + final float crossfadeT = AndroidUtilities.cascade(CrossfadeT, pos, count, count / 5f); + final float alphaT = AndroidUtilities.cascade(AppearT, pos, count, count / 4f); + final float scaleT = AndroidUtilities.cascade(AppearT, pos + (count / 4), count + (count / 4), count / 4f); + scale *= .5f + appearScaleInterpolator.getInterpolation(scaleT) * .5f; + alpha = alphaT; + } + } + drawable.setAlpha((int) (255 * alpha)); + drawable.setBounds(AndroidUtilities.rectTmp2); + if (scale != 1) { + canvas.save(); + canvas.scale(scale, scale, AndroidUtilities.rectTmp2.centerX(), AndroidUtilities.rectTmp2.centerY()); + drawable.draw(canvas); + canvas.restore(); + } else { + drawable.draw(canvas); + } + } + canvas.restore(); + } + } + + @Override + public void onFrameReady() { + super.onFrameReady(); + for (int i = 0; i < drawInBackgroundViews.size(); i++) { + ImageViewEmoji imageView = drawInBackgroundViews.get(i); + if (imageView.backgroundThreadDrawHolder != null) { + imageView.backgroundThreadDrawHolder.release(); + } + } + emojiGridView.invalidate(); + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + final boolean down = ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN || ev.getActionMasked() == MotionEvent.ACTION_DOWN; + final boolean up = ev.getActionMasked() == MotionEvent.ACTION_POINTER_UP || ev.getActionMasked() == MotionEvent.ACTION_UP; + final boolean cancel = ev.getActionMasked() == MotionEvent.ACTION_CANCEL; + if (down || up || cancel) { + int index = ev.getActionIndex(); + int id = ev.getPointerId(index); + if (touches == null) { + touches = new HashMap<>(); + } + + float x = ev.getX(index), y = ev.getY(index); + View touchChild = findChildViewUnder(x, y); + + TouchDownInfo touch; + if (down) { + if (touchChild != null) { + touch = new TouchDownInfo(); + touch.x = x; + touch.y = y; + touch.time = SystemClock.elapsedRealtime(); + touch.view = touchChild; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && touchChild.getBackground() instanceof RippleDrawable) { + touchChild.getBackground().setState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}); + } + touch.view.setPressed(true); + touches.put(id, touch); + stopScroll(); + } + } else { + touch = touches.remove(id); + if ( + touchChild != null && touch != null && + Math.sqrt(Math.pow(x - touch.x, 2) + Math.pow(y - touch.y, 2)) < AndroidUtilities.touchSlop * 3 && + (SystemClock.elapsedRealtime() - touch.time) <= ViewConfiguration.getTapTimeout() * 1.2f && + !cancel && + (!pickerViewPopup.isShowing() || SystemClock.elapsedRealtime() - touch.time < ViewConfiguration.getLongPressTimeout()) + ) { + View view = touch.view; + if (view instanceof ImageViewEmoji) { + ImageViewEmoji viewEmoji = (ImageViewEmoji) view; + viewEmoji.sendEmoji(null); + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {} + } else if (view instanceof EmojiPackExpand) { + EmojiPackExpand button = (EmojiPackExpand) view; + emojiAdapter.expand(getChildAdapterPosition(button), button); + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {} + } else if (view != null) { + view.callOnClick(); + } + } + if (touch != null && touch.view != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && touch.view.getBackground() instanceof RippleDrawable) { + touch.view.getBackground().setState(new int[]{}); + } + if (touch != null && touch.view != null) { + touch.view.setPressed(false); + } + } + } + return super.dispatchTouchEvent(ev) || !cancel && !touches.isEmpty(); + } + + private Path lockPath; + private SparseIntArray headerWidthsCache = new SparseIntArray(); + private AnimatedFloat premiumT = new AnimatedFloat(this, 350, CubicBezierInterpolator.EASE_OUT_QUINT); + + public void drawDashedOutlines(Canvas canvas) { + if (emojiAdapter == null || emojiAdapter.packStartPosition == null) { + return; + } + + final float r = AndroidUtilities.dp(20), p = AndroidUtilities.dp(5), sz = AndroidUtilities.dp(11); + final float itemSize = (getMeasuredWidth() - getPaddingLeft() - getPaddingRight()) / (float) emojiLayoutManager.getSpanCount(); + for (int i = 0; i < emojiAdapter.packStartPosition.size(); ++i) { + EmojiPack pack = i < emojipacksProcessed.size() ? emojipacksProcessed.get(i) : null; + if (pack == null || !((pack.installed || installedEmojiSets.contains(pack.set.id)) && !pack.featured && !pack.free)) { + continue; + } + int start = emojiAdapter.packStartPosition.get(i); + int end = i + 1 >= emojiAdapter.packStartPosition.size() ? emojiAdapter.getItemCount() : emojiAdapter.packStartPosition.get(i + 1) - 1; + int end2 = animateExpandFromPosition >= 0 && animateExpandFromPosition > start && animateExpandFromPosition < end ? animateExpandFromPosition - 1 : -1; + int childPosition = -1; + int lastPosition1 = -1, lastPosition2 = -1; + View child = null, lastView1 = null, lastView2 = null; + float clipTop = getMeasuredHeight(), clipBottom = 0; + for (int j = 0; j < getChildCount(); ++j) { + View c = getChildAt(j); + int position = getChildAdapterPosition(c); + if (position < 0) { + if (c instanceof ImageViewEmoji) { + position = ((ImageViewEmoji) c).position; + } else if (c instanceof StickerSetNameCell) { + position = ((StickerSetNameCell) c).position; + } else if (c instanceof EmojiPackButton) { + position = ((EmojiPackButton) c).position; + } else { + position = getChildAdapterPosition(c); + } + } + if (position >= start && position <= end) { + if (child == null) { + child = c; + childPosition = position; + } + if (j > lastPosition1) { + lastPosition1 = j; + lastView1 = c; + } + if (j > lastPosition2 && position <= end2) { + lastPosition2 = j; + lastView2 = c; + } + clipTop = Math.min(clipTop, c.getTop() + c.getTranslationY()); + clipBottom = Math.max(clipBottom, c.getBottom() + c.getTranslationY()); + } + } + if (child == null) { + continue; + } + clipBottom += AndroidUtilities.dp(6); + + float lockT = premiumT.set(UserConfig.getInstance(currentAccount).isPremium() ? 0f : 1f); // CubicBezierInterpolator.EASE_OUT_QUINT.getInterpolation(Math.min(now - appearTime, 550) / 550f); + + int positionInGroup = childPosition - start; + float top; + if (positionInGroup == 0) { + top = child.getTop() + child.getTranslationY() + AndroidUtilities.dp(25); + } else { + top = child.getTop() + child.getTranslationY() - AndroidUtilities.dp(32 - 25) + - (positionInGroup - 1) / Math.max(1, emojiLayoutManager.getSpanCount()) * itemSize - AndroidUtilities.dp(32-25); + } + float bottom; + if (lastView2 != null && lastView1 != null) { + float t = MathUtils.clamp((SystemClock.elapsedRealtime() - animateExpandStartTime) / 220f, 0, 1); + t = CubicBezierInterpolator.EASE_OUT.getInterpolation(t); + bottom = AndroidUtilities.lerp(lastView2.getBottom() + lastView2.getTranslationY(), lastView1.getBottom() + lastView1.getTranslationY(), t); + } else if (lastView1 != null) { + bottom = lastView1.getBottom() + lastView1.getTranslationY(); + } else { + bottom = getMeasuredHeight() + AndroidUtilities.dp(6); + } + + canvas.save(); + canvas.clipRect(0, Math.min(clipTop, clipBottom), getMeasuredWidth(), Math.max(clipTop, clipBottom)); + if (lockT < 1) { + canvas.scale(1.1f - .1f * lockT, 1.1f - .1f * lockT, getMeasuredWidth() / 2f, (bottom + top) / 2f); + } + + if (emojiLockPaint == null) { + emojiLockPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + emojiLockPaint.setColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); + emojiLockPaint.setAlpha((int) (emojiLockPaint.getAlpha() * .5f)); + emojiLockPaint.setStrokeWidth(AndroidUtilities.dp(2)); + emojiLockPaint.setStyle(Paint.Style.STROKE); + emojiLockPaint.setStrokeCap(Paint.Cap.ROUND); + emojiLockPaint.setPathEffect(new DashPathEffect(new float[]{AndroidUtilities.dp(5.5f), AndroidUtilities.dp(7f)}, .5f)); + } + int wasAlpha = emojiLockPaint.getAlpha(); + emojiLockPaint.setAlpha((int) (wasAlpha * lockT)); + + if (lockPath == null) { + lockPath = new Path(); + } else { + lockPath.rewind(); + } + + if (child instanceof EmojiPackHeader) { + final float left = getPaddingLeft() + ((EmojiPackHeader) child).headerView.getRight() + ((EmojiPackHeader) child).headerView.getTranslationX(); + final float right = getPaddingLeft() + ((EmojiPackHeader) child).buttonsView.getLeft() + ((EmojiPackHeader) child).premiumButtonView.getLeft(); + lockPath.moveTo(Math.min(left, right) + AndroidUtilities.dp(8), top); + lockPath.lineTo(Math.max(left, right) - AndroidUtilities.dp(8), top); + canvas.drawPath(lockPath, emojiLockPaint); + lockPath.reset(); + } + + AndroidUtilities.rectTmp.set(p, top, p + r, top + r); + lockPath.arcTo(AndroidUtilities.rectTmp, 270 - 40, -90 + 40); + lockPath.moveTo(AndroidUtilities.rectTmp.left, AndroidUtilities.rectTmp.centerY()); + + AndroidUtilities.rectTmp.set(p, bottom - r, p + r, bottom); + lockPath.arcTo(AndroidUtilities.rectTmp, 180, -90); + lockPath.moveTo(AndroidUtilities.rectTmp.centerX(), AndroidUtilities.rectTmp.bottom); + + AndroidUtilities.rectTmp.set(getMeasuredWidth() - p - r, bottom - r, getMeasuredWidth() - p, bottom); + lockPath.arcTo(AndroidUtilities.rectTmp, 90, -90); + float x = AndroidUtilities.rectTmp.right, y = AndroidUtilities.rectTmp.centerY(); + + AndroidUtilities.rectTmp.set(getMeasuredWidth() - p - r, top, getMeasuredWidth() - p, top + r); + lockPath.moveTo(AndroidUtilities.rectTmp.right, AndroidUtilities.rectTmp.centerY()); + lockPath.lineTo(x, y); + lockPath.moveTo(AndroidUtilities.rectTmp.right, AndroidUtilities.rectTmp.centerY()); + lockPath.arcTo(AndroidUtilities.rectTmp, 0, -45); + + canvas.drawPath(lockPath, emojiLockPaint); + emojiLockPaint.setAlpha(wasAlpha); + + canvas.restore(); } } } @@ -2245,6 +3124,45 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific chooseStickerActionTracker.checkVisibility(); } + private void updateEmojiTabsPosition() { + updateEmojiTabsPosition(emojiLayoutManager.findFirstCompletelyVisibleItemPosition()); + } + private void updateEmojiTabsPosition(int position) { + if (position != RecyclerView.NO_POSITION) { + int tab = 0; + int count = getRecentEmoji().size() + (needEmojiSearch ? 1 : 0); + if (position >= count) { + tab = -1; + for (int a = 0; a < EmojiData.dataColored.length; a++) { + int size = EmojiData.dataColored[a].length + 1; + if (position < count + size) { + tab = a + 1; + break; + } + count += size; + } + if (tab < 0) { + ArrayList packs = getEmojipacks(); + for (int b = emojiAdapter.packStartPosition.size() - 1; b >= 0; --b) { + if (emojiAdapter.packStartPosition.get(b) <= position) { + EmojiPack pack = emojipacksProcessed.get(b); + for (int i = 0; i < packs.size(); ++i) { + if (packs.get(i).set.id == pack.set.id && !(pack.featured && (pack.installed || installedEmojiSets.contains(pack.set.id)))) { + tab = 1 + EmojiData.dataColored.length + i; + break; + } + } + break; + } + } + } + } + if (!emojiSmoothScrolling && tab >= 0) { + emojiTabs.select(tab); + } + } + } + private void checkGridVisibility(int position, float positionOffset) { if (stickersContainer == null || gifContainer == null) { return; @@ -2254,19 +3172,560 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific gifGridView.setVisibility(positionOffset == 0 ? View.GONE : View.VISIBLE); gifTabs.setVisibility(positionOffset == 0 ? View.GONE : View.VISIBLE); stickersGridView.setVisibility(View.GONE); - stickersTab.setVisibility(View.GONE); + stickersTabContainer.setVisibility(View.GONE); } else if (position == 1) { emojiGridView.setVisibility(View.GONE); gifGridView.setVisibility(View.VISIBLE); gifTabs.setVisibility(View.VISIBLE); stickersGridView.setVisibility(positionOffset == 0 ? View.GONE : View.VISIBLE); - stickersTab.setVisibility(positionOffset == 0 ? View.GONE : View.VISIBLE); + stickersTabContainer.setVisibility(positionOffset == 0 ? View.GONE : View.VISIBLE); } else if (position == 2) { emojiGridView.setVisibility(View.GONE); gifGridView.setVisibility(View.GONE); gifTabs.setVisibility(View.GONE); stickersGridView.setVisibility(View.VISIBLE); - stickersTab.setVisibility(View.VISIBLE); + stickersTabContainer.setVisibility(View.VISIBLE); + } + } + + private void openPremiumAnimatedEmojiFeature() { + if (delegate != null) { + delegate.onAnimatedEmojiUnlockClick(); + } + } + + private class EmojiPackButton extends FrameLayout { + int position; + + FrameLayout addButtonView; + AnimatedTextView addButtonTextView; + PremiumButtonView premiumButtonView; + + public EmojiPackButton(Context context) { + super(context); + + addButtonTextView = new AnimatedTextView(getContext()); + addButtonTextView.setAnimationProperties(.3f, 0, 250, CubicBezierInterpolator.EASE_OUT_QUINT); + addButtonTextView.setTextSize(AndroidUtilities.dp(14)); + addButtonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addButtonTextView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText)); + addButtonTextView.setGravity(Gravity.CENTER); + + addButtonView = new FrameLayout(getContext()); + addButtonView.setBackground(Theme.AdaptiveRipple.filledRect(getThemedColor(Theme.key_featuredStickers_addButton), 8)); + addButtonView.addView(addButtonTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + addView(addButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + + premiumButtonView = new PremiumButtonView(getContext(), false); + premiumButtonView.setIcon(R.raw.unlock_icon); + addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + } + + private String lastTitle; + public void set(String title, boolean unlock, boolean installed, OnClickListener onClickListener) { + lastTitle = title; + if (unlock) { + addButtonView.setVisibility(View.GONE); + premiumButtonView.setVisibility(View.VISIBLE); + premiumButtonView.setButton(LocaleController.formatString("UnlockPremiumEmojiPack", R.string.UnlockPremiumEmojiPack, title), onClickListener); + } else { + premiumButtonView.setVisibility(View.GONE); + addButtonView.setVisibility(View.VISIBLE); + addButtonView.setOnClickListener(onClickListener); + } + + updateInstall(installed, false); + updateLock(unlock, false); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setPadding(AndroidUtilities.dp(6), AndroidUtilities.dp(11), AndroidUtilities.dp(6), AndroidUtilities.dp(11)); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(44) + getPaddingTop() + getPaddingBottom(), MeasureSpec.EXACTLY)); + } + + private ValueAnimator installFadeAway; + public void updateInstall(boolean installed, boolean animated) { + CharSequence text = installed ? + LocaleController.getString("Added", R.string.Added) : + LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, lastTitle); + addButtonTextView.setText(text, animated); + if (installFadeAway != null) { + installFadeAway.cancel(); + installFadeAway = null; + } + addButtonView.setEnabled(!installed); + if (animated) { + installFadeAway = ValueAnimator.ofFloat(addButtonView.getAlpha(), installed ? .6f : 1f); + addButtonView.setAlpha(addButtonView.getAlpha()); + installFadeAway.addUpdateListener(anm -> { + addButtonView.setAlpha((float) anm.getAnimatedValue()); + }); + installFadeAway.setDuration(450); + installFadeAway.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + installFadeAway.start(); + } else { + addButtonView.setAlpha(installed ? .6f : 1f); + } + } + + private float lockT; + private Boolean lockShow; + private ValueAnimator lockAnimator; + private void updateLock(boolean show, boolean animated) { + if (lockAnimator != null) { + lockAnimator.cancel(); + lockAnimator = null; + } + + if (lockShow != null && lockShow == show) { + return; + } + lockShow = show; + + if (animated) { + premiumButtonView.setVisibility(View.VISIBLE); + lockAnimator = ValueAnimator.ofFloat(lockT, show ? 1f : 0f); + lockAnimator.addUpdateListener(anm -> { + lockT = (float) anm.getAnimatedValue(); + addButtonView.setAlpha(1f - lockT); + premiumButtonView.setAlpha(lockT); + }); + lockAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (!show) { + premiumButtonView.setVisibility(View.GONE); + } + } + }); + lockAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + lockAnimator.setDuration(350); + lockAnimator.start(); + } else { + lockT = lockShow ? 1 : 0; + addButtonView.setAlpha(1f - lockT); + premiumButtonView.setAlpha(lockT); + premiumButtonView.setScaleX(lockT); + premiumButtonView.setScaleY(lockT); + premiumButtonView.setVisibility(lockShow ? View.VISIBLE : View.GONE); + } + } + } + + private class EmojiPackHeader extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { + + RLottieImageView lockView; + TextView headerView; + + FrameLayout buttonsView; + TextView addButtonView; + TextView removeButtonView; + PremiumButtonView premiumButtonView; + + private TLRPC.InputStickerSet toInstall, toUninstall; + + private EmojiPack pack; + boolean divider; + + public EmojiPackHeader(Context context) { + super(context); + + lockView = new RLottieImageView(context); + lockView.setAnimation(R.raw.unlock_icon, 24, 24); + lockView.setColorFilter(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); + addView(lockView, LayoutHelper.createFrameRelatively(20, 20, Gravity.START, 10, 15, 0, 0)); + + headerView = new TextView(context); + headerView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); + headerView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + headerView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + headerView.setOnClickListener(e -> { + if (this.pack != null && this.pack.set != null) { + openEmojiPackAlert(this.pack.set); + } + }); + addView(headerView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.START, 15, 15, 52, 0)); + + buttonsView = new FrameLayout(context); + buttonsView.setPadding(AndroidUtilities.dp(11), AndroidUtilities.dp(11), AndroidUtilities.dp(11), 0); + buttonsView.setClipToPadding(false); + buttonsView.setOnClickListener(e -> { + if (addButtonView != null && addButtonView.getVisibility() == View.VISIBLE && addButtonView.isEnabled()) { + addButtonView.performClick(); + } else if (removeButtonView != null && removeButtonView.getVisibility() == View.VISIBLE && removeButtonView.isEnabled()) { + removeButtonView.performClick(); + } else if (premiumButtonView != null && premiumButtonView.getVisibility() == View.VISIBLE && premiumButtonView.isEnabled()) { + premiumButtonView.performClick(); + } + }); + addView(buttonsView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.END | Gravity.FILL_VERTICAL)); + + addButtonView = new TextView(context); + addButtonView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + addButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addButtonView.setText(LocaleController.getString("Add", R.string.Add)); + addButtonView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText)); + addButtonView.setBackground(Theme.AdaptiveRipple.createRect(getThemedColor(Theme.key_featuredStickers_addButton), getThemedColor(Theme.key_featuredStickers_addButtonPressed), 16)); + addButtonView.setPadding(AndroidUtilities.dp(14), 0, AndroidUtilities.dp(14), 0); + addButtonView.setGravity(Gravity.CENTER); + addButtonView.setOnClickListener(e -> { + if (pack == null || pack.set == null) { + return; + } + pack.installed = true; + if (!installedEmojiSets.contains(pack.set.id)) { + installedEmojiSets.add(pack.set.id); + } + updateState(true); + Integer position = null; + View expandButton = null; + for (int i = 0; i < emojiGridView.getChildCount(); ++i) { + if (emojiGridView.getChildAt(i) instanceof EmojiPackExpand) { + View child = emojiGridView.getChildAt(i); + int j = emojiGridView.getChildAdapterPosition(child); + if (j >= 0) { + int section = emojiAdapter.positionToExpand.get(j); + if (section >= 0 && section < emojipacksProcessed.size() && + emojipacksProcessed.get(section) != null && pack != null && + emojipacksProcessed.get(section).set.id == pack.set.id + ) { + position = j; + expandButton = child; + break; + } + } + } + } + if (position != null) { + emojiAdapter.expand(position, expandButton); + } + if (toInstall != null) { + return; + } + TLRPC.TL_inputStickerSetID inputStickerSetID = new TLRPC.TL_inputStickerSetID(); + inputStickerSetID.id = pack.set.id; + inputStickerSetID.access_hash = pack.set.access_hash; + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetID, true); + if (stickerSet == null || stickerSet.set == null) { + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); + MediaDataController.getInstance(currentAccount).getStickerSet(toInstall = inputStickerSetID, false); + } else { + install(stickerSet); + } + }); + buttonsView.addView(addButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 26, Gravity.END | Gravity.TOP)); + + removeButtonView = new TextView(context); + removeButtonView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + removeButtonView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + removeButtonView.setText(LocaleController.getString("StickersRemove", R.string.StickersRemove)); + removeButtonView.setTextColor(getThemedColor(Theme.key_featuredStickers_removeButtonText)); + removeButtonView.setBackground(Theme.AdaptiveRipple.createRect(0, getThemedColor(Theme.key_featuredStickers_addButton) & 0x1affffff, 16)); + removeButtonView.setPadding(AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12), 0); + removeButtonView.setGravity(Gravity.CENTER); + removeButtonView.setTranslationX(AndroidUtilities.dp(4)); + removeButtonView.setOnClickListener(e -> { + if (pack == null || pack.set == null) { + return; + } + pack.installed = false; + installedEmojiSets.remove(pack.set.id); + updateState(true); + if (emojiTabs != null) { + emojiTabs.updateEmojiPacks(); + } + updateEmojiTabsPosition(); + if (toUninstall != null) { + return; + } + TLRPC.TL_inputStickerSetID inputStickerSetID = new TLRPC.TL_inputStickerSetID(); + inputStickerSetID.id = pack.set.id; + inputStickerSetID.access_hash = pack.set.access_hash; + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetID, true); + if (stickerSet == null || stickerSet.set == null) { + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); + MediaDataController.getInstance(currentAccount).getStickerSet(toUninstall = inputStickerSetID, false); + } else { + uninstall(stickerSet); + } + }); + buttonsView.addView(removeButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 26, Gravity.END | Gravity.TOP)); + + premiumButtonView = new PremiumButtonView(context, AndroidUtilities.dp(16), false); + premiumButtonView.setIcon(R.raw.unlock_icon); + premiumButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> openPremiumAnimatedEmojiFeature()); + + try { + MarginLayoutParams iconLayout = (MarginLayoutParams) premiumButtonView.getIconView().getLayoutParams(); + iconLayout.leftMargin = AndroidUtilities.dp(1); + iconLayout.topMargin = AndroidUtilities.dp(1); + iconLayout.width = iconLayout.height = AndroidUtilities.dp(20); + MarginLayoutParams layout = (MarginLayoutParams) premiumButtonView.getTextView().getLayoutParams(); + layout.leftMargin = AndroidUtilities.dp(5); + layout.topMargin = AndroidUtilities.dp(-.5f); + premiumButtonView.getChildAt(0).setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); + } catch (Exception ev) {} + + buttonsView.addView(premiumButtonView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, 26, Gravity.END | Gravity.TOP)); + + setWillNotDraw(false); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + ((MarginLayoutParams) headerView.getLayoutParams()).topMargin = AndroidUtilities.dp(currentButtonState == BUTTON_STATE_EMPTY ? 10 : 15); + super.onMeasure( + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(currentButtonState == BUTTON_STATE_EMPTY ? 32 : 42), MeasureSpec.EXACTLY) + ); + } + + public void setStickerSet(EmojiPack pack, boolean divider) { + if (pack == null) { + return; + } + + this.pack = pack; + this.divider = divider; + headerView.setText(pack.set.title); + + if (pack.installed && !pack.set.official) { + premiumButtonView.setButton(LocaleController.getString("Restore", R.string.Restore), e -> openPremiumAnimatedEmojiFeature()); + } else { + premiumButtonView.setButton(LocaleController.getString("Unlock", R.string.Unlock), e -> openPremiumAnimatedEmojiFeature()); + } + + updateState(false); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.groupStickersDidLoad) { + if (toInstall != null) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSetById(toInstall.id); + if (stickerSet != null && stickerSet.set != null) { + install(stickerSet); + toInstall = null; + } + } + if (toUninstall != null) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSetById(toUninstall.id); + if (stickerSet != null && stickerSet.set != null) { + uninstall(stickerSet); + toUninstall = null; + } + } + } + } + + private BaseFragment getFragment() { + if (fragment != null) { + return fragment; + } + return new BaseFragment() { + @Override + public int getCurrentAccount() { + return EmojiView.this.currentAccount; + } + + @Override + public View getFragmentView() { + return EmojiView.this.bulletinContainer; + } + + @Override + public FrameLayout getLayoutContainer() { + return EmojiView.this.bulletinContainer; + } + + @Override + public Theme.ResourcesProvider getResourceProvider() { + return EmojiView.this.resourcesProvider; + } + }; + } + + private void install(TLRPC.TL_messages_stickerSet set) { + EmojiPacksAlert.installSet(getFragment(), set, true, null, () -> { + pack.installed = true; + updateState(true); + }); + } + + private void uninstall(TLRPC.TL_messages_stickerSet set) { + EmojiPacksAlert.uninstallSet(getFragment(), set, true, () -> { + pack.installed = true; + if (!installedEmojiSets.contains(set.set.id)) { + installedEmojiSets.add(set.set.id); + } + updateState(true); + }); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.groupStickersDidLoad); + } + + @Override + protected void onDraw(Canvas canvas) { + if (divider) { + canvas.drawRect(0, 0, getMeasuredWidth(), 1, Theme.dividerPaint); + } + super.onDraw(canvas); + } + + public void updateState(boolean animated) { + if (pack == null) { + return; + } + int state = BUTTON_STATE_EMPTY; + boolean installed = pack.installed || installedEmojiSets.contains(pack.set.id); + if (!pack.free && !UserConfig.getInstance(currentAccount).isPremium()) { + state = BUTTON_STATE_LOCKED; + } else if (pack.featured) { + if (installed) { + state = BUTTON_STATE_REMOVE; + } else { + state = BUTTON_STATE_ADD; + } + } + updateState(state, animated); + } + + public static final int BUTTON_STATE_EMPTY = 0; + public static final int BUTTON_STATE_LOCKED = 1; + public static final int BUTTON_STATE_ADD = 2; + public static final int BUTTON_STATE_REMOVE = 3; + + private int currentButtonState; + private AnimatorSet stateAnimator; + public void updateState(int state, boolean animated) { + if ((state == BUTTON_STATE_EMPTY) != (currentButtonState == BUTTON_STATE_EMPTY)) { + requestLayout(); + } + currentButtonState = state; + if (stateAnimator != null) { + stateAnimator.cancel(); + stateAnimator = null; + } + premiumButtonView.setEnabled(state == BUTTON_STATE_LOCKED); + addButtonView.setEnabled(state == BUTTON_STATE_ADD); + removeButtonView.setEnabled(state == BUTTON_STATE_REMOVE); + if (animated) { + stateAnimator = new AnimatorSet(); + stateAnimator.playTogether( + ObjectAnimator.ofFloat(lockView, TRANSLATION_X, state == BUTTON_STATE_LOCKED ? 0 : -AndroidUtilities.dp(16)), + ObjectAnimator.ofFloat(lockView, ALPHA, state == BUTTON_STATE_LOCKED ? 1f : 0), + ObjectAnimator.ofFloat(headerView, TRANSLATION_X, state == BUTTON_STATE_LOCKED ? AndroidUtilities.dp(16) : 0), + ObjectAnimator.ofFloat(premiumButtonView, ALPHA, state == BUTTON_STATE_LOCKED ? 1 : 0), + ObjectAnimator.ofFloat(premiumButtonView, SCALE_X, state == BUTTON_STATE_LOCKED ? 1 : .6f), + ObjectAnimator.ofFloat(premiumButtonView, SCALE_Y, state == BUTTON_STATE_LOCKED ? 1 : .6f), + ObjectAnimator.ofFloat(addButtonView, ALPHA, state == BUTTON_STATE_ADD ? 1 : 0), + ObjectAnimator.ofFloat(addButtonView, SCALE_X, state == BUTTON_STATE_ADD ? 1 : .6f), + ObjectAnimator.ofFloat(addButtonView, SCALE_Y, state == BUTTON_STATE_ADD ? 1 : .6f), + ObjectAnimator.ofFloat(removeButtonView, ALPHA, state == BUTTON_STATE_REMOVE ? 1 : 0), + ObjectAnimator.ofFloat(removeButtonView, SCALE_X, state == BUTTON_STATE_REMOVE ? 1 : .6f), + ObjectAnimator.ofFloat(removeButtonView, SCALE_Y, state == BUTTON_STATE_REMOVE ? 1 : .6f) + ); + stateAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + premiumButtonView.setVisibility(View.VISIBLE); + addButtonView.setVisibility(View.VISIBLE); + removeButtonView.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationEnd(Animator animation) { + premiumButtonView.setVisibility(state == BUTTON_STATE_LOCKED ? View.VISIBLE : View.GONE); + addButtonView.setVisibility(state == BUTTON_STATE_ADD ? View.VISIBLE : View.GONE); + removeButtonView.setVisibility(state == BUTTON_STATE_REMOVE ? View.VISIBLE : View.GONE); + } + }); + stateAnimator.setDuration(250); + stateAnimator.setInterpolator(new OvershootInterpolator(1.02f)); + stateAnimator.start(); + } else { + lockView.setAlpha(state == BUTTON_STATE_LOCKED ? 1f : 0); + lockView.setTranslationX(state == BUTTON_STATE_LOCKED ? 0 : -AndroidUtilities.dp(16)); + headerView.setTranslationX(state == BUTTON_STATE_LOCKED ? AndroidUtilities.dp(16) : 0); + premiumButtonView.setAlpha(state == BUTTON_STATE_LOCKED ? 1 : 0); + premiumButtonView.setScaleX(state == BUTTON_STATE_LOCKED ? 1 : .6f); + premiumButtonView.setScaleY(state == BUTTON_STATE_LOCKED ? 1 : .6f); + premiumButtonView.setVisibility(state == BUTTON_STATE_LOCKED ? View.VISIBLE : View.GONE); + addButtonView.setAlpha(state == BUTTON_STATE_ADD ? 1 : 0); + addButtonView.setScaleX(state == BUTTON_STATE_ADD ? 1 : .6f); + addButtonView.setScaleY(state == BUTTON_STATE_ADD ? 1 : .6f); + addButtonView.setVisibility(state == BUTTON_STATE_ADD ? View.VISIBLE : View.GONE); + removeButtonView.setAlpha(state == BUTTON_STATE_REMOVE ? 1 : 0); + removeButtonView.setScaleX(state == BUTTON_STATE_REMOVE ? 1 : .6f); + removeButtonView.setScaleY(state == BUTTON_STATE_REMOVE ? 1 : .6f); + removeButtonView.setVisibility(state == BUTTON_STATE_REMOVE ? View.VISIBLE : View.GONE); + } + } + } + + private boolean emojiPackAlertOpened = false; + public void openEmojiPackAlert(TLRPC.StickerSet set) { + if (emojiPackAlertOpened) { + return; + } + emojiPackAlertOpened = true; + ArrayList inputStickerSets = new ArrayList<>(1); + TLRPC.TL_inputStickerSetID inputStickerSetID = new TLRPC.TL_inputStickerSetID(); + inputStickerSetID.id = set.id; + inputStickerSetID.access_hash = set.access_hash; + inputStickerSets.add(inputStickerSetID); + new EmojiPacksAlert(fragment, getContext(), resourcesProvider, inputStickerSets) { + @Override + public void dismiss() { + emojiPackAlertOpened = false; + super.dismiss(); + } + + @Override + protected void onButtonClicked(boolean install) { + if (install) { + if (!installedEmojiSets.contains(set.id)) { + installedEmojiSets.add(set.id); + } + } else { + installedEmojiSets.remove(set.id); + } + updateEmojiHeaders(); + } + }.show(); + } + + public class EmojiGridSpacing extends RecyclerView.ItemDecoration { + public EmojiGridSpacing() {} + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + if (view instanceof StickerSetNameCell) { + outRect.left = AndroidUtilities.dp(5); + outRect.right = AndroidUtilities.dp(5); + int position = parent.getChildAdapterPosition(view); + if (position + 1 > emojiAdapter.plainEmojisCount && !UserConfig.getInstance(currentAccount).isPremium()) { + outRect.top = AndroidUtilities.dp(10); + } + } else if (view instanceof RecyclerListView || view instanceof EmojiPackHeader) { + outRect.left = -emojiGridView.getPaddingLeft(); + outRect.right = -emojiGridView.getPaddingRight(); + if (view instanceof EmojiPackHeader) { + outRect.top = AndroidUtilities.dp(8); +// if (parent.getChildAdapterPosition(view) == emojiAdapter.firstTrendingRow) { +// outRect.top = AndroidUtilities.dp(32); +// } + } else { + outRect.bottom = AndroidUtilities.dp(6); + } + } else if (view instanceof BackupImageView) { + outRect.bottom = AndroidUtilities.dp(12); + } } } @@ -2365,6 +3824,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific y = bottomTabContainer.getTop(); } bottomTabContainer.setTranslationY(-y); + if (needEmojiSearch) { + bulletinContainer.setTranslationY(-y); + } } } } @@ -2429,17 +3891,52 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } + private ArrayList lastRecentArray; + private int lastRecentCount; + public ArrayList getRecentEmoji() { + if (allowAnimatedEmoji) { + return Emoji.recentEmoji; + } + if (lastRecentArray == null) { + lastRecentArray = new ArrayList<>(); + } + if (Emoji.recentEmoji.size() != lastRecentCount) { + lastRecentArray.clear(); + for (int i = 0; i < Emoji.recentEmoji.size(); ++i) { + if (!Emoji.recentEmoji.get(i).startsWith("animated_")) { + lastRecentArray.add(Emoji.recentEmoji.get(i)); + } + } + lastRecentCount = lastRecentArray.size(); + } + return lastRecentArray; + } + public void addEmojiToRecent(String code) { - if (!Emoji.isValidEmoji(code)) { + if (code == null || !(code.startsWith("animated_") || Emoji.isValidEmoji(code))) { return; } - int oldCount = Emoji.recentEmoji.size(); Emoji.addRecentEmoji(code); if (getVisibility() != VISIBLE || pager.getCurrentItem() != 0) { Emoji.sortEmoji(); emojiAdapter.notifyDataSetChanged(); } Emoji.saveRecentEmoji(); + + if (!allowAnimatedEmoji) { + if (lastRecentArray == null) { + lastRecentArray = new ArrayList<>(); + } else { + lastRecentArray.clear(); + } + for (int i = 0; i < Emoji.recentEmoji.size(); ++i) { + if (!Emoji.recentEmoji.get(i).startsWith("animated_")) { + lastRecentArray.add(Emoji.recentEmoji.get(i)); + } + } + lastRecentCount = lastRecentArray.size(); + } + /*int addedCount = Emoji.recentEmoji.size() - oldCount; int position = emojiLayoutManager.findLastVisibleItemPosition(); int top = Integer.MAX_VALUE; @@ -2495,7 +3992,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific firstEmojiAttach = false; for (int a = 0; a < 3; a++) { RecyclerListView gridView; - ScrollSlidingTabStrip tabStrip; + View tabStrip; SearchField currentField; GridLayoutManager layoutManager; if (a == 0) { @@ -2522,7 +4019,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific searchAnimation = new AnimatorSet(); if (tabStrip != null && a != 2) { searchAnimation.playTogether( - ObjectAnimator.ofFloat(tabStrip, View.TRANSLATION_Y, -AndroidUtilities.dp(36)), + ObjectAnimator.ofFloat(tabStrip, View.TRANSLATION_Y, -AndroidUtilities.dp(40)), ObjectAnimator.ofFloat(gridView, View.TRANSLATION_Y, -AndroidUtilities.dp(36)), ObjectAnimator.ofFloat(currentField, View.TRANSLATION_Y, AndroidUtilities.dp(0))); } else { @@ -2557,7 +4054,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } else { currentField.setTranslationY(AndroidUtilities.dp(0)); if (tabStrip != null && a != 2) { - tabStrip.setTranslationY(-AndroidUtilities.dp(36)); + tabStrip.setTranslationY(-AndroidUtilities.dp(40)); } if (gridView == stickersGridView) { gridView.setPadding(0, AndroidUtilities.dp(4), 0, 0); @@ -2611,14 +4108,56 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific View view = stickersLayoutManager.findViewByPosition(p); int firstPosition = stickersLayoutManager.findFirstVisibleItemPosition(); if (view == null && Math.abs(p - firstPosition) > 40) { - scrollHelper.setScrollDirection(stickersLayoutManager.findFirstVisibleItemPosition() < p ? RecyclerAnimationScrollHelper.SCROLL_DIRECTION_DOWN : RecyclerAnimationScrollHelper.SCROLL_DIRECTION_UP); - scrollHelper.scrollToPosition(p, offset, false, true); + stickersScrollHelper.setScrollDirection(stickersLayoutManager.findFirstVisibleItemPosition() < p ? RecyclerAnimationScrollHelper.SCROLL_DIRECTION_DOWN : RecyclerAnimationScrollHelper.SCROLL_DIRECTION_UP); + stickersScrollHelper.scrollToPosition(p, offset, false, true); } else { ignoreStickersScroll = true; stickersGridView.smoothScrollToPosition(p); } } + public void scrollEmojisToAnimated() { + if (emojiSmoothScrolling) { + return; + } + try { + int position = emojiAdapter.sectionToPosition.get(EmojiData.dataColored.length); + if (position > 0) { + emojiGridView.stopScroll(); + updateEmojiTabsPosition(position); + scrollEmojisToPosition(position, AndroidUtilities.dp(-9)); + checkEmojiTabY(null, 0); + } + } catch (Exception ignore) {} + } + + private void scrollEmojisToPosition(int p, int offset) { + View view = emojiLayoutManager.findViewByPosition(p); + int firstPosition = emojiLayoutManager.findFirstVisibleItemPosition(); + if ((view == null && Math.abs(p - firstPosition) > emojiLayoutManager.getSpanCount() * 9f) || !SharedConfig.animationsEnabled()) { + emojiScrollHelper.setScrollDirection(emojiLayoutManager.findFirstVisibleItemPosition() < p ? RecyclerAnimationScrollHelper.SCROLL_DIRECTION_DOWN : RecyclerAnimationScrollHelper.SCROLL_DIRECTION_UP); + emojiScrollHelper.scrollToPosition(p, offset, false, true); + } else { + ignoreStickersScroll = true; + LinearSmoothScrollerCustom linearSmoothScroller = new LinearSmoothScrollerCustom(emojiGridView.getContext(), LinearSmoothScrollerCustom.POSITION_TOP) { + @Override + public void onEnd() { + emojiSmoothScrolling = false; + } + + @Override + protected void onStart() { + emojiSmoothScrolling = true; + } + }; + linearSmoothScroller.setTargetPosition(p); + linearSmoothScroller.setOffset(offset); + emojiLayoutManager.startSmoothScroll(linearSmoothScroller); + + } + + } + public void closeSearch(boolean animated, long scrollToSet) { if (searchAnimation != null) { searchAnimation.cancel(); @@ -2644,7 +4183,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific SearchField currentField; RecyclerListView gridView; GridLayoutManager layoutManager; - ScrollSlidingTabStrip tabStrip; + View tabStrip; if (a == 0) { currentField = emojiSearchField; @@ -2699,7 +4238,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } else if (gridView == gifGridView) { gridView.setPadding(0, AndroidUtilities.dp(36 + 4), 0, AndroidUtilities.dp(44)); } else if (gridView == emojiGridView) { - gridView.setPadding(0, AndroidUtilities.dp(38), 0, AndroidUtilities.dp(44)); + gridView.setPadding(0, AndroidUtilities.dp(36), 0, AndroidUtilities.dp(44)); } if (firstVisPos != RecyclerView.NO_POSITION) { layoutManager.scrollToPositionWithOffset(firstVisPos, top - gridView.getPaddingTop()); @@ -2726,7 +4265,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } else if (gridView == gifGridView) { gridView.setPadding(0, AndroidUtilities.dp(36 + 4), 0, AndroidUtilities.dp(44)); } else if (gridView == emojiGridView) { - gridView.setPadding(0, AndroidUtilities.dp(38), 0, AndroidUtilities.dp(44)); + gridView.setPadding(0, AndroidUtilities.dp(36), 0, AndroidUtilities.dp(44)); } layoutManager.scrollToPositionWithOffset(1, 0); } @@ -2760,6 +4299,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } private void checkBottomTabScroll(float dy) { + if (SystemClock.elapsedRealtime() - shownBottomTabAfterClick < ViewConfiguration.getTapTimeout()) { + return; + } lastBottomScrollDy += dy; int offset; if (pager.getCurrentItem() == 0) { @@ -2851,6 +4393,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } + private long shownBottomTabAfterClick; private void showBottomTab(boolean show, boolean animated) { lastBottomScrollDy = 0; if (show && bottomTabContainer.getTag() == null || !show && bottomTabContainer.getTag() != null || delegate != null && delegate.isSearchOpened()) { @@ -2864,14 +4407,19 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (animated) { bottomTabContainerAnimation = new AnimatorSet(); bottomTabContainerAnimation.playTogether( - ObjectAnimator.ofFloat(bottomTabContainer, View.TRANSLATION_Y, show ? 0 : AndroidUtilities.dp(needEmojiSearch ? 49 : 54)), - ObjectAnimator.ofFloat(shadowLine, View.TRANSLATION_Y, show ? 0 : AndroidUtilities.dp(49))); + ObjectAnimator.ofFloat(bottomTabContainer, View.TRANSLATION_Y, show ? 0 : AndroidUtilities.dp(needEmojiSearch ? 45 : 50)), + ObjectAnimator.ofFloat(bulletinContainer, View.TRANSLATION_Y, needEmojiSearch ? (show ? 0 : AndroidUtilities.dp(needEmojiSearch ? 45 : 50)) : bulletinContainer.getTranslationY()), + ObjectAnimator.ofFloat(shadowLine, View.TRANSLATION_Y, show ? 0 : AndroidUtilities.dp(45)) + ); bottomTabContainerAnimation.setDuration(200); bottomTabContainerAnimation.setInterpolator(CubicBezierInterpolator.EASE_OUT); bottomTabContainerAnimation.start(); } else { - bottomTabContainer.setTranslationY(show ? 0 : AndroidUtilities.dp(needEmojiSearch ? 49 : 54)); - shadowLine.setTranslationY(show ? 0 : AndroidUtilities.dp(49)); + bottomTabContainer.setTranslationY(show ? 0 : AndroidUtilities.dp(needEmojiSearch ? 45 : 50)); + if (needEmojiSearch) { + bulletinContainer.setTranslationY(show ? 0 : AndroidUtilities.dp(needEmojiSearch ? 45 : 50)); + } + shadowLine.setTranslationY(show ? 0 : AndroidUtilities.dp(45)); } } @@ -2914,13 +4462,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if ((delegate != null && delegate.isSearchOpened()) || type == Type.STICKERS) { return; } - final float tabsHeight = AndroidUtilities.dpf2(type == Type.EMOJIS ? 38 : 48); + final float tabsHeight = AndroidUtilities.dpf2(type == Type.EMOJIS ? 36 : 48); final float fraction = tabsMinusDy[type] / -tabsHeight; if (fraction <= 0f || fraction >= 1f) { animateSearchField(type); return; } - final ScrollSlidingTabStrip tabStrip = getTabsForType(type); + final View tabStrip = getTabsForType(type); final int endValue = fraction > 0.5f ? (int) -Math.ceil(tabsHeight) : 0; if (fraction > 0.5f) { animateSearchField(type, false, endValue); @@ -2980,7 +4528,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific getLayoutManagerForType(type).startSmoothScroll(smoothScroller); } - private ScrollSlidingTabStrip getTabsForType(@Type int type) { + private View getTabsForType(@Type int type) { switch (type) { case Type.STICKERS: return stickersTab; @@ -3070,7 +4618,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific emojiTabs.setTranslationY(tabsMinusDy[Type.EMOJIS] = 0); return; } - if (list.getVisibility() != VISIBLE) { + if (list.getVisibility() != VISIBLE || emojiSmoothScrolling) { return; } if (delegate != null && delegate.isSearchOpened()) { @@ -3085,10 +4633,10 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific tabsMinusDy[Type.EMOJIS] -= dy; if (tabsMinusDy[Type.EMOJIS] > 0) { tabsMinusDy[Type.EMOJIS] = 0; - } else if (tabsMinusDy[Type.EMOJIS] < -AndroidUtilities.dp(36 * 6)) { - tabsMinusDy[Type.EMOJIS] = -AndroidUtilities.dp(36 * 6); + } else if (tabsMinusDy[Type.EMOJIS] < -AndroidUtilities.dp(36 * 3)) { + tabsMinusDy[Type.EMOJIS] = -AndroidUtilities.dp(36 * 3); } - emojiTabs.setTranslationY(Math.max(-AndroidUtilities.dp(38), tabsMinusDy[Type.EMOJIS])); + emojiTabs.setTranslationY(Math.max(-AndroidUtilities.dp(36), tabsMinusDy[Type.EMOJIS])); } private void checkGifSearchFieldScroll(boolean isLayout) { @@ -3215,31 +4763,16 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific pager.setCurrentItem(1, false); } - private void updateEmojiTabs() { - int newHas = Emoji.recentEmoji.isEmpty() ? 0 : 1; - if (hasRecentEmoji != -1 && hasRecentEmoji == newHas) { + private void updateEmojiHeaders() { + if (emojiGridView == null) { return; } - hasRecentEmoji = newHas; - emojiTabs.removeTabs(); - String[] descriptions = { - LocaleController.getString("RecentStickers", R.string.RecentStickers), - LocaleController.getString("Emoji1", R.string.Emoji1), - LocaleController.getString("Emoji2", R.string.Emoji2), - LocaleController.getString("Emoji3", R.string.Emoji3), - LocaleController.getString("Emoji4", R.string.Emoji4), - LocaleController.getString("Emoji5", R.string.Emoji5), - LocaleController.getString("Emoji6", R.string.Emoji6), - LocaleController.getString("Emoji7", R.string.Emoji7), - LocaleController.getString("Emoji8", R.string.Emoji8), - }; - for (int a = 0; a < emojiIcons.length; a++) { - if (a == 0 && Emoji.recentEmoji.isEmpty()) { - continue; + for (int i = 0; i < emojiGridView.getChildCount(); ++i) { + View child = emojiGridView.getChildAt(i); + if (child instanceof EmojiPackHeader) { + ((EmojiPackHeader) child).updateState(true); } - emojiTabs.addIconTab(a, emojiIcons[a]).setContentDescription(descriptions[a]); } - emojiTabs.updateTabStyles(); } private void updateStickerTabs() { @@ -3322,7 +4855,6 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } } - premiumStickers.clear(); packs = MessagesController.getInstance(currentAccount).filterPremiumStickers(packs); for (int a = 0; a < packs.size(); a++) { TLRPC.TL_messages_stickerSet pack = packs.get(a); @@ -3330,15 +4862,6 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific continue; } stickerSets.add(pack); - if (!MessagesController.getInstance(currentAccount).premiumLocked) { - if (UserConfig.getInstance(currentAccount).isPremium()) { - for (int i = 0; i < pack.documents.size(); i++) { - if (MessageObject.isPremiumSticker(pack.documents.get(i))) { - premiumStickers.add(pack.documents.get(i)); - } - } - } - } } if (!premiumStickers.isEmpty()) { @@ -3607,9 +5130,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific Theme.setEmojiDrawableColor(tabIcons[a], getThemedColor(Theme.key_chat_emojiBottomPanelIcon), false); Theme.setEmojiDrawableColor(tabIcons[a], getThemedColor(Theme.key_chat_emojiPanelIconSelected), true); } - for (int a = 0; a < emojiIcons.length; a++) { - Theme.setEmojiDrawableColor(emojiIcons[a], getThemedColor(Theme.key_chat_emojiPanelIcon), false); - Theme.setEmojiDrawableColor(emojiIcons[a], getThemedColor(Theme.key_chat_emojiPanelIconSelected), true); + if (emojiTabs != null) { + emojiTabs.updateColors(); } for (int a = 0; a < stickerIcons.length; a++) { Theme.setEmojiDrawableColor(stickerIcons[a], getThemedColor(Theme.key_chat_emojiPanelIcon), false); @@ -3627,6 +5149,13 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific Theme.setEmojiDrawableColor(searchIconDotDrawable, getThemedColor(Theme.key_chat_emojiPanelStickerPackSelectorLine), false); Theme.setEmojiDrawableColor(searchIconDotDrawable, getThemedColor(Theme.key_chat_emojiPanelStickerPackSelectorLine), true); } + if (emojiLockPaint != null) { + emojiLockPaint.setColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); + emojiLockPaint.setAlpha((int) (emojiLockPaint.getAlpha() * .5f)); + } + if (emojiLockDrawable != null) { + emojiLockDrawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_emojiPanelStickerSetName), PorterDuff.Mode.MULTIPLY)); + } } @Override @@ -3678,16 +5207,16 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (lastNotifyHeight != newHeight || lastNotifyHeight2 != newHeight2) { if (delegate != null && delegate.isSearchOpened()) { bottomTabContainer.setTranslationY(AndroidUtilities.dp(49)); + if (needEmojiSearch) { + bulletinContainer.setTranslationY(AndroidUtilities.dp(49)); + } } else { if (bottomTabContainer.getTag() == null) { if (newHeight <= lastNotifyHeight) { bottomTabContainer.setTranslationY(0); - } else { -// float y = getY() + getMeasuredHeight() - parent.getHeight() - bottomTabContainer.getTop(); -// if (bottomTabContainer.getTop() - y < 0) { -// y = bottomTabContainer.getTop(); -// } -// bottomTabContainer.setTranslationY(-y); + if (needEmojiSearch) { + bulletinContainer.setTranslationY(0); + } } } } @@ -3737,7 +5266,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (currentPage != 0 && currentChatId != 0) { currentPage = 0; } - if (currentPage == 0 || forceEmoji || views.size() == 1) { + if (currentPage == 0 || forceEmoji || currentTabs.size() == 1) { showBackspaceButton(true, false); showStickerSettingsButton(false, false); if (pager.getCurrentItem() != 0) { @@ -3797,8 +5326,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (visibility != GONE) { Emoji.sortEmoji(); emojiAdapter.notifyDataSetChanged(); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.stickersDidLoad); if (stickersGridAdapter != null) { - NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.recentDocumentsDidLoad); updateStickerTabs(); reloadStickersAdapter(); @@ -3824,8 +5353,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific public void onDestroy() { NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.newEmojiSuggestionsAvailable); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.stickersDidLoad); if (stickersGridAdapter != null) { - NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.recentDocumentsDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.featuredStickersDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.groupStickersDidLoad); @@ -3849,6 +5378,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific int previousCount2 = favouriteStickers.size(); recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_IMAGE); favouriteStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_FAVE); + premiumStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_PREMIUM_STICKERS); for (int a = 0; a < favouriteStickers.size(); a++) { TLRPC.Document favSticker = favouriteStickers.get(a); for (int b = 0; b < recentStickers.size(); b++) { @@ -4009,7 +5539,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } cell.setStickerSet(stickerSetCovered, unread, true, 0, 0, forceInstalled); if (unread) { - MediaDataController.getInstance(currentAccount).markFaturedStickersByIdAsRead(stickerSetCovered.set.id); + MediaDataController.getInstance(currentAccount).markFeaturedStickersByIdAsRead(false, stickerSetCovered.set.id); } boolean installing = installingStickerSets.indexOfKey(stickerSetCovered.set.id) >= 0; boolean removing = removingStickerSets.indexOfKey(stickerSetCovered.set.id) >= 0; @@ -4039,10 +5569,14 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific public void didReceivedNotification(int id, int account, Object... args) { if (id == NotificationCenter.stickersDidLoad) { if ((Integer) args[0] == MediaDataController.TYPE_IMAGE) { - updateStickerTabs(); - updateVisibleTrendingSets(); - reloadStickersAdapter(); - checkPanels(); + if (stickersGridAdapter != null) { + updateStickerTabs(); + updateVisibleTrendingSets(); + reloadStickersAdapter(); + checkPanels(); + } + } else if ((Integer) args[0] == MediaDataController.TYPE_EMOJIPACKS) { + emojiAdapter.notifyDataSetChanged(); } } else if (id == NotificationCenter.recentDocumentsDidLoad) { boolean isGif = (Boolean) args[0]; @@ -4059,10 +5593,25 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } updateStickerTabs(); + } else if (id == NotificationCenter.featuredEmojiDidLoad) { + if (emojiAdapter != null) { + emojiAdapter.notifyDataSetChanged(); + } } else if (id == NotificationCenter.groupStickersDidLoad) { if (info != null && info.stickerset != null && info.stickerset.id == (Long) args[0]) { updateStickerTabs(); } + if (toInstall.containsKey((Long) args[0]) && args.length >= 2) { + long packId = (long) args[0]; + TLRPC.TL_messages_stickerSet stickerSet = (TLRPC.TL_messages_stickerSet) args[1]; + Utilities.Callback onInstalled = toInstall.get(packId); + if (onInstalled != null && stickerSet != null) { + Utilities.Callback callback = toInstall.remove(packId); + if (callback != null) { + callback.run(stickerSet); + } + } + } } else if (id == NotificationCenter.emojiLoaded) { if (stickersGridView != null) { int count = stickersGridView.getChildCount(); @@ -4084,6 +5633,10 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific emojiSearchAdapter.search(emojiSearchAdapter.lastSearchEmojiString); } } else if (id == NotificationCenter.currentUserPremiumStatusChanged) { + if (emojiAdapter != null) { + emojiAdapter.notifyDataSetChanged(); + } + updateEmojiHeaders(); updateStickerTabs(); } } @@ -4095,6 +5648,11 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private class TrendingAdapter extends RecyclerListView.SelectionAdapter { + private boolean emoji; + public TrendingAdapter(boolean emoji) { + this.emoji = emoji; + } + @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { return true; @@ -4107,29 +5665,29 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific protected void onDraw(Canvas canvas) { super.onDraw(canvas); TLRPC.StickerSetCovered set = (TLRPC.StickerSetCovered) getTag(); - if (MediaDataController.getInstance(currentAccount).isStickerPackUnread(set.set.id) && dotPaint != null) { + if (MediaDataController.getInstance(currentAccount).isStickerPackUnread(emoji, set.set.id) && dotPaint != null) { int x = canvas.getWidth() - AndroidUtilities.dp(8); int y = AndroidUtilities.dp(14); canvas.drawCircle(x, y, AndroidUtilities.dp(3), dotPaint); } } }; - imageView.setSize(AndroidUtilities.dp(30), AndroidUtilities.dp(30)); + imageView.setSize(AndroidUtilities.dp(emoji ? 36 : 30), AndroidUtilities.dp(emoji ? 36 : 30)); imageView.setLayerNum(1); imageView.setAspectFit(true); - imageView.setLayoutParams(new RecyclerView.LayoutParams(AndroidUtilities.dp(52), AndroidUtilities.dp(52))); + imageView.setLayoutParams(new RecyclerView.LayoutParams(AndroidUtilities.dp(42), AndroidUtilities.dp(42))); return new RecyclerListView.Holder(imageView); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { BackupImageView imageView = (BackupImageView) holder.itemView; - TLRPC.StickerSetCovered set = featuredStickerSets.get(position); + TLRPC.StickerSetCovered set = (emoji ? featuredEmojiSets : featuredStickerSets).get(position); imageView.setTag(set); TLRPC.Document document = set.cover; if (!set.covers.isEmpty()) { - document = set.covers.get(0); + document = set.covers.get(0); } TLObject object = FileLoader.getClosestPhotoSizeWithSize(set.set.thumbs, 90); SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(set.set.thumbs, Theme.key_emptyListPlaceholder, 0.2f); @@ -4174,7 +5732,39 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific @Override public int getItemCount() { - return featuredStickerSets.size(); + return (emoji ? featuredEmojiSets : featuredStickerSets).size(); + } + } + + private class TrendingListView extends RecyclerListView { + public TrendingListView(Context context, Adapter adapter) { + super(context); + + setNestedScrollingEnabled(true); + setSelectorRadius(AndroidUtilities.dp(4)); + setSelectorDrawableColor(getThemedColor(Theme.key_listSelector)); + setTag(9); + setItemAnimator(null); + setLayoutAnimation(null); + + LinearLayoutManager layoutManager = new LinearLayoutManager(context) { + @Override + public boolean supportsPredictiveItemAnimations() { + return false; + } + }; + layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + setLayoutManager(layoutManager); + setAdapter(adapter); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent e) { + if (getParent() != null && getParent().getParent() != null) { + getParent().getParent().requestDisallowInterceptTouchEvent(canScrollHorizontally(-1) || canScrollHorizontally(1)); + pager.requestDisallowInterceptTouchEvent(true); + } + return super.onInterceptTouchEvent(e); } } @@ -4362,34 +5952,17 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific }); break; case 6: - RecyclerListView horizontalListView = new RecyclerListView(context) { + TrendingListView listView = new TrendingListView(context, trendingAdapter = new TrendingAdapter(false)); + listView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override - public boolean onInterceptTouchEvent(MotionEvent e) { - if (getParent() != null && getParent().getParent() != null) { - getParent().getParent().requestDisallowInterceptTouchEvent(canScrollHorizontally(-1) || canScrollHorizontally(1)); - pager.requestDisallowInterceptTouchEvent(true); - } - return super.onInterceptTouchEvent(e); + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + outRect.right = AndroidUtilities.dp(8); } - }; - horizontalListView.setSelectorRadius(AndroidUtilities.dp(4)); - horizontalListView.setSelectorDrawableColor(getThemedColor(Theme.key_listSelector)); - horizontalListView.setTag(9); - horizontalListView.setItemAnimator(null); - horizontalListView.setLayoutAnimation(null); - LinearLayoutManager layoutManager = new LinearLayoutManager(context) { - @Override - public boolean supportsPredictiveItemAnimations() { - return false; - } - }; - layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); - horizontalListView.setLayoutManager(layoutManager); - horizontalListView.setAdapter(trendingAdapter = new TrendingAdapter()); - horizontalListView.setOnItemClickListener((view1, position) -> { + }); + listView.setOnItemClickListener((view1, position) -> { openTrendingStickers((TLRPC.StickerSetCovered) view1.getTag()); }); - view = horizontalListView; + view = listView; view.setLayoutParams(new RecyclerView.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.dp(52))); break; } @@ -4595,11 +6168,72 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } + public static class EmojiPackExpand extends FrameLayout { + public TextView textView; + + public EmojiPackExpand(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + textView = new TextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); + textView.setBackground(Theme.createRoundRectDrawable(AndroidUtilities.dp(11), ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_chat_emojiPanelStickerSetName, resourcesProvider), 99))); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setPadding(AndroidUtilities.dp(6), AndroidUtilities.dp(1.66f), AndroidUtilities.dp(6), AndroidUtilities.dp(2f)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + } + } + + public static class CustomEmoji { + public TLRPC.TL_messages_stickerSet stickerSet; + public long documentId; + public String emoticon; + + public TLRPC.Document getDocument() { + if (stickerSet == null || stickerSet.documents == null) { + return null; + } + for (int i = 0; i < stickerSet.documents.size(); ++i) { + TLRPC.Document document = stickerSet.documents.get(i); + if (document != null && document.id == documentId) { + return document; + } + } + return null; + } + } + + public static class EmojiPack { + public int index; + public TLRPC.StickerSet set; + public ArrayList documents; + public boolean free; + public boolean installed; + public boolean featured; + public boolean expanded; + } + private class EmojiGridAdapter extends RecyclerListView.SelectionAdapter { + private static final int VIEW_TYPE_EMOJI = 0; + private static final int VIEW_TYPE_HEADER = 1; + private static final int VIEW_TYPE_SEARCH = 2; + private static final int VIEW_TYPE_UNLOCK = 3; + private static final int VIEW_TYPE_TRENDING = 4; + private static final int VIEW_TYPE_PACK_HEADER = 5; + private static final int VIEW_TYPE_EXPAND = 6; + + private int trendingHeaderRow = -1; + private int trendingRow = -1; + private int firstTrendingRow = -1; + + private ArrayList rowHashCodes = new ArrayList<>(); private SparseIntArray positionToSection = new SparseIntArray(); private SparseIntArray sectionToPosition = new SparseIntArray(); + private SparseIntArray positionToUnlock = new SparseIntArray(); + private SparseIntArray positionToExpand = new SparseIntArray(); + private ArrayList packStartPosition = new ArrayList<>(); private int itemCount; + public int plainEmojisCount; @Override public int getItemCount() { @@ -4613,20 +6247,61 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { - return holder.getItemViewType() == 0; + int type = holder.getItemViewType(); + return type == VIEW_TYPE_EMOJI || type == VIEW_TYPE_TRENDING || type == VIEW_TYPE_UNLOCK || type == VIEW_TYPE_EXPAND; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { - case 0: + case VIEW_TYPE_EMOJI: view = new ImageViewEmoji(getContext()); break; - case 1: + case VIEW_TYPE_HEADER: view = new StickerSetNameCell(getContext(), true, resourcesProvider); break; - case 2: + case VIEW_TYPE_PACK_HEADER: + view = new EmojiPackHeader(getContext()); + break; + case VIEW_TYPE_TRENDING: + TrendingListView listView = new TrendingListView(getContext(), trendingEmojiAdapter = new TrendingAdapter(true)); + listView.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), 0); + listView.setClipToPadding(false); + listView.addItemDecoration(new RecyclerView.ItemDecoration() { + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + outRect.right = AndroidUtilities.dp(8); + } + }); + listView.setOnItemClickListener((item, position) -> { + ArrayList inputStickerSets = new ArrayList<>(); + List featuredStickerSets = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets(); + for (int i = 0; featuredStickerSets != null && i < featuredStickerSets.size(); ++i) { + TLRPC.StickerSetCovered set = featuredStickerSets.get(i); + if (set != null && set.set != null) { + TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID(); + inputStickerSet.id = set.set.id; + inputStickerSet.access_hash = set.set.access_hash; + inputStickerSets.add(inputStickerSet); + } + } + MediaDataController.getInstance(currentAccount).markFeaturedStickersAsRead(true, true); + if (fragment != null) { + fragment.showDialog(new EmojiPacksAlert(fragment, getContext(), fragment.getResourceProvider(), inputStickerSets)); + } else { + new EmojiPacksAlert(null, getContext(), resourcesProvider, inputStickerSets).show(); + } + }); + view = listView; + break; + case VIEW_TYPE_UNLOCK: + view = new EmojiPackButton(getContext()); + break; + case VIEW_TYPE_EXPAND: + view = new EmojiPackExpand(getContext(), resourcesProvider); + break; + case VIEW_TYPE_SEARCH: default: view = new View(getContext()); view.setLayoutParams(new RecyclerView.LayoutParams(LayoutHelper.MATCH_PARENT, searchFieldHeight)); @@ -4636,21 +6311,36 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + public void onBindViewHolder(RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") int position) { + int index; switch (holder.getItemViewType()) { - case 0: { + case VIEW_TYPE_EMOJI: { ImageViewEmoji imageView = (ImageViewEmoji) holder.itemView; + imageView.position = position; + imageView.pack = null; String code; String coloredCode; boolean recent; + TLRPC.Document customEmoji = null; + Long customEmojiId = null; if (needEmojiSearch) { position--; } + if (trendingRow >= 0) { + position -= 2; + } - int count = Emoji.recentEmoji.size(); + int count = getRecentEmoji().size(); if (position < count) { - coloredCode = code = Emoji.recentEmoji.get(position); + coloredCode = code = getRecentEmoji().get(position); + if (code != null && code.startsWith("animated_")) { + try { + customEmojiId = Long.parseLong(code.substring(9)); + code = null; + coloredCode = null; + } catch (Exception ignore) {} + } recent = true; } else { code = null; @@ -4667,45 +6357,432 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } count += size; } + if (code == null) { + final boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + final int maxlen = emojiLayoutManager.getSpanCount() * 3; + for (int b = 0; b < packStartPosition.size(); ++b) { + EmojiPack pack = emojipacksProcessed.get(b); + int start = packStartPosition.get(b) + 1; + int stickersCount = ((pack.installed && !pack.featured) && (pack.free || isPremium) || pack.expanded ? pack.documents.size() : Math.min(maxlen, pack.documents.size())); + if (imageView.position >= start && imageView.position - start < stickersCount) { + imageView.pack = pack; + customEmoji = pack.documents.get(imageView.position - start); + customEmojiId = customEmoji == null ? null : customEmoji.id; + break; + } + } + } recent = false; } - imageView.setImageDrawable(Emoji.getEmojiBigDrawable(coloredCode), recent); + if (customEmojiId != null) { + imageView.setPadding(AndroidUtilities.dp(3), AndroidUtilities.dp(3), AndroidUtilities.dp(3), AndroidUtilities.dp(3)); + } else { + imageView.setPadding(0, 0, 0, 0); + } + if (customEmojiId != null) { + imageView.setImageDrawable(null, recent); + if (imageView.getSpan() == null || imageView.getSpan().getDocumentId() != customEmojiId) { + if (customEmoji != null) { + imageView.setSpan(new AnimatedEmojiSpan(customEmoji, null)); + } else { + imageView.setSpan(new AnimatedEmojiSpan(customEmojiId, null)); + } + } + } else { + imageView.setImageDrawable(Emoji.getEmojiBigDrawable(coloredCode), recent); + imageView.setSpan(null); + } imageView.setTag(code); imageView.setContentDescription(coloredCode); break; } - case 1: { + case VIEW_TYPE_HEADER: { StickerSetNameCell cell = (StickerSetNameCell) holder.itemView; - cell.setText(emojiTitles[positionToSection.get(position)], 0); + cell.position = position; + index = positionToSection.get(position); + String text; + if (position == trendingHeaderRow) { + text = LocaleController.getString("FeaturedEmojiPacks", R.string.FeaturedEmojiPacks); + } else if (index >= emojiTitles.length) { + try { + text = emojipacksProcessed.get(index - emojiTitles.length).set.title; + } catch (Exception ignore) { + text = ""; + } + } else { + text = emojiTitles[index]; + } + cell.setText(text, 0); break; } + case VIEW_TYPE_EXPAND: + EmojiPackExpand button = (EmojiPackExpand) holder.itemView; + final int i = positionToExpand.get(position); + final int maxlen = emojiLayoutManager.getSpanCount() * 3; + final EmojiPack pack = i >= 0 && i < emojipacksProcessed.size() ? emojipacksProcessed.get(i) : null; + if (pack != null) { + button.textView.setText("+" + (pack.documents.size() - maxlen + 1)); + } + break; +// case VIEW_TYPE_UNLOCK: +// EmojiPackButton expandButton = (EmojiPackButton) holder.itemView; +// expandButton.position = position; +// index = positionToUnlock.get(position); +// final EmojiPack expandPack = index >= 0 && index < emojipacksProcessed.size() ? emojipacksProcessed.get(index) : null; +// if (expandPack != null && expandButton != null) { +// final boolean unlock = !expandPack.free && !UserConfig.getInstance(currentAccount).isPremium(); +// final boolean installed = expandPack.installed || keepFeaturedDuplicate.contains(expandPack.set.id); +// expandButton.set(expandPack.set.title, unlock, installed, e -> { +// if (unlock) { +// openPremiumAnimatedEmojiFeature(); +// } else { +// TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSetById(expandPack.set.id); +// if (stickerSet == null || stickerSet.set == null) { +// toInstall.put(expandPack.set.id, newPack -> { +// if (newPack == null) { +// return; +// } +// keepFeaturedDuplicate.add(newPack.set.id); +// EmojiPacksAlert.installSet(fragment, newPack, true, () -> { +// expandButton.updateInstall(true, true); +// }); +// }); +// TLRPC.TL_inputStickerSetID inputStickerSetID = new TLRPC.TL_inputStickerSetID(); +// inputStickerSetID.id = expandPack.set.id; +// inputStickerSetID.access_hash = expandPack.set.access_hash; +// MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetID, false); +// } else { +// keepFeaturedDuplicate.add(stickerSet.set.id); +// EmojiPacksAlert.installSet(fragment, stickerSet, true, () -> { +// expandButton.updateInstall(true, true); +// }); +// } +// } +// }); +// } +// break; + case VIEW_TYPE_PACK_HEADER: + EmojiPackHeader header = (EmojiPackHeader) holder.itemView; + int section = positionToSection.get(position); + int a = section - emojiTitles.length; + EmojiPack pack2 = emojipacksProcessed.get(a); + EmojiPack before = a - 1 >= 0 ? emojipacksProcessed.get(a - 1) : null; + boolean divider = pack2 != null && pack2.featured && !(before != null && !before.free && before.installed && !UserConfig.getInstance(currentAccount).isPremium()); + header.setStickerSet(pack2, divider); + break; } } @Override public int getItemViewType(int position) { - if (needEmojiSearch && position == 0) { - return 2; + if (position == trendingRow) { + return VIEW_TYPE_TRENDING; + } else if (position == trendingHeaderRow) { + return VIEW_TYPE_HEADER; } else if (positionToSection.indexOfKey(position) >= 0) { - return 1; + return positionToSection.get(position) >= EmojiData.dataColored.length ? VIEW_TYPE_PACK_HEADER : VIEW_TYPE_HEADER; + } else if (needEmojiSearch && position == 0) { + return VIEW_TYPE_SEARCH; + } else if (positionToUnlock.indexOfKey(position) >= 0) { + return VIEW_TYPE_UNLOCK; + } else if (positionToExpand.indexOfKey(position) >= 0) { + return VIEW_TYPE_EXPAND; + } + return VIEW_TYPE_EMOJI; + } + + public void processEmoji() { + emojipacksProcessed.clear(); + if (!allowAnimatedEmoji) { + return; + } + MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + ArrayList installedEmojipacks = new ArrayList<>(mediaDataController.getStickerSets(MediaDataController.TYPE_EMOJIPACKS)); + boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + int index = 0; + if (!isPremium) { + for (int i = 0; i < installedEmojipacks.size(); ++i) { + TLRPC.TL_messages_stickerSet set = installedEmojipacks.get(i); + if (set != null && !MessageObject.isPremiumEmojiPack(set)) { + EmojiPack pack = new EmojiPack(); + pack.index = index++; + pack.set = set.set; + pack.documents = new ArrayList<>(set.documents); + pack.free = true; + pack.installed = mediaDataController.isStickerPackInstalled(set.set.id); + pack.featured = false; + pack.expanded = true; + emojipacksProcessed.add(pack); + installedEmojipacks.remove(i--); + } + } + } + for (int i = 0; i < installedEmojipacks.size(); ++i) { + TLRPC.TL_messages_stickerSet set = installedEmojipacks.get(i); + if (isPremium) { + EmojiPack pack = new EmojiPack(); + pack.index = index++; + pack.set = set.set; + pack.documents = set.documents; + pack.free = false; + pack.installed = mediaDataController.isStickerPackInstalled(set.set.id); + pack.featured = false; + pack.expanded = true; + emojipacksProcessed.add(pack); + } else { + ArrayList freeEmojis = new ArrayList<>(); + ArrayList premiumEmojis = new ArrayList<>(); + if (set != null && set.documents != null) { + for (int j = 0; j < set.documents.size(); ++j) { + if (MessageObject.isFreeEmoji(set.documents.get(j))) { + freeEmojis.add(set.documents.get(j)); + } else { + premiumEmojis.add(set.documents.get(j)); + } + } + } + if (freeEmojis.size() > 0) { + EmojiPack pack = new EmojiPack(); + pack.index = index++; + pack.set = set.set; + pack.documents = new ArrayList<>(freeEmojis); + pack.free = true; + pack.installed = mediaDataController.isStickerPackInstalled(set.set.id); + pack.featured = false; + pack.expanded = true; + emojipacksProcessed.add(pack); + } + if (premiumEmojis.size() > 0) { + EmojiPack pack = new EmojiPack(); + pack.index = index++; + pack.set = set.set; + pack.documents = new ArrayList<>(premiumEmojis); + pack.free = false; + pack.installed = mediaDataController.isStickerPackInstalled(set.set.id); + pack.featured = false; + pack.expanded = expandedEmojiSets.contains(pack.set.id); + emojipacksProcessed.add(pack); + } + } + } + for (int i = 0; i < featuredEmojiSets.size(); ++i) { + TLRPC.StickerSetCovered set = featuredEmojiSets.get(i); +// if (!isPremium && !MessageObject.isPremiumEmojiPack(set) && mediaDataController.isStickerPackInstalled(set.set.id)) { +// continue; +// } + EmojiPack pack = new EmojiPack(); + + pack.installed = mediaDataController.isStickerPackInstalled(set.set.id); + pack.set = set.set; + pack.documents = set instanceof TLRPC.TL_stickerSetFullCovered ? ((TLRPC.TL_stickerSetFullCovered) set).documents : set.covers; + pack.index = index++; + boolean premium = false; + for (int j = 0; j < pack.documents.size(); ++j) { + if (!MessageObject.isFreeEmoji(pack.documents.get(j))) { + premium = true; + break; + } + } + pack.free = !premium; + pack.expanded = expandedEmojiSets.contains(pack.set.id); + pack.featured = true; + emojipacksProcessed.add(pack); + } + + if (emojiTabs != null) { + emojiTabs.updateEmojiPacks(); + } + } + + public void expand(int position, View expandButton) { + int index = positionToExpand.get(position); + if (index < 0 || index >= emojipacksProcessed.size()) { + return; + } + EmojiPack pack = emojipacksProcessed.get(index); + if (pack.expanded) { + return; + } + final boolean last = index + 1 == emojipacksProcessed.size(); + + int start = packStartPosition.get(index); + expandedEmojiSets.add(pack.set.id); + + boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + int maxlen = emojiLayoutManager.getSpanCount() * 3; + int fromCount = ((pack.installed && !pack.featured) && (pack.free || isPremium) || pack.expanded ? pack.documents.size() : Math.min(maxlen, pack.documents.size())); + Integer from = null, count = null; + if (pack.documents.size() > maxlen) { + from = start + 1 + fromCount; + } + pack.expanded = true; + int toCount = pack.documents.size(); + if (toCount - fromCount > 0) { + from = start + 1 + fromCount; + count = toCount - fromCount; + } + + processEmoji(); + updateRows(); + + if (from != null && count != null) { + animateExpandFromButton = expandButton; + animateExpandFromPosition = from; + animateExpandToPosition = from + count; + animateExpandStartTime = SystemClock.elapsedRealtime(); +// notifyItemChanged(from - 1); +// notifyItemRangeInserted(from, count); + notifyItemRangeInserted(from, count); + notifyItemChanged(from); + + if (last) { + final int scrollTo = from; + final float durationMultiplier = count > maxlen / 2 ? 1.5f : 4f; + post(() -> { + try { + LinearSmoothScrollerCustom linearSmoothScroller = new LinearSmoothScrollerCustom(emojiGridView.getContext(), LinearSmoothScrollerCustom.POSITION_MIDDLE, durationMultiplier); + linearSmoothScroller.setTargetPosition(scrollTo); + emojiLayoutManager.startSmoothScroll(linearSmoothScroller); + } catch (Exception e) { + FileLog.e(e); + } + }); + } + } + } + + public void updateRows() { + positionToSection.clear(); + sectionToPosition.clear(); + positionToUnlock.clear(); + positionToExpand.clear(); + packStartPosition.clear(); + rowHashCodes.clear(); + itemCount = 0; + if (needEmojiSearch) { + itemCount++; + rowHashCodes.add(-1); + } +// if (featuredEmojiSets.size() > 0) { +// trendingHeaderRow = itemCount++; +// trendingRow = itemCount++; +// } else { +// trendingHeaderRow = -1; +// trendingRow = -1; +// } + ArrayList recent = getRecentEmoji(); + if (emojiTabs != null) { + emojiTabs.showRecent(!recent.isEmpty()); + } + itemCount += recent.size(); + for (int i = 0; i < recent.size(); ++i) { + rowHashCodes.add(Objects.hash(-43263, recent.get(i))); + } + int k = 0; + for (int a = 0; a < EmojiData.dataColored.length; ++a, ++k) { + positionToSection.put(itemCount, k); + sectionToPosition.put(k, itemCount); + itemCount += EmojiData.dataColored[a].length + 1; + rowHashCodes.add(Objects.hash(43245, a)); + for (int i = 0; i < EmojiData.dataColored[a].length; ++i) { + rowHashCodes.add(EmojiData.dataColored[a][i].hashCode()); + } + } + + boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + int maxlen = emojiLayoutManager.getSpanCount() * 3; + plainEmojisCount = itemCount; + firstTrendingRow = -1; + + if (emojipacksProcessed != null) { + for (int b = 0; b < emojipacksProcessed.size(); ++b, ++k) { + positionToSection.put(itemCount, k); + sectionToPosition.put(k, itemCount); + packStartPosition.add(itemCount); + + EmojiPack pack = emojipacksProcessed.get(b); + if (pack.featured && firstTrendingRow < 0) { + firstTrendingRow = itemCount; + } + int count = 1 + ((pack.installed && !pack.featured) && (pack.free || isPremium) || pack.expanded ? pack.documents.size() : Math.min(maxlen, pack.documents.size())); + if (!pack.expanded && pack.documents.size() > maxlen) { + count--; + } + rowHashCodes.add(Objects.hash(pack.featured ? 56345 : -645231, (pack.set == null ? b : pack.set.id))); + for (int i = 1; i < count; ++i) { + rowHashCodes.add(Objects.hash(pack.featured ? 3442 : 3213, pack.documents.get(i - 1).id)); + } + itemCount += count; + if (!pack.expanded && pack.documents.size() > maxlen) { + positionToExpand.put(itemCount, b); + rowHashCodes.add(Objects.hash(-65174, pack.set.id)); + itemCount++; + } +// if (!pack.installed) { +// positionToUnlock.put(itemCount, b); +// itemCount++; +// rowHashCodes.add(Objects.hash(7, pack.set.id)); +// } + } } - return 0; } @Override public void notifyDataSetChanged() { - positionToSection.clear(); - itemCount = Emoji.recentEmoji.size() + (needEmojiSearch ? 1 : 0); - for (int a = 0; a < EmojiData.dataColored.length; a++) { - positionToSection.put(itemCount, a); - sectionToPosition.put(a, itemCount); - itemCount += EmojiData.dataColored[a].length + 1; + ArrayList prevRowHashCodes = new ArrayList<>(rowHashCodes); + + final MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + ArrayList featured = mediaDataController.getFeaturedEmojiSets(); + featuredEmojiSets.clear(); + for (int a = 0, N = featured.size(); a < N; a++) { + TLRPC.StickerSetCovered set = featured.get(a); + if (!mediaDataController.isStickerPackInstalled(set.set.id) || installedEmojiSets.contains(set.set.id)) { + featuredEmojiSets.add(set); + } } - updateEmojiTabs(); - super.notifyDataSetChanged(); + + processEmoji(); + updateRows(); + if (trendingEmojiAdapter != null) { + trendingEmojiAdapter.notifyDataSetChanged(); + } +// super.notifyDataSetChanged(); + + DiffUtil.calculateDiff(new DiffUtil.Callback() { + @Override + public int getOldListSize() { + return prevRowHashCodes.size(); + } + + @Override + public int getNewListSize() { + return rowHashCodes.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + return prevRowHashCodes.get(oldItemPosition).equals(rowHashCodes.get(newItemPosition)); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return true; + } + }, false).dispatchUpdatesTo(this); } } + public ArrayList getEmojipacks() { + ArrayList packs = new ArrayList<>(); + for (int i = 0; i < emojipacksProcessed.size(); ++i) { + EmojiPack pack = emojipacksProcessed.get(i); + if (!pack.featured && (pack.installed || installedEmojiSets.contains(pack.set.id)) || pack.featured && !(pack.installed || installedEmojiSets.contains(pack.set.id))) { + packs.add(pack); + } + } + return packs; + } + private class EmojiSearchAdapter extends RecyclerListView.SelectionAdapter { private ArrayList result = new ArrayList<>(); @@ -4717,7 +6794,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific @Override public int getItemCount() { if (result.isEmpty() && !searchWas) { - return Emoji.recentEmoji.size() + 1; + return getRecentEmoji().size() + 1; } if (!result.isEmpty()) { return result.size() + 1; @@ -4858,20 +6935,44 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific switch (holder.getItemViewType()) { case 0: { ImageViewEmoji imageView = (ImageViewEmoji) holder.itemView; + imageView.pack = null; String code; String coloredCode; boolean recent; position--; + Long customEmojiId = null; if (result.isEmpty() && !searchWas) { - coloredCode = code = Emoji.recentEmoji.get(position); + coloredCode = code = getRecentEmoji().get(position); recent = true; } else { coloredCode = code = result.get(position).emoji; recent = false; } - imageView.setImageDrawable(Emoji.getEmojiBigDrawable(coloredCode), recent); + + if (code != null && code.startsWith("animated_")) { + try { + customEmojiId = Long.parseLong(code.substring(9)); + code = null; + coloredCode = null; + } catch (Exception ignore) {} + } + + if (customEmojiId != null) { + imageView.setPadding(AndroidUtilities.dp(3), AndroidUtilities.dp(3), AndroidUtilities.dp(3), AndroidUtilities.dp(3)); + } else { + imageView.setPadding(0, 0, 0, 0); + } + if (customEmojiId != null) { + imageView.setImageDrawable(null, recent); + if (imageView.getSpan() == null || imageView.getSpan().getDocumentId() != customEmojiId) { + imageView.setSpan(new AnimatedEmojiSpan(customEmojiId, null)); + } + } else { + imageView.setImageDrawable(Emoji.getEmojiBigDrawable(coloredCode), recent); + imageView.setSpan(null); + } imageView.setTag(code); break; } @@ -4927,7 +7028,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific notifyDataSetChanged(); } } - }); + }, true); } }, 300); } @@ -4937,7 +7038,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private class EmojiPagesAdapter extends PagerAdapter implements PagerSlidingTabStrip.IconTabProvider { public void destroyItem(ViewGroup viewGroup, int position, Object object) { - viewGroup.removeView(views.get(position)); + viewGroup.removeView((View) object); } @Override @@ -4950,7 +7051,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } public int getCount() { - return views.size(); + return currentTabs.size(); } public Drawable getPageIconDrawable(int position) { @@ -4979,7 +7080,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } public Object instantiateItem(ViewGroup viewGroup, int position) { - View view = views.get(position); + View view = currentTabs.get(position).view; viewGroup.addView(view); return view; } @@ -5233,11 +7334,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific lastSearchImageString = text.toLowerCase(); } if (!TextUtils.isEmpty(lastSearchImageString)) { - AndroidUtilities.runOnUIThread(searchRunnable = new Runnable() { - @Override - public void run() { - search(text, "", true); - } + AndroidUtilities.runOnUIThread(searchRunnable = () -> { + search(text, "", true); }, 300); } } @@ -5708,7 +7806,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific notifyDataSetChanged(); } } - }); + }, false); } ArrayList local = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_IMAGE); MessagesController.getInstance(currentAccount).filterPremiumStickers(local); @@ -6194,4 +8292,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific public abstract boolean isShown(); } + + private class Tab { + int type; + View view; + } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java index c5e5bcfcb..ea2c782a9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java @@ -70,6 +70,16 @@ public class FilterTabsView extends FrameLayout { return positionToStableId.get(selectedType, -1); } + public void selectTabWithStableId(int stableId) { + for (int i = 0; i < tabs.size(); i++) { + if (positionToStableId.get(i, -1) == stableId) { + currentPosition = i; + selectedTabId = positionToId.get(i); + break; + } + } + } + public interface FilterTabsViewDelegate { void onPageSelected(Tab tab, boolean forward); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/HintView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/HintView.java index 53d236ff6..cd475b0fa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/HintView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/HintView.java @@ -434,6 +434,10 @@ public class HintView extends FrameLayout { } public void hide() { + hide(true); + } + + public void hide(boolean animate) { if (getTag() == null) { return; } @@ -446,21 +450,28 @@ public class HintView extends FrameLayout { animatorSet.cancel(); animatorSet = null; } - animatorSet = new AnimatorSet(); - animatorSet.playTogether( - ObjectAnimator.ofFloat(this, View.ALPHA, 0.0f) - ); - animatorSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - setVisibility(View.INVISIBLE); - currentView = null; - messageCell = null; - animatorSet = null; - } - }); - animatorSet.setDuration(300); - animatorSet.start(); + if (animate) { + animatorSet = new AnimatorSet(); + animatorSet.playTogether( + ObjectAnimator.ofFloat(this, View.ALPHA, 0.0f) + ); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setVisibility(View.INVISIBLE); + currentView = null; + messageCell = null; + animatorSet = null; + } + }); + animatorSet.setDuration(300); + animatorSet.start(); + } else { + setVisibility(View.INVISIBLE); + currentView = null; + messageCell = null; + animatorSet = null; + } } public void setText(CharSequence text) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java index 81ac54418..ecf21dbd5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java @@ -28,7 +28,7 @@ import androidx.core.content.FileProvider; import androidx.exifinterface.media.ExifInterface; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildConfig; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLoader; @@ -516,7 +516,7 @@ public class ImageUpdater implements NotificationCenter.NotificationCenterDelega File image = AndroidUtilities.generatePicturePath(); if (image != null) { if (Build.VERSION.SDK_INT >= 24) { - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(parentFragment.getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", image)); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(parentFragment.getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", image)); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { @@ -543,7 +543,7 @@ public class ImageUpdater implements NotificationCenter.NotificationCenterDelega File video = AndroidUtilities.generateVideoPath(); if (video != null) { if (Build.VERSION.SDK_INT >= 24) { - takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(parentFragment.getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", video)); + takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(parentFragment.getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", video)); takeVideoIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takeVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else if (Build.VERSION.SDK_INT >= 18) { 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 e39a28dda..a3ec49b61 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java @@ -30,6 +30,7 @@ import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.graphics.SurfaceTexture; import android.graphics.drawable.AnimatedVectorDrawable; +import android.hardware.Camera; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaCodec; @@ -63,6 +64,7 @@ import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.util.Log; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; @@ -157,7 +159,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter private CameraGLThread cameraThread; private Size previewSize; private Size pictureSize; - private Size aspectRatio = SharedConfig.roundCamera16to9 ? new Size(1, 1) : new Size(4, 3); + private Size aspectRatio = SharedConfig.roundCamera16to9 ? new Size(16, 9) : new Size(4, 3); private TextureView textureView; private BackupImageView textureOverlayView; private CameraSession cameraSession; @@ -1015,10 +1017,34 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter cameraThread.setCurrentSession(cameraSession); CameraController.getInstance().openRound(cameraSession, surfaceTexture, () -> { if (cameraSession != null) { + boolean updateScale = false; + try { + Camera.Size size = cameraSession.getCurrentPreviewSize(); + if (size.width != previewSize.getWidth() || size.height != previewSize.getHeight()) { + previewSize = new Size(size.width, size.height); + FileLog.d("change preview size to w = " + previewSize.getWidth() + " h = " + previewSize.getHeight()); + } + } catch (Exception e) { + FileLog.e(e); + } + + try { + Camera.Size size = cameraSession.getCurrentPictureSize(); + if (size.width != pictureSize.getWidth() || size.height != pictureSize.getHeight()) { + pictureSize = new Size(size.width, size.height); + FileLog.d("change picture size to w = " + pictureSize.getWidth() + " h = " + pictureSize.getHeight()); + updateScale = true; + } + } catch (Exception e) { + FileLog.e(e); + } if (BuildVars.LOGS_ENABLED) { FileLog.d("camera initied"); } cameraSession.setInitied(); + if (updateScale) { + cameraThread.reinitForNewCamera(); + } } }, () -> cameraThread.setCurrentSession(cameraSession)); }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/JoinToSendSettingsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/JoinToSendSettingsView.java index 5e7c07448..ce4592f56 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/JoinToSendSettingsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/JoinToSendSettingsView.java @@ -149,6 +149,16 @@ public class JoinToSendSettingsView extends LinearLayout { requestLayout(); } + public void showJoinToSend(boolean show) { + joinToSendCell.setVisibility(show ? View.VISIBLE : View.GONE); + if (!show) { + isJoinToSend = true; + joinRequestCell.setVisibility(View.VISIBLE); + updateToggleValue(1); + } + requestLayout(); + } + public void setJoinRequest(boolean newJoinRequest) { isJoinRequest = newJoinRequest; joinRequestCell.setChecked(newJoinRequest); @@ -184,7 +194,9 @@ public class JoinToSendSettingsView extends LinearLayout { protected void onLayout(boolean changed, int l, int t, int r, int b) { int y = 0; joinHeaderCell.layout(0, y, r - l, y += joinHeaderCell.getMeasuredHeight()); - joinToSendCell.layout(0, y, r - l, y += joinToSendCell.getMeasuredHeight()); + if (joinToSendCell.getVisibility() == View.VISIBLE) { + joinToSendCell.layout(0, y, r - l, y += joinToSendCell.getMeasuredHeight()); + } joinRequestCell.layout(0, y, r - l, y += joinRequestCell.getMeasuredHeight()); joinToSendInfoCell.layout(0, y, r - l, y + joinToSendInfoCell.getMeasuredHeight()); joinRequestInfoCell.layout(0, y, r - l, y + joinRequestInfoCell.getMeasuredHeight()); @@ -194,10 +206,12 @@ public class JoinToSendSettingsView extends LinearLayout { private int calcHeight() { return (int) ( - joinHeaderCell.getMeasuredHeight() + - joinToSendCell.getMeasuredHeight() + - joinRequestCell.getMeasuredHeight() * toggleValue + - AndroidUtilities.lerp(joinToSendInfoCell.getMeasuredHeight(), joinRequestInfoCell.getMeasuredHeight(), toggleValue) + joinHeaderCell.getMeasuredHeight() + + (joinToSendCell.getVisibility() == View.VISIBLE ? + joinToSendCell.getMeasuredHeight() + joinRequestCell.getMeasuredHeight() * toggleValue : + joinRequestCell.getMeasuredHeight() + ) + + AndroidUtilities.lerp(joinToSendInfoCell.getMeasuredHeight(), joinRequestInfoCell.getMeasuredHeight(), toggleValue) ); } @@ -208,11 +222,6 @@ public class JoinToSendSettingsView extends LinearLayout { joinRequestCell.measure(widthMeasureSpec, MAXSPEC); joinToSendInfoCell.measure(widthMeasureSpec, MAXSPEC); joinRequestInfoCell.measure(widthMeasureSpec, MAXSPEC); - super.onMeasure(widthMeasureSpec, - MeasureSpec.makeMeasureSpec( - calcHeight(), - MeasureSpec.EXACTLY - ) - ); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(calcHeight(), MeasureSpec.EXACTLY)); } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/RecyclerListViewWithOverlayDraw.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/RecyclerListViewWithOverlayDraw.java new file mode 100644 index 000000000..b5e25092a --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/RecyclerListViewWithOverlayDraw.java @@ -0,0 +1,45 @@ +package org.telegram.ui.Components.ListView; + +import android.content.Context; +import android.graphics.Canvas; +import android.view.View; + +import org.telegram.ui.Components.RecyclerListView; + +public class RecyclerListViewWithOverlayDraw extends RecyclerListView { + + boolean invalidated; + public RecyclerListViewWithOverlayDraw(Context context) { + super(context); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + invalidated = false; + for (int i = 0; i < getChildCount(); i++) { + if (getChildAt(i) instanceof OverlayView) { + OverlayView view = (OverlayView) getChildAt(i); + canvas.save(); + canvas.translate(view.getX(), view.getY()); + view.preDraw(this, canvas); + canvas.restore(); + } + } + super.dispatchDraw(canvas); + } + + @Override + public void invalidate() { + if (invalidated) { + return; + } + super.invalidate(); + invalidated = true; + } + + public interface OverlayView { + void preDraw(View view, Canvas canvas); + float getX(); + float getY(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java index 2fc121425..2f480e29a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java @@ -452,7 +452,7 @@ public class MentionsContainerView extends BlurredFrameLayout { } } else { int account = UserConfig.selectedAccount; - animationIndex = NotificationCenter.getInstance(account).setAnimationInProgress(animationIndex, null); +// animationIndex = NotificationCenter.getInstance(account).setAnimationInProgress(animationIndex, null); listViewTranslationAnimator = new SpringAnimation(new FloatValueHolder(fromTranslation)) .setSpring( @@ -481,7 +481,7 @@ public class MentionsContainerView extends BlurredFrameLayout { }); } listViewTranslationAnimator.addEndListener((animation, canceled, value, velocity) -> { - NotificationCenter.getInstance(account).onAnimationFinish(animationIndex); +// `NotificationCenter.`getInstance(account).onAnimationFinish(animationIndex); }); listViewTranslationAnimator.start(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java new file mode 100644 index 000000000..26adeeb72 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java @@ -0,0 +1,439 @@ +package org.telegram.ui.Components; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.CornerPathEffect; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.drawable.Drawable; +import android.os.SystemClock; +import android.text.Layout; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.style.CharacterStyle; +import android.text.style.ReplacementSpan; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +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.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; + +import java.util.ArrayList; + +public class MessageContainsEmojiButton extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { + + private int currentAccount; + private Theme.ResourcesProvider resourcesProvider; + private TLRPC.InputStickerSet inputStickerSet; + + private Rect emojiDrawableBounds = new Rect(); + private AnimatedEmojiDrawable emojiDrawable; + + private boolean loadingDrawableBoundsSet = false; + private LoadingDrawable loadingDrawable; + + private TextPaint textPaint; + + private CharSequence mainText; + private StaticLayout mainTextLayout; + + private CharSequence endText; + private CharSequence secondPartText; + private StaticLayout secondPartTextLayout; + + private class BoldAndAccent extends CharacterStyle { + @Override + public void updateDrawState(TextPaint textPaint) { + textPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + int wasAlpha = textPaint.getAlpha(); + textPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText, resourcesProvider)); + textPaint.setAlpha(wasAlpha); + } + } + + public MessageContainsEmojiButton(int currentAccount, Context context, Theme.ResourcesProvider resourcesProvider, @NonNull ArrayList inputStickerSets) { + super(context); + this.currentAccount = currentAccount; + + setBackground(Theme.createRadSelectorDrawable(Theme.getColor(Theme.key_listSelector, resourcesProvider), 0, 6)); + + textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + textPaint.setTextSize(AndroidUtilities.dp(13)); + textPaint.setColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem, resourcesProvider)); + + if (inputStickerSets.size() > 1) { + mainText = AndroidUtilities.replaceTags(LocaleController.formatPluralString("MessageContainsEmojiPacks", inputStickerSets.size())); + Spannable spannable = (Spannable) mainText; + TypefaceSpan[] bold = spannable.getSpans(0, mainText.length(), TypefaceSpan.class); + for (int i = 0; bold != null && i < bold.length; ++i) { + int start = spannable.getSpanStart(bold[i]); + int end = spannable.getSpanEnd(bold[i]); + spannable.removeSpan(bold[i]); + spannable.setSpan(new BoldAndAccent(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } else if (inputStickerSets.size() == 1) { + String string = LocaleController.getString("MessageContainsEmojiPack", R.string.MessageContainsEmojiPack); + String[] parts = string.split("%s"); + if (parts.length <= 1) { + mainText = string; + } else { + String stickerPackName = null; + TLRPC.Document document = null; + inputStickerSet = inputStickerSets.get(0); + if (inputStickerSet != null) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSet, false); + if (stickerSet != null && stickerSet.set != null) { + stickerPackName = stickerSet.set.title; + for (int i = 0; stickerSet.documents != null && i < stickerSet.documents.size(); ++i) { + if (stickerSet.documents.get(i).id == stickerSet.set.thumb_document_id) { + document = stickerSet.documents.get(i); + break; + } + } + if (document == null && stickerSet.documents != null && stickerSet.documents.size() > 0) { + document = stickerSet.documents.get(0); + } + } + } + if (stickerPackName != null && document != null) { + SpannableString emoji = new SpannableString(MessageObject.findAnimatedEmojiEmoticon(document)); + emoji.setSpan(new AnimatedEmojiSpan(document, textPaint.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) { + emojiDrawableBounds.set((int) x, (bottom + top - measuredSize) / 2, (int) (x + measuredSize), (bottom + top + measuredSize) / 2); + } + }, 0, emoji.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + emojiDrawable = AnimatedEmojiDrawable.make(currentAccount, AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, document); + emojiDrawable.addView(this); + + SpannableString stickerPack = new SpannableString(stickerPackName); + stickerPack.setSpan(new BoldAndAccent(), 0, stickerPack.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + mainText = + new SpannableStringBuilder() + .append(parts[0]) + .append(emoji) + .append(' ') + .append(stickerPack) + .append(parts[1]); + loadT = 1f; + inputStickerSet = null; + } else { + mainText = parts[0]; + endText = parts[1]; + loadingDrawable = new LoadingDrawable(resourcesProvider); + loadingDrawable.paint.setPathEffect(new CornerPathEffect(AndroidUtilities.dp(4))); + } + } + } + } + + private int lastLineMargin; + private int lastLineTop, lastLineHeight; + + private int lastMainTextWidth; + private CharSequence lastMainTextText; + private int lastSecondPartTextWidth; + private CharSequence lastSecondPartText; + private int updateLayout(int width, boolean full) { + if (mainText != lastMainTextText || lastMainTextWidth != width) { + if (mainText != null) { + mainTextLayout = new StaticLayout(mainText, 0, mainText.length(), textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false); + if (loadingDrawable != null && loadingBoundsTo == null) { + int lastLine = mainTextLayout.getLineCount() - 1; + lastLineMargin = (int) mainTextLayout.getPrimaryHorizontal(mainText.length()) + AndroidUtilities.dp(2); + lastLineTop = mainTextLayout.getLineTop(lastLine); + float bottom = mainTextLayout.getLineBottom(lastLine); + lastLineHeight = (int) bottom - lastLineTop; + float lwidth = Math.min(AndroidUtilities.dp(100), mainTextLayout.getWidth() - lastLineMargin); + if (loadingBoundsFrom == null) { + loadingBoundsFrom = new Rect(); + } + loadingBoundsFrom.set(lastLineMargin, lastLineTop + AndroidUtilities.dp(1.25f), (int) (lastLineMargin + lwidth), (int) bottom + AndroidUtilities.dp(1.25f)); + loadingDrawable.setBounds(loadingBoundsFrom); + loadingDrawableBoundsSet = true; + } + } else { + mainTextLayout = null; + loadingDrawableBoundsSet = false; + } + lastMainTextText = mainText; + lastMainTextWidth = width; + } + + if (secondPartText != lastSecondPartText || lastSecondPartTextWidth != width) { + if (secondPartText != null) { + secondPartTextLayout = new StaticLayout(secondPartText, 0, secondPartText.length(), textPaint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false); + } else { + secondPartTextLayout = null; + } + lastSecondPartText = secondPartText; + lastSecondPartTextWidth = width; + } + + return (mainTextLayout == null ? 0 : mainTextLayout.getHeight()) + (int) (secondPartTextLayout != null ? (secondPartTextLayout.getHeight() - lastLineHeight) * (full ? 1 : loadT) : 0); + } + + private int lastWidth = -1; + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setPadding(AndroidUtilities.dp(13), AndroidUtilities.dp(8), AndroidUtilities.dp(13), AndroidUtilities.dp(8)); + int width = MeasureSpec.getSize(widthMeasureSpec); + if (lastWidth > 0) { + width = Math.min(width, lastWidth); + } + lastWidth = width; + int contentWidth = width - getPaddingLeft() - getPaddingRight(); + int contentHeight = updateLayout(contentWidth, false); + int height = contentHeight + getPaddingTop() + getPaddingBottom(); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mainTextLayout != null) { + canvas.save(); + canvas.translate(getPaddingLeft(), getPaddingTop()); + textPaint.setAlpha(255); + mainTextLayout.draw(canvas); + if (loadingDrawable != null && loadingDrawableBoundsSet) { + loadingDrawable.setAlpha((int) (255 * (1f - loadT))); + if (loadingBoundsFrom != null && loadingBoundsTo != null) { + AndroidUtilities.lerp(loadingBoundsFrom, loadingBoundsTo, loadT, AndroidUtilities.rectTmp2); + loadingDrawable.setBounds(AndroidUtilities.rectTmp2); + } + loadingDrawable.draw(canvas); + invalidate(); + } + if (secondPartTextLayout != null) { + canvas.save(); + canvas.translate(0, lastLineTop); + textPaint.setAlpha((int) (255 * loadT)); + secondPartTextLayout.draw(canvas); + canvas.restore(); + } + if (emojiDrawable != null) { + emojiDrawable.setAlpha((int) (255 * loadT)); + emojiDrawable.setBounds(emojiDrawableBounds); + emojiDrawable.draw(canvas); + } + canvas.restore(); + } + } + + private ValueAnimator loadAnimator; + private float loadT = 0; + private Rect loadingBoundsFrom; + private Rect loadingBoundsTo; + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.groupStickersDidLoad) { + if (inputStickerSet != null) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSet, false); + if (stickerSet == null) { + return; + } + String stickerPackName = null; + TLRPC.Document document = null; + if (stickerSet.set != null) { + stickerPackName = stickerSet.set.title; + for (int i = 0; stickerSet.documents != null && i < stickerSet.documents.size(); ++i) { + if (stickerSet.documents.get(i).id == stickerSet.set.thumb_document_id) { + document = stickerSet.documents.get(i); + break; + } + } + if (document == null && stickerSet.documents != null && stickerSet.documents.size() > 0) { + document = stickerSet.documents.get(0); + } + } + if (stickerPackName == null || document == null) { + return; + } + + emojiDrawable = AnimatedEmojiDrawable.make(currentAccount, AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, document); + emojiDrawable.addView(this); + invalidate(); + + SpannableString margin = new SpannableString(" "); + margin.setSpan(new ReplacementSpan() { + @Override + public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) { + return lastLineMargin; + } + @Override + public void draw(@NonNull Canvas canvas, CharSequence charSequence, int i, int i1, float v, int i2, int i3, int i4, @NonNull Paint paint) {} + }, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + SpannableString emoji = new SpannableString(MessageObject.findAnimatedEmojiEmoticon(document)); + emoji.setSpan(new AnimatedEmojiSpan(document, textPaint.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) { + emojiDrawableBounds.set((int) x, lastLineTop + (bottom + top - measuredSize) / 2, (int) (x + measuredSize), lastLineTop + (bottom + top + measuredSize) / 2); + } + }, 0, emoji.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + SpannableString stickerPack = new SpannableString(stickerPackName); + stickerPack.setSpan(new BoldAndAccent(), 0, stickerPack.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + secondPartText = + new SpannableStringBuilder() + .append(margin) + .append(emoji) + .append(' ') + .append(stickerPack) + .append(endText); + int oldHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); + int newHeight = updateLayout(lastWidth - getPaddingLeft() - getPaddingRight(), true); + if (loadingBoundsFrom != null && secondPartTextLayout != null) { + if (loadingBoundsTo == null) { + loadingBoundsTo = new Rect(); + } + float end = secondPartTextLayout.getPrimaryHorizontal(secondPartTextLayout.getLineEnd(0)); + loadingBoundsTo.set(loadingBoundsFrom.left, loadingBoundsFrom.top, (int) end, loadingBoundsFrom.bottom); + } + inputStickerSet = null; + + if (loadAnimator != null) { + loadAnimator.cancel(); + } + boolean remeasure = Math.abs(oldHeight - newHeight) > AndroidUtilities.dp(3); + loadAnimator = ValueAnimator.ofFloat(loadT, 1f); + loadAnimator.addUpdateListener(a -> { + loadT = (float) a.getAnimatedValue(); + invalidate(); + if (remeasure) { + requestLayout(); + } + }); + loadAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + loadAnimator.setStartDelay(150); + loadAnimator.setDuration(400); + loadAnimator.start(); + } + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (emojiDrawable != null) { + emojiDrawable.removeView(this); + } + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.groupStickersDidLoad); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); + } +} + +class LoadingDrawable extends Drawable { + + private Theme.ResourcesProvider resourcesProvider; + public LoadingDrawable(Theme.ResourcesProvider resourcesProvider) { + this.resourcesProvider = resourcesProvider; + } + + private long start = -1; + private LinearGradient gradient; + private int gradientColor1, gradientColor2; + private int gradientWidth; + + public Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Path path = new Path(); + private RectF[] rects; + + private void setPathRects(RectF[] rects) { + this.rects = rects; + } + + @Override + public void draw(@NonNull Canvas canvas) { + Rect bounds = getBounds(); + if (getPaintAlpha() <= 0) { + return; + } + int gwidth = Math.min(AndroidUtilities.dp(400), bounds.width()); + int color1 = Theme.getColor(Theme.key_dialogBackground, resourcesProvider); + int color2 = Theme.getColor(Theme.key_dialogBackgroundGray, resourcesProvider); + if (gradient == null || gwidth != gradientWidth || color1 != gradientColor1 || color2 != gradientColor2) { + gradientWidth = gwidth; + gradientColor1 = color1; + gradientColor2 = color2; + gradient = new LinearGradient(0, 0, gradientWidth, 0, new int[] { gradientColor1, gradientColor2, gradientColor1 }, new float[] { 0f, .67f, 1f }, Shader.TileMode.REPEAT); + paint.setShader(gradient); + } + + long now = SystemClock.elapsedRealtime(); + if (start < 0) { + start = now; + } + float offset = gradientWidth - (((now - start) / 1000f * gradientWidth) % gradientWidth); + + canvas.save(); + canvas.clipRect(bounds); + canvas.translate(-offset, 0); + path.reset(); + if (rects == null) { + path.addRect(bounds.left + offset, bounds.top, bounds.right + offset, bounds.bottom, Path.Direction.CW); + } else { + for (int i = 0; i < rects.length; ++i) { + RectF r = rects[i]; + if (r != null) { + path.addRect(r.left + offset, r.top, r.right + offset, r.bottom, Path.Direction.CW); + } + } + } + canvas.drawPath(path, paint); + canvas.translate(offset, 0); + canvas.restore(); + + invalidateSelf(); + } + + public int getPaintAlpha() { + return paint.getAlpha(); + } + + @Override + public void setAlpha(int i) { + paint.setAlpha(i); + if (i > 0) { + invalidateSelf(); + } + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + paint.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java index 2eeb27703..e1d7ed532 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java @@ -14,9 +14,6 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.drawable.Drawable; -import androidx.viewpager.widget.ViewPager; -import androidx.viewpager.widget.ViewPager.OnPageChangeListener; - import android.graphics.drawable.RippleDrawable; import android.os.Build; import android.view.View; @@ -27,6 +24,9 @@ import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; +import androidx.viewpager.widget.ViewPager; +import androidx.viewpager.widget.ViewPager.OnPageChangeListener; + import org.telegram.messenger.AndroidUtilities; import org.telegram.ui.ActionBar.Theme; @@ -147,7 +147,7 @@ public class PagerSlidingTabStrip extends HorizontalScrollView { }; tab.setFocusable(true); if (Build.VERSION.SDK_INT >= 21) { - RippleDrawable rippleDrawable = (RippleDrawable) Theme.createSelectorDrawable(getThemedColor(Theme.key_chat_emojiBottomPanelIcon)); + RippleDrawable rippleDrawable = (RippleDrawable) Theme.createSelectorDrawable(getThemedColor(Theme.key_chat_emojiBottomPanelIcon), Theme.RIPPLE_MASK_CIRCLE_20DP, AndroidUtilities.dp(18)); Theme.setRippleDrawableForceSoftware(rippleDrawable); tab.setBackground(rippleDrawable); } @@ -193,7 +193,11 @@ public class PagerSlidingTabStrip extends HorizontalScrollView { if (tabCount == 0) { return; } - int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset; + View child = tabsContainer.getChildAt(position); + if (child == null) { + return; + } + int newScrollX = child.getLeft() + offset; if (position > 0 || offset > 0) { newScrollX -= scrollOffset; } @@ -219,21 +223,23 @@ public class PagerSlidingTabStrip extends HorizontalScrollView { } View currentTab = tabsContainer.getChildAt(currentPosition); - float lineLeft = currentTab.getLeft(); - float lineRight = currentTab.getRight(); + if (currentTab != null) { + float lineLeft = currentTab.getLeft(); + float lineRight = currentTab.getRight(); - if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { - View nextTab = tabsContainer.getChildAt(currentPosition + 1); - final float nextTabLeft = nextTab.getLeft(); - final float nextTabRight = nextTab.getRight(); + if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { + View nextTab = tabsContainer.getChildAt(currentPosition + 1); + final float nextTabLeft = nextTab.getLeft(); + final float nextTabRight = nextTab.getRight(); - lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); - lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); - } + lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); + lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); + } - if (indicatorHeight != 0) { - rectPaint.setColor(indicatorColor); - canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); + if (indicatorHeight != 0) { + rectPaint.setColor(indicatorColor); + canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); + } } } @@ -243,10 +249,13 @@ public class PagerSlidingTabStrip extends HorizontalScrollView { public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { currentPosition = position; currentPositionOffset = positionOffset; - scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); - invalidate(); - if (delegatePageListener != null) { - delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); + View child = tabsContainer.getChildAt(position); + if (child != null) { + scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); + invalidate(); + if (delegatePageListener != null) { + delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java index 5bd23c8cf..a7d6f9185 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java @@ -11,7 +11,10 @@ package org.telegram.ui.Components; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; +import android.app.Activity; +import android.app.Dialog; import android.content.Context; +import android.content.ContextWrapper; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; @@ -21,7 +24,9 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Vibrator; import android.text.Editable; +import android.text.SpannableString; import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; import android.text.TextWatcher; @@ -48,9 +53,16 @@ import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.AdjustPanLayoutHelper; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.FloatingToolbar; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; +import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PhotoViewer; +import org.telegram.ui.PremiumPreviewFragment; public class PhotoViewerCaptionEnterView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate, SizeNotifierFrameLayoutPhoto.SizeNotifierFrameLayoutPhotoDelegate { @@ -196,6 +208,12 @@ public class PhotoViewerCaptionEnterView extends FrameLayout implements Notifica rectangle.bottom += AndroidUtilities.dp(1000); return super.requestRectangleOnScreen(rectangle); } + + @Override + public void setText(CharSequence text, BufferType type) { + super.setText(text, type); + invalidateForce(); + } }; messageEditText.setOnFocusChangeListener((view, focused) -> { if (focused) { @@ -206,7 +224,9 @@ public class PhotoViewerCaptionEnterView extends FrameLayout implements Notifica }); messageEditText.setSelectAllOnFocus(false); - messageEditText.setDelegate(() -> messageEditText.invalidateEffects()); + messageEditText.setDelegate(() -> { + messageEditText.invalidateEffects(); + }); messageEditText.setWindowView(windowView); messageEditText.setHint(LocaleController.getString("AddCaption", R.string.AddCaption)); messageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); @@ -546,10 +566,14 @@ public class PhotoViewerCaptionEnterView extends FrameLayout implements Notifica } private void createEmojiView() { + if (emojiView != null && emojiView.currentAccount != UserConfig.selectedAccount) { + sizeNotifierLayout.removeView(emojiView); + emojiView = null; + } if (emojiView != null) { return; } - emojiView = new EmojiView(false, false, getContext(), false, null, null, null); + emojiView = new EmojiView(null, true, false, false, getContext(), false, null, null, null); emojiView.setDelegate(new EmojiView.EmojiViewDelegate() { @Override public boolean onBackspace() { @@ -560,6 +584,80 @@ public class PhotoViewerCaptionEnterView extends FrameLayout implements Notifica return true; } + @Override + public void onAnimatedEmojiUnlockClick() { + new PremiumFeatureBottomSheet(new BaseFragment() { + @Override + public int getCurrentAccount() { + return currentAccount; + } + + @Override + public Context getContext() { + return PhotoViewerCaptionEnterView.this.getContext(); + } + + @Override + public Activity getParentActivity() { + Context context = getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; + } + context = ((ContextWrapper) context).getBaseContext(); + } + return null; + } + + @Override + public Dialog getVisibleDialog() { + return new Dialog(PhotoViewerCaptionEnterView.this.getContext()) { + @Override + public void dismiss() { + if (getParentActivity() instanceof LaunchActivity && ((LaunchActivity) getParentActivity()).getActionBarLayout() != null) { + parentLayout = ((LaunchActivity) getParentActivity()).getActionBarLayout(); + if (parentLayout != null && parentLayout.getLastFragment() != null && parentLayout.getLastFragment().getVisibleDialog() != null) { + Dialog dialog = parentLayout.getLastFragment().getVisibleDialog(); + if (dialog instanceof ChatAttachAlert) { + ((ChatAttachAlert) dialog).dismiss(true); + } else { + dialog.dismiss(); + } + } + } + PhotoViewer.getInstance().closePhoto(false, false); + } + }; + } + }, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false).show(); + } + + @Override + public void onCustomEmojiSelected(long documentId, TLRPC.Document document, String emoticon) { + int i = messageEditText.getSelectionEnd(); + if (i < 0) { + i = 0; + } + try { + innerTextChange = true; + SpannableString spannable = new SpannableString(emoticon); + AnimatedEmojiSpan span; + if (document != null) { + span = new AnimatedEmojiSpan(document, messageEditText.getPaint().getFontMetricsInt()); + } else { + span = new AnimatedEmojiSpan(documentId, messageEditText.getPaint().getFontMetricsInt()); + } + spannable.setSpan(span, 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + messageEditText.setText(messageEditText.getText().insert(i, spannable)); + int j = i + spannable.length(); + messageEditText.setSelection(j, j); + } catch (Exception e) { + FileLog.e(e); + } finally { + innerTextChange = false; + } + } + @Override public void onEmojiSelected(String symbol) { int i = messageEditText.getSelectionEnd(); @@ -640,9 +738,7 @@ public class PhotoViewerCaptionEnterView extends FrameLayout implements Notifica private void showPopup(int show, boolean animated) { lastShow = show; if (show == 1) { - if (emojiView == null) { - createEmojiView(); - } + createEmojiView(); emojiView.setVisibility(VISIBLE); delegate.onEmojiViewOpen(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java index 589981a04..5d2f07218 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java @@ -86,6 +86,8 @@ public class PipVideoOverlay { private View innerView; private FrameLayout controlsView; + private boolean isWebView; + private ScaleGestureDetector scaleGestureDetector; private GestureDetectorFixDoubleTap gestureDetector; private boolean isScrolling; @@ -968,7 +970,7 @@ public class PipVideoOverlay { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ActivityManager activityManager = (ActivityManager) v.getContext().getSystemService(Context.ACTIVITY_SERVICE); List appProcessInfos = activityManager.getRunningAppProcesses(); - if (!appProcessInfos.isEmpty()) { + if (appProcessInfos != null && !appProcessInfos.isEmpty()) { isResumedByActivityManager = appProcessInfos.get(0).importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; } } @@ -1008,7 +1010,8 @@ public class PipVideoOverlay { } updatePlayButton(); }); - playPauseButton.setVisibility(innerView instanceof WebView ? View.GONE : View.VISIBLE); + isWebView = innerView instanceof WebView; + playPauseButton.setVisibility(isWebView ? View.GONE : View.VISIBLE); controlsView.addView(playPauseButton, LayoutHelper.createFrame(buttonSize, buttonSize, Gravity.CENTER)); videoProgressView = new VideoProgressView(context); @@ -1098,6 +1101,10 @@ public class PipVideoOverlay { protected void onDraw(Canvas canvas) { super.onDraw(canvas); + if (isWebView) { + return; + } + int width = getWidth(); int progressSidePadding = AndroidUtilities.dp(10); 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 new file mode 100644 index 000000000..e67d1bcc9 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java @@ -0,0 +1,558 @@ +package org.telegram.ui.Components.Premium; + +import android.annotation.SuppressLint; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Bundle; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextPaint; +import android.text.style.ClickableSpan; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.billingclient.api.BillingClient; +import com.android.billingclient.api.BillingFlowParams; +import com.android.billingclient.api.ProductDetails; +import com.android.billingclient.api.QueryProductDetailsParams; + +import org.telegram.messenger.AccountInstance; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BillingController; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.browser.Browser; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBarLayout; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.BottomSheetWithRecyclerListView; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PremiumPreviewFragment; +import org.telegram.ui.ProfileActivity; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +public class GiftPremiumBottomSheet extends BottomSheetWithRecyclerListView { + private PremiumGradient.GradientTools gradientTools; + private PremiumGradient.GradientTools outlineGradient; + private PremiumButtonView premiumButtonView; + private PremiumGiftTierCell dummyCell; + + private List giftTiers = new ArrayList<>(); + private int selectedTierIndex = 0; + + private int totalGradientHeight; + + private int rowsCount; + private int headerRow; + private int tiersStartRow; + private int tiersEndRow; + private int footerRow; + private int buttonRow; + + private TLRPC.User user; + + @SuppressLint("NotifyDataSetChanged") + public GiftPremiumBottomSheet(BaseFragment fragment, TLRPC.User user) { + super(fragment, false, true); + this.user = user; + + gradientTools = new PremiumGradient.GradientTools(Theme.key_premiumGradient1, Theme.key_premiumGradient2, null, null); + gradientTools.exactly = true; + gradientTools.x1 = 0; + gradientTools.y1 = 0f; + gradientTools.x2 = 0; + gradientTools.y2 = 1f; + gradientTools.cx = 0; + gradientTools.cy = 0; + + outlineGradient = new PremiumGradient.GradientTools(Theme.key_premiumGradient1, Theme.key_premiumGradient2, Theme.key_premiumGradient3, Theme.key_premiumGradient4); + outlineGradient.paint.setStyle(Paint.Style.STROKE); + outlineGradient.paint.setStrokeWidth(AndroidUtilities.dp(1.5f)); + + dummyCell = new PremiumGiftTierCell(getContext()); + + TLRPC.UserFull userFull = MessagesController.getInstance(currentAccount).getUserFull(user.id); + if (userFull != null) { + List products = new ArrayList<>(); + long pricePerMonthMax = 0; + for (TLRPC.TL_premiumGiftOption option : userFull.premium_gifts) { + GiftTier giftTier = new GiftTier(option); + giftTiers.add(giftTier); + if (BuildVars.useInvoiceBilling()) { + if (giftTier.getPricePerMonth() > pricePerMonthMax) { + pricePerMonthMax = giftTier.getPricePerMonth(); + } + } else if (giftTier.giftOption.store_product != null && BillingController.getInstance().isReady()) { + products.add(QueryProductDetailsParams.Product.newBuilder() + .setProductType(BillingClient.ProductType.INAPP) + .setProductId(giftTier.giftOption.store_product) + .build()); + } + } + if (BuildVars.useInvoiceBilling()) { + for (GiftTier tier : giftTiers) { + tier.setPricePerMonthRegular(pricePerMonthMax); + } + } else if (!products.isEmpty()) { + long startMs = System.currentTimeMillis(); + BillingController.getInstance().queryProductDetails(products, (billingResult, list) -> { + long pricePerMonthMaxStore = 0; + + for (ProductDetails details : list) { + for (GiftTier giftTier : giftTiers) { + if (giftTier.giftOption.store_product != null && giftTier.giftOption.store_product.equals(details.getProductId())) { + giftTier.setGooglePlayProductDetails(details); + + if (giftTier.getPricePerMonth() > pricePerMonthMaxStore) { + pricePerMonthMaxStore = giftTier.getPricePerMonth(); + } + break; + } + } + } + + for (GiftTier giftTier : giftTiers) { + giftTier.setPricePerMonthRegular(pricePerMonthMaxStore); + } + AndroidUtilities.runOnUIThread(()-> { + recyclerListView.getAdapter().notifyDataSetChanged(); + updateButtonText(System.currentTimeMillis() - startMs > 1000); + }); + }); + } + } + + if (!giftTiers.isEmpty()) { + selectedTierIndex = 0; + updateButtonText(false); + } + + headerRow = rowsCount++; + tiersStartRow = rowsCount; + rowsCount += giftTiers.size(); + tiersEndRow = rowsCount; + footerRow = rowsCount++; + buttonRow = rowsCount++; + + recyclerListView.setOnItemClickListener((view, position) -> { + if (view instanceof PremiumGiftTierCell) { + PremiumGiftTierCell giftTierCell = (PremiumGiftTierCell) view; + selectedTierIndex = giftTiers.indexOf(giftTierCell.tier); + updateButtonText(true); + giftTierCell.setChecked(true, true); + + for (int i = 0; i < recyclerListView.getChildCount(); i++) { + View ch = recyclerListView.getChildAt(i); + if (ch instanceof PremiumGiftTierCell) { + PremiumGiftTierCell otherCell = (PremiumGiftTierCell) ch; + if (otherCell.tier != giftTierCell.tier) { + otherCell.setChecked(false, true); + } + } + } + + for (int i = 0; i < recyclerListView.getHiddenChildCount(); i++) { + View ch = recyclerListView.getHiddenChildAt(i); + if (ch instanceof PremiumGiftTierCell) { + PremiumGiftTierCell otherCell = (PremiumGiftTierCell) ch; + if (otherCell.tier != giftTierCell.tier) { + otherCell.setChecked(false, true); + } + } + } + + for (int i = 0; i < recyclerListView.getCachedChildCount(); i++) { + View ch = recyclerListView.getCachedChildAt(i); + if (ch instanceof PremiumGiftTierCell) { + PremiumGiftTierCell otherCell = (PremiumGiftTierCell) ch; + if (otherCell.tier != giftTierCell.tier) { + otherCell.setChecked(false, true); + } + } + } + + for (int i = 0; i < recyclerListView.getAttachedScrapChildCount(); i++) { + View ch = recyclerListView.getAttachedScrapChildAt(i); + if (ch instanceof PremiumGiftTierCell) { + PremiumGiftTierCell otherCell = (PremiumGiftTierCell) ch; + if (otherCell.tier != giftTierCell.tier) { + otherCell.setChecked(false, true); + } + } + } + } + }); + recyclerListView.setOverScrollMode(View.OVER_SCROLL_NEVER); + Path path = new Path(); + recyclerListView.setSelectorTransformer(canvas -> { + path.rewind(); + Rect selectorRect = recyclerListView.getSelectorRect(); + AndroidUtilities.rectTmp.set(selectorRect.left + AndroidUtilities.dp(20), selectorRect.top + AndroidUtilities.dp(3), selectorRect.right - AndroidUtilities.dp(20), selectorRect.bottom - AndroidUtilities.dp(3)); + path.addRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(12), AndroidUtilities.dp(12), Path.Direction.CW); + canvas.clipPath(path); + }); + } + + private void updateButtonText(boolean animated) { + if (!BuildVars.useInvoiceBilling() && (!BillingController.getInstance().isReady() || giftTiers.get(selectedTierIndex).googlePlayProductDetails == null)) { + premiumButtonView.setButton(LocaleController.getString(R.string.Loading), v -> {}, true); + premiumButtonView.setFlickerDisabled(true); + return; + } + premiumButtonView.setButton(LocaleController.formatString(R.string.GiftSubscriptionFor, giftTiers.get(selectedTierIndex).getFormattedPrice()), v -> onGiftPremium(), animated); + premiumButtonView.setFlickerDisabled(false); + } + + private void onGiftSuccess(boolean fromGooglePlay) { + TLRPC.UserFull full = MessagesController.getInstance(currentAccount).getUserFull(user.id); + if (full != null) { + user.premium = true; + MessagesController.getInstance(currentAccount).putUser(user, true); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, user.id, full); + } + + if (getBaseFragment() != null) { + List fragments = new ArrayList<>(((LaunchActivity) getBaseFragment().getParentActivity()).getActionBarLayout().fragmentsStack); + + ActionBarLayout layout = getBaseFragment().getParentLayout(); + ChatActivity lastChatActivity = null; + for (BaseFragment fragment : fragments) { + if (fragment instanceof ChatActivity) { + lastChatActivity = (ChatActivity) fragment; + if (lastChatActivity.getDialogId() != user.id) { + fragment.removeSelfFromStack(); + } + } else if (fragment instanceof ProfileActivity) { + if (fromGooglePlay && layout.getLastFragment() == fragment) { + fragment.finishFragment(); + } else { + fragment.removeSelfFromStack(); + } + } + } + if (lastChatActivity == null || lastChatActivity.getDialogId() != user.id) { + Bundle args = new Bundle(); + args.putLong("user_id", user.id); + layout.presentFragment(new ChatActivity(args), true); + } + } + } + + private void onGiftPremium() { + GiftTier tier = giftTiers.get(selectedTierIndex); + if (BuildVars.useInvoiceBilling()) { + if (getBaseFragment().getParentActivity() instanceof LaunchActivity) { + Uri uri = Uri.parse(tier.giftOption.bot_url); + if (uri.getHost().equals("t.me")) { + if (!uri.getPath().startsWith("/$") && !uri.getPath().startsWith("/invoice/")) { + ((LaunchActivity) getBaseFragment().getParentActivity()).setNavigateToPremiumBot(true); + } else { + ((LaunchActivity) getBaseFragment().getParentActivity()).setNavigateToPremiumGiftCallback(()-> onGiftSuccess(false)); + } + } + Browser.openUrl(getBaseFragment().getParentActivity(), tier.giftOption.bot_url); + } + } else { + if (BillingController.getInstance().isReady() && tier.googlePlayProductDetails != null) { + TLRPC.TL_inputStorePaymentGiftPremium giftPremium = new TLRPC.TL_inputStorePaymentGiftPremium(); + giftPremium.user_id = MessagesController.getInstance(currentAccount).getInputUser(user); + ProductDetails.OneTimePurchaseOfferDetails offerDetails = tier.googlePlayProductDetails.getOneTimePurchaseOfferDetails(); + giftPremium.currency = offerDetails.getPriceCurrencyCode(); + giftPremium.amount = (long) ((offerDetails.getPriceAmountMicros() / Math.pow(10, 6)) * Math.pow(10, BillingController.getInstance().getCurrencyExp(giftPremium.currency))); + + BillingController.getInstance().addResultListener(tier.giftOption.store_product, billingResult -> { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + AndroidUtilities.runOnUIThread(()-> onGiftSuccess(true)); + } + }); + + TLRPC.TL_payments_canPurchasePremium req = new TLRPC.TL_payments_canPurchasePremium(); + req.purpose = giftPremium; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(()->{ + if (response instanceof TLRPC.TL_boolTrue) { + BillingController.getInstance().launchBillingFlow(getBaseFragment().getParentActivity(), AccountInstance.getInstance(currentAccount), giftPremium, Collections.singletonList(BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(tier.googlePlayProductDetails) + .build())); + } else if (error != null) { + AlertsCreator.processError(currentAccount, error, getBaseFragment(), req); + } + })); + } + } + } + + @Override + public void onViewCreated(FrameLayout containerView) { + super.onViewCreated(containerView); + + premiumButtonView = new PremiumButtonView(getContext(), true); + + FrameLayout buttonContainer = new FrameLayout(getContext()); + buttonContainer.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.CENTER_VERTICAL, 16, 0, 16, 0)); + buttonContainer.setBackgroundColor(getThemedColor(Theme.key_dialogBackground)); + containerView.addView(buttonContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 68, Gravity.BOTTOM)); + } + + @Override + protected void onPreMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onPreMeasure(widthMeasureSpec, heightMeasureSpec); + measureGradient(View.MeasureSpec.getSize(widthMeasureSpec), View.MeasureSpec.getSize(heightMeasureSpec)); + } + + private void measureGradient(int w, int h) { + int yOffset = 0; + for (int i = 0; i < giftTiers.size(); i++) { + dummyCell.bind(giftTiers.get(i)); + dummyCell.measure(View.MeasureSpec.makeMeasureSpec(w, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.AT_MOST)); + giftTiers.get(i).yOffset = yOffset; + yOffset += dummyCell.getMeasuredHeight(); + } + + totalGradientHeight = yOffset; + } + + @Override + protected CharSequence getTitle() { + return LocaleController.getString(R.string.GiftTelegramPremiumTitle); + } + + @Override + protected RecyclerListView.SelectionAdapter createAdapter() { + return new RecyclerListView.SelectionAdapter() { + private final static int VIEW_TYPE_HEADER = 0, + VIEW_TYPE_TIER = 1, + VIEW_TYPE_FOOTER = 2, + VIEW_TYPE_BUTTON = 3; + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + return holder.getItemViewType() == VIEW_TYPE_TIER; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view; + switch (viewType) { + default: + case VIEW_TYPE_HEADER: + view = new PremiumGiftHeaderCell(getContext()); + break; + case VIEW_TYPE_TIER: + AtomicReference progressRef = new AtomicReference<>(0f); + PremiumGiftTierCell premiumGiftTierCell = new PremiumGiftTierCell(getContext()) { + @Override + protected void dispatchDraw(Canvas canvas) { + if (discountView.getVisibility() == VISIBLE) { + AndroidUtilities.rectTmp.set(discountView.getLeft(), discountView.getTop(), discountView.getRight(), discountView.getBottom()); + gradientTools.gradientMatrix(0, 0, getMeasuredWidth(), totalGradientHeight, 0, -tier.yOffset); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(6), AndroidUtilities.dp(6), gradientTools.paint); + } + + float progress = progressRef.get(); + int alpha = outlineGradient.paint.getAlpha(); + outlineGradient.paint.setAlpha((int) (progress * alpha)); + AndroidUtilities.rectTmp.set(AndroidUtilities.dp(20), AndroidUtilities.dp(3), getWidth() - AndroidUtilities.dp(20), getHeight() - AndroidUtilities.dp(3)); + outlineGradient.gradientMatrix(0, 0, getMeasuredWidth(), getMeasuredHeight(), 0, 0); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(12), AndroidUtilities.dp(12), outlineGradient.paint); + outlineGradient.paint.setAlpha(alpha); + + super.dispatchDraw(canvas); + } + }; + premiumGiftTierCell.setCirclePaintProvider(obj -> { + gradientTools.gradientMatrix(0, 0, premiumGiftTierCell.getMeasuredWidth(), totalGradientHeight, 0, -premiumGiftTierCell.tier.yOffset); + return gradientTools.paint; + }); + premiumGiftTierCell.setProgressDelegate(progress -> { + progressRef.set(progress); + premiumGiftTierCell.invalidate(); + }); + view = premiumGiftTierCell; + break; + case VIEW_TYPE_FOOTER: + TextInfoPrivacyCell privacyCell = new TextInfoPrivacyCell(getContext()); + privacyCell.setTopPadding(28); + privacyCell.getTextView().setGravity(Gravity.CENTER_HORIZONTAL); + String str = LocaleController.getString(R.string.GiftPremiumListFeaturesAndTerms); + int startIndex = str.indexOf('*'), lastIndex = str.lastIndexOf('*'); + if (startIndex != -1 && lastIndex != -1) { + str = str.substring(0, startIndex) + str.substring(startIndex + 1, lastIndex) + str.substring(lastIndex + 1); + SpannableString span = new SpannableString(str); + span.setSpan(new LinkSpan(), startIndex, lastIndex - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + privacyCell.setText(span); + } else { + privacyCell.setText(str); + } + privacyCell.setPadding(AndroidUtilities.dp(21), 0, AndroidUtilities.dp(21), 0); + view = privacyCell; + break; + case VIEW_TYPE_BUTTON: + view = new View(getContext()) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(68), MeasureSpec.EXACTLY)); + } + }; + break; + } + return new RecyclerListView.Holder(view); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (position == headerRow) { + ((PremiumGiftHeaderCell) holder.itemView).bind(user); + } else if (position >= tiersStartRow && position < tiersEndRow) { + PremiumGiftTierCell giftTierCell = (PremiumGiftTierCell) holder.itemView; + giftTierCell.bind(giftTiers.get(position - tiersStartRow)); + giftTierCell.setChecked(position - tiersStartRow == selectedTierIndex, false); + } + } + + @Override + public int getItemViewType(int position) { + if (position == headerRow) { + return VIEW_TYPE_HEADER; + } else if (position >= tiersStartRow && position < tiersEndRow) { + return VIEW_TYPE_TIER; + } else if (position == footerRow) { + return VIEW_TYPE_FOOTER; + } else if (position == buttonRow) { + return VIEW_TYPE_BUTTON; + } + return VIEW_TYPE_HEADER; + } + + @Override + public int getItemCount() { + return rowsCount; + } + }; + } + + private final class LinkSpan extends ClickableSpan { + + @Override + public void onClick(View widget) { + getBaseFragment().presentFragment(new PremiumPreviewFragment("profile")); + dismiss(); + } + + @Override + public void updateDrawState(TextPaint p) { + super.updateDrawState(p); + p.setUnderlineText(false); + } + } + + public final static class GiftTier { + public final TLRPC.TL_premiumGiftOption giftOption; + private int discount; + private long pricePerMonth; + + private long pricePerMonthRegular; + private ProductDetails googlePlayProductDetails; + + public int yOffset; + + public GiftTier(TLRPC.TL_premiumGiftOption giftOption) { + this.giftOption = giftOption; + } + + public ProductDetails getGooglePlayProductDetails() { + return googlePlayProductDetails; + } + + public void setGooglePlayProductDetails(ProductDetails googlePlayProductDetails) { + this.googlePlayProductDetails = googlePlayProductDetails; + } + + public void setPricePerMonthRegular(long pricePerMonthRegular) { + this.pricePerMonthRegular = pricePerMonthRegular; + } + + public int getMonths() { + return giftOption.months; + } + + public int getDiscount() { + if (discount == 0) { + if (getPricePerMonth() == 0) { + return 0; + } + + if (pricePerMonthRegular != 0) { + discount = (int) ((1.0 - getPricePerMonth() / (double) pricePerMonthRegular) * 100); + + if (discount == 0) { + discount = -1; + } + } + } + return discount; + } + + public long getPricePerMonth() { + if (pricePerMonth == 0) { + long price = getPrice(); + if (price != 0) { + pricePerMonth = price / giftOption.months; + } + } + return pricePerMonth; + } + + public String getFormattedPricePerMonth() { + if (BuildVars.useInvoiceBilling() || giftOption.store_product == null) { + return BillingController.getInstance().formatCurrency(getPricePerMonth(), getCurrency()); + } + + return googlePlayProductDetails == null ? "" : BillingController.getInstance().formatCurrency(getPricePerMonth(), getCurrency(), 6); + } + + public String getFormattedPrice() { + if (BuildVars.useInvoiceBilling() || giftOption.store_product == null) { + return BillingController.getInstance().formatCurrency(getPrice(), getCurrency()); + } + + return googlePlayProductDetails == null ? "" : BillingController.getInstance().formatCurrency(getPrice(), getCurrency(), 6); + } + + public long getPrice() { + if (BuildVars.useInvoiceBilling() || giftOption.store_product == null) { + return giftOption.amount; + } + return googlePlayProductDetails == null ? 0 : googlePlayProductDetails.getOneTimePurchaseOfferDetails().getPriceAmountMicros(); + } + + public String getCurrency() { + if (BuildVars.useInvoiceBilling() || giftOption.store_product == null) { + return giftOption.currency; + } + return googlePlayProductDetails == null ? "" : googlePlayProductDetails.getOneTimePurchaseOfferDetails().getPriceCurrencyCode(); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java index e8a53bff2..b4583c07a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumButtonView.java @@ -21,6 +21,7 @@ import androidx.core.graphics.ColorUtils; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildVars; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedTextView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RLottieImageView; @@ -32,8 +33,9 @@ public class PremiumButtonView extends FrameLayout { private float progress; private boolean inc; - public TextView buttonTextView; + public AnimatedTextView buttonTextView; public TextView overlayTextView; + private int radius; private boolean showOverlay; private float overlayProgress; @@ -46,19 +48,29 @@ public class PremiumButtonView extends FrameLayout { RLottieImageView iconView; + private boolean isButtonTextSet; + + private boolean isFlickerDisabled; + public PremiumButtonView(@NonNull Context context, boolean createOverlayTextView) { + this(context, AndroidUtilities.dp(8), createOverlayTextView); + } + + public PremiumButtonView(@NonNull Context context, int radius, boolean createOverlayTextView) { super(context); + this.radius = radius; + flickerDrawable = new CellFlickerDrawable(); flickerDrawable.animationSpeedScale = 1.2f; flickerDrawable.drawFrame = false; flickerDrawable.repeatProgress = 4f; LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.HORIZONTAL); - buttonTextView = new TextView(context); + buttonTextView = new AnimatedTextView(context); buttonTextView.setGravity(Gravity.CENTER); buttonTextView.setTextColor(Color.WHITE); - buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + buttonTextView.setTextSize(AndroidUtilities.dp(14)); + buttonTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); iconView = new RLottieImageView(context); iconView.setColorFilter(Color.WHITE); @@ -66,7 +78,7 @@ public class PremiumButtonView extends FrameLayout { buttonLayout = new FrameLayout(context); buttonLayout.addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - buttonLayout.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(8), Color.TRANSPARENT, ColorUtils.setAlphaComponent(Color.WHITE, 120))); + buttonLayout.setBackground(Theme.createSimpleSelectorRoundRectDrawable(radius, Color.TRANSPARENT, ColorUtils.setAlphaComponent(Color.WHITE, 120))); linearLayout.addView(buttonTextView, LayoutHelper.createLinear(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL)); linearLayout.addView(iconView, LayoutHelper.createLinear(24, 24, 0, Gravity.CENTER_VERTICAL, 4, 0, 0, 0)); @@ -87,6 +99,13 @@ public class PremiumButtonView extends FrameLayout { } } + public RLottieImageView getIconView() { + return iconView; + } + public AnimatedTextView getTextView() { + return buttonTextView; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -108,13 +127,13 @@ public class PremiumButtonView extends FrameLayout { } } PremiumGradient.getInstance().updateMainGradientMatrix(0, 0, getMeasuredWidth(), getMeasuredHeight(), -getMeasuredWidth() * 0.1f * progress, 0); - canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(8), AndroidUtilities.dp(8), PremiumGradient.getInstance().getMainGradientPaint()); + canvas.drawRoundRect(AndroidUtilities.rectTmp, radius, radius, PremiumGradient.getInstance().getMainGradientPaint()); invalidate(); } - if (!BuildVars.IS_BILLING_UNAVAILABLE) { + if (!BuildVars.IS_BILLING_UNAVAILABLE && !isFlickerDisabled) { flickerDrawable.setParentWidth(getMeasuredWidth()); - flickerDrawable.draw(canvas, AndroidUtilities.rectTmp, AndroidUtilities.dp(8), null); + flickerDrawable.draw(canvas, AndroidUtilities.rectTmp, radius, null); } if (overlayProgress != 0 && drawOverlayColor) { @@ -124,10 +143,10 @@ public class PremiumButtonView extends FrameLayout { path.addCircle(getMeasuredWidth() / 2f, getMeasuredHeight() / 2f, Math.max(getMeasuredWidth(), getMeasuredHeight()) * 1.4f * overlayProgress, Path.Direction.CW); canvas.save(); canvas.clipPath(path); - canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(8), AndroidUtilities.dp(8), paintOverlayPaint); + canvas.drawRoundRect(AndroidUtilities.rectTmp, radius, radius, paintOverlayPaint); canvas.restore(); } else { - canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(8), AndroidUtilities.dp(8), paintOverlayPaint); + canvas.drawRoundRect(AndroidUtilities.rectTmp, radius, radius, paintOverlayPaint); } } @@ -204,8 +223,35 @@ public class PremiumButtonView extends FrameLayout { iconView.setVisibility(View.GONE); } + public void setFlickerDisabled(boolean flickerDisabled) { + isFlickerDisabled = flickerDisabled; + invalidate(); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + buttonLayout.setEnabled(enabled); + } + + @Override + public boolean isEnabled() { + return buttonLayout.isEnabled(); + } + public void setButton(String text, View.OnClickListener clickListener) { - buttonTextView.setText(text); + setButton(text, clickListener, false); + } + + public void setButton(String text, View.OnClickListener clickListener, boolean animated) { + if (!isButtonTextSet && animated) { + animated = true; + } + isButtonTextSet = true; + if (animated && buttonTextView.isAnimating()) { + buttonTextView.cancelAnimation(); + } + buttonTextView.setText(text, animated); buttonLayout.setOnClickListener(clickListener); } } 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 9fcde5d80..4f91e60b8 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 @@ -66,14 +66,15 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati private final boolean onlySelectedType; public PremiumFeatureBottomSheet(BaseFragment fragment, int startType, boolean onlySelectedType) { - super(fragment.getParentActivity(), false); + super(fragment.getContext(), false); + fixNavigationBar(); this.fragment = fragment; this.startType = startType; this.onlySelectedType = onlySelectedType; String svg = RLottieDrawable.readRes(null, R.raw.star_loader); svgIcon = SvgHelper.getDrawable(svg); - Context context = fragment.getParentActivity(); + Context context = fragment.getContext(); FrameLayout frameLayout = new FrameLayout(context) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @@ -268,11 +269,14 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati } premiumButtonView = new PremiumButtonView(context, true); premiumButtonView.buttonLayout.setOnClickListener(v -> { - if (fragment.getVisibleDialog() != null) { - fragment.getVisibleDialog().dismiss(); - } if (fragment instanceof ChatActivity) { ((ChatActivity) fragment).closeMenu(); + if (((ChatActivity) fragment).chatAttachAlert != null) { + ((ChatActivity) fragment).chatAttachAlert.dismiss(true); + } + } + if (fragment.getVisibleDialog() != null) { + fragment.getVisibleDialog().dismiss(); } if (onlySelectedType) { fragment.presentFragment(new PremiumPreviewFragment(PremiumPreviewFragment.featureTypeToServerString(featureData.type))); @@ -318,6 +322,12 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati } } + @Override + public void show() { + super.show(); + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 16); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -334,6 +344,8 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.billingProductDetailsUpdated); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.premiumPromoUpdated); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.currentUserPremiumStatusChanged); + + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 16); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGiftHeaderCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGiftHeaderCell.java new file mode 100644 index 000000000..746b700c1 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGiftHeaderCell.java @@ -0,0 +1,97 @@ +package org.telegram.ui.Components.Premium; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.LinearLayout; +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.R; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.LayoutHelper; + +public class PremiumGiftHeaderCell extends LinearLayout { + private TLRPC.User user; + + private StarParticlesView.Drawable drawable; + + private BackupImageView avatarImageView; + private AvatarDrawable avatarDrawable; + private TextView titleView; + private TextView subtitleView; + + public PremiumGiftHeaderCell(@NonNull Context context) { + super(context); + + setOrientation(VERTICAL); + + avatarDrawable = new AvatarDrawable(); + avatarImageView = new BackupImageView(context); + avatarImageView.setRoundRadius(AndroidUtilities.dp(50)); + addView(avatarImageView, LayoutHelper.createLinear(100, 100, Gravity.CENTER_HORIZONTAL, 0, 28, 0, 0)); + + titleView = new TextView(context); + titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 22); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + titleView.setGravity(Gravity.CENTER_HORIZONTAL); + addView(titleView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 24, 24, 24, 0)); + + subtitleView = new TextView(context); + subtitleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + subtitleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + subtitleView.setGravity(Gravity.CENTER_HORIZONTAL); + addView(subtitleView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 24, 8, 24, 28)); + + setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + drawable = new StarParticlesView.Drawable(50); + drawable.useGradient = true; + drawable.roundEffect = true; + + drawable.init(); + setWillNotDraw(false); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + float cx = avatarImageView.getX() + avatarImageView.getWidth() / 2f; + float cy = avatarImageView.getPaddingTop() + avatarImageView.getY() + avatarImageView.getHeight() / 2f - AndroidUtilities.dp(3); + int outerPadding = AndroidUtilities.dp(32); + drawable.rect.set( + cx - outerPadding, cy - outerPadding, + cx + outerPadding, cy + outerPadding + ); + if (changed) { + drawable.resetPositions(); + } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + drawable.onDraw(canvas); + invalidate(); + } + + public void bind(TLRPC.User user) { + this.user = user; + + avatarDrawable.setInfo(user); + avatarImageView.setForUserOrChat(user, avatarDrawable); + + titleView.setText(AndroidUtilities.replaceTags(LocaleController.getString(R.string.GiftTelegramPremiumTitle))); + subtitleView.setText(AndroidUtilities.replaceTags(LocaleController.formatString(R.string.GiftTelegramPremiumDescription, user.first_name))); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGiftTierCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGiftTierCell.java new file mode 100644 index 000000000..ad695fdd4 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGiftTierCell.java @@ -0,0 +1,266 @@ +package org.telegram.ui.Components.Premium; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Shader; +import android.os.SystemClock; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BillingController; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.GenericProvider; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.CheckBox2; +import org.telegram.ui.Components.CheckBoxBase; +import org.telegram.ui.Components.LayoutHelper; + +public class PremiumGiftTierCell extends ViewGroup { + private CheckBox2 checkBox; + private TextView titleView; + private TextView priceTotalView; + private TextView pricePerMonthView; + + private int leftPaddingToTextDp = 24; + + protected GiftPremiumBottomSheet.GiftTier tier; + protected TextView discountView; + + private String colorKey1 = Theme.key_windowBackgroundWhite; + private String colorKey2 = Theme.key_windowBackgroundGray; + private int gradientWidth; + private LinearGradient gradient; + private Paint paint = new Paint(); + private PremiumGiftTierCell globalGradientView; + private int color0; + private int color1; + private Matrix matrix = new Matrix(); + private long lastUpdateTime; + private int totalTranslation; + private float parentXOffset; + private int parentWidth, parentHeight; + + private boolean isDrawingGradient; + + public PremiumGiftTierCell(@NonNull Context context) { + super(context); + + checkBox = new CheckBox2(context, 24); + checkBox.setDrawBackgroundAsArc(10); + checkBox.setColor(Theme.key_radioBackground, Theme.key_radioBackground, Theme.key_checkboxCheck); + addView(checkBox); + + titleView = new TextView(context); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + addView(titleView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 0, 8, 0, 0)); + + discountView = new TextView(context); + discountView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + discountView.setTextColor(Color.WHITE); + discountView.setPadding(AndroidUtilities.dp(3), 0, AndroidUtilities.dp(3), 0); + discountView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + addView(discountView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM, 0, 0, 0, 8)); + + pricePerMonthView = new TextView(context); + pricePerMonthView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + pricePerMonthView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + addView(pricePerMonthView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.BOTTOM, 0, 0, 0, 8)); + + priceTotalView = new TextView(context); + priceTotalView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + priceTotalView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + addView(priceTotalView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.END)); + + setPadding(AndroidUtilities.dp(24), AndroidUtilities.dp(12), AndroidUtilities.dp(16), AndroidUtilities.dp(12)); + setClipToPadding(false); + setWillNotDraw(false); + } + + public void setParentXOffset(float parentXOffset) { + this.parentXOffset = parentXOffset; + } + + public void setGlobalGradientView(PremiumGiftTierCell globalGradientView) { + this.globalGradientView = globalGradientView; + } + + public void setProgressDelegate(CheckBoxBase.ProgressDelegate delegate) { + checkBox.setProgressDelegate(delegate); + } + + public void setCirclePaintProvider(GenericProvider circlePaintProvider) { + checkBox.setCirclePaintProvider(circlePaintProvider); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + AndroidUtilities.rectTmp2.set(AndroidUtilities.dp(8) + getPaddingLeft(), (int)((getMeasuredHeight() - checkBox.getMeasuredHeight()) / 2f), 0, 0); + checkRtlAndLayout(checkBox); + + AndroidUtilities.rectTmp2.set(getMeasuredWidth() - priceTotalView.getMeasuredWidth() - AndroidUtilities.dp(16) - getPaddingRight(), (int) ((getMeasuredHeight() - priceTotalView.getMeasuredHeight()) / 2f), 0, 0); + checkRtlAndLayout(priceTotalView); + + AndroidUtilities.rectTmp2.set(AndroidUtilities.dp(8 + leftPaddingToTextDp) + checkBox.getMeasuredWidth() + getPaddingLeft(), getPaddingTop(), 0, 0); + checkRtlAndLayout(titleView); + + if (discountView.getVisibility() == VISIBLE) { + AndroidUtilities.rectTmp2.set(AndroidUtilities.dp(8 + leftPaddingToTextDp) + checkBox.getMeasuredWidth() + getPaddingLeft(), getMeasuredHeight() - discountView.getMeasuredHeight() - getPaddingBottom(), 0, 0); + checkRtlAndLayout(discountView); + } + + AndroidUtilities.rectTmp2.set(AndroidUtilities.dp(8 + leftPaddingToTextDp + (discountView.getVisibility() == VISIBLE ? 6 : 0)) + checkBox.getMeasuredWidth() + discountView.getMeasuredWidth() + getPaddingLeft(), getMeasuredHeight() - pricePerMonthView.getMeasuredHeight() - getPaddingBottom(), 0, 0); + checkRtlAndLayout(pricePerMonthView); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (isDrawingGradient) { + Paint paint = this.paint; + if (globalGradientView != null) { + paint = globalGradientView.paint; + } + + drawChild(canvas, checkBox, getDrawingTime()); + + updateColors(); + updateGradient(); + + AndroidUtilities.rectTmp.set(priceTotalView.getLeft(), priceTotalView.getTop() + AndroidUtilities.dp(4), priceTotalView.getRight(), priceTotalView.getBottom() - AndroidUtilities.dp(4)); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(8), AndroidUtilities.dp(8), paint); + + AndroidUtilities.rectTmp.set(pricePerMonthView.getLeft(), AndroidUtilities.dp(42), pricePerMonthView.getRight(), AndroidUtilities.dp(54)); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(8), AndroidUtilities.dp(8), paint); + + AndroidUtilities.rectTmp.set(titleView.getLeft(), titleView.getTop() + AndroidUtilities.dp(4), titleView.getRight(), titleView.getBottom() - AndroidUtilities.dp(4)); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(8), AndroidUtilities.dp(8), paint); + + invalidate(); + } else { + super.dispatchDraw(canvas); + } + } + + private void checkRtlAndLayout(View v) { + Rect rect = AndroidUtilities.rectTmp2; + rect.right = rect.left + v.getMeasuredWidth(); + rect.bottom = rect.top + v.getMeasuredHeight(); + if (LocaleController.isRTL) { + int right = rect.right; + rect.right = rect.left; + rect.left = right; + } + v.layout(AndroidUtilities.rectTmp2.left, AndroidUtilities.rectTmp2.top, AndroidUtilities.rectTmp2.right, AndroidUtilities.rectTmp2.bottom); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec), height = AndroidUtilities.dp(68); + int checkboxSpec = MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(28), MeasureSpec.EXACTLY); + checkBox.measure(checkboxSpec, checkboxSpec); + + priceTotalView.measure(MeasureSpec.makeMeasureSpec(width - checkBox.getMeasuredWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); + titleView.measure(MeasureSpec.makeMeasureSpec(width - checkBox.getMeasuredWidth() - priceTotalView.getMeasuredWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); + if (discountView.getVisibility() == VISIBLE) { + discountView.measure(MeasureSpec.makeMeasureSpec(width - checkBox.getMeasuredWidth() - priceTotalView.getMeasuredWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); + } else { + discountView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY)); + } + pricePerMonthView.measure(MeasureSpec.makeMeasureSpec(width - checkBox.getMeasuredWidth() - priceTotalView.getMeasuredWidth() - discountView.getMeasuredWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); + + setMeasuredDimension(width, height); + } + + public void setChecked(boolean checked, boolean animate) { + checkBox.setChecked(checked, animate); + } + + @SuppressLint("SetTextI18n") + public void bind(GiftPremiumBottomSheet.GiftTier tier) { + this.tier = tier; + + titleView.setText(LocaleController.formatPluralString("Months", tier.getMonths())); + + isDrawingGradient = !BuildVars.useInvoiceBilling() && (!BillingController.getInstance().isReady() || tier.getGooglePlayProductDetails() == null); + if (!isDrawingGradient) { + if (tier.getDiscount() <= 0) { + discountView.setVisibility(GONE); + } else { + discountView.setText(LocaleController.formatString(R.string.GiftPremiumOptionDiscount, tier.getDiscount())); + discountView.setVisibility(VISIBLE); + } + pricePerMonthView.setText(LocaleController.formatString(R.string.PricePerMonth, tier.getFormattedPricePerMonth())); + priceTotalView.setText(tier.getFormattedPrice()); + } else { + discountView.setText(LocaleController.formatString(R.string.GiftPremiumOptionDiscount, 10)); + discountView.setVisibility(VISIBLE); + pricePerMonthView.setText(LocaleController.formatString(R.string.PricePerMonth, 100)); + priceTotalView.setText("USD00,00"); + } + + requestLayout(); + } + + public void updateGradient() { + if (globalGradientView != null) { + globalGradientView.updateGradient(); + return; + } + long newUpdateTime = SystemClock.elapsedRealtime(); + long dt = Math.abs(lastUpdateTime - newUpdateTime); + if (dt > 17) { + dt = 16; + } + if (dt < 4) { + dt = 0; + } + int width = parentWidth; + if (width == 0) { + width = getMeasuredWidth(); + } + lastUpdateTime = newUpdateTime; + totalTranslation += dt * width / 400.0f; + if (totalTranslation >= width * 4) { + totalTranslation = -gradientWidth * 2; + } + matrix.setTranslate(totalTranslation + parentXOffset, 0); + if (gradient != null) { + gradient.setLocalMatrix(matrix); + } + } + + public void setParentSize(int parentWidth, int parentHeight, float parentXOffset) { + this.parentWidth = parentWidth; + this.parentHeight = parentHeight; + this.parentXOffset = parentXOffset; + } + + public void updateColors() { + if (globalGradientView != null) { + globalGradientView.updateColors(); + return; + } + int color0 = Theme.getColor(colorKey1); + int color1 = Theme.getColor(colorKey2); + if (this.color1 != color1 || this.color0 != color0) { + this.color0 = color0; + this.color1 = color1; + gradient = new LinearGradient(0, 0, gradientWidth = AndroidUtilities.dp(200), 0, new int[]{color1, color0, color0, color1}, new float[]{0.0f, 0.4f, 0.6f, 1f}, Shader.TileMode.CLAMP); + paint.setShader(gradient); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGradient.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGradient.java index 2a4ff24d1..7fa928f9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGradient.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumGradient.java @@ -133,19 +133,25 @@ public class PremiumGradient { Matrix matrix = new Matrix(); public final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - final String colorKey1, colorKey2, colorKey3, colorKey4; - final int colors[] = new int[4]; + final String colorKey1, colorKey2, colorKey3, colorKey4, colorKey5; + final int colors[] = new int[5]; public boolean exactly; public float x1 = 0f, y1 = 1f, x2 = 1.5f, y2 = 0f; public GradientTools(String colorKey1, String colorKey2, String colorKey3, String colorKey4) { + this(colorKey1, colorKey2, colorKey3, colorKey4, null); + } + + public GradientTools(String colorKey1, String colorKey2, String colorKey3, String colorKey4, String colorKey5) { this.colorKey1 = colorKey1; this.colorKey2 = colorKey2; this.colorKey3 = colorKey3; this.colorKey4 = colorKey4; + this.colorKey5 = colorKey5; } + public void gradientMatrix(int x, int y, int x1, int y1, float xOffset, float yOffset) { chekColors(); if (exactly) { @@ -176,17 +182,21 @@ public class PremiumGradient { int c2 = Theme.getColor(colorKey2); int c3 = colorKey3 == null ? 0 : Theme.getColor(colorKey3); int c4 = colorKey4 == null ? 0 : Theme.getColor(colorKey4); - if (colors[0] != c1 || colors[1] != c2 || colors[2] != c3 || colors[3] != c4) { + int c5 = colorKey5 == null ? 0 : Theme.getColor(colorKey5); + if (colors[0] != c1 || colors[1] != c2 || colors[2] != c3 || colors[3] != c4 || colors[4] != c5) { colors[0] = c1; colors[1] = c2; colors[2] = c3; colors[3] = c4; + colors[4] = c5; if (c3 == 0) { shader = new LinearGradient(size * x1, size * y1, size * x2, size * y2, new int[]{colors[0], colors[1]}, new float[]{0, 1f}, Shader.TileMode.CLAMP); } else if (c4 == 0) { shader = new LinearGradient(size * x1, size * y1, size * x2, size * y2, new int[]{colors[0], colors[1], colors[2]}, new float[]{0, 0.5f, 1f}, Shader.TileMode.CLAMP); - } else { + } else if (c5 == 0) { shader = new LinearGradient(size * x1, size * y1, size * x2, size * y2, new int[]{colors[0], colors[1], colors[2], colors[3]}, new float[]{0, 0.5f, 0.78f, 1f}, Shader.TileMode.CLAMP); + } else { + shader = new LinearGradient(size * x1, size * y1, size * x2, size * y2, new int[]{colors[0], colors[1], colors[2], colors[3], colors[4]}, new float[]{0, 0.425f, 0.655f, 0.78f, 1f}, Shader.TileMode.CLAMP); } shader.setLocalMatrix(matrix); paint.setShader(shader); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumLockIconView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumLockIconView.java index 5e0e8efc9..b36c4261a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumLockIconView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumLockIconView.java @@ -44,6 +44,7 @@ public class PremiumLockIconView extends ImageView { } } + boolean colorRetrieved = false; int currentColor = Color.WHITE; int color1, color2; Shader shader = null; @@ -77,6 +78,7 @@ public class PremiumLockIconView extends ImageView { } public void setColor(int color) { + colorRetrieved = true; if (currentColor != color) { currentColor = color; if (type == TYPE_REACTIONS) { @@ -205,6 +207,10 @@ public class PremiumLockIconView extends ImageView { invalidate(); } + public boolean ready() { + return colorRetrieved; + } + public void play(int delay) { isEnter = true; cellFlickerDrawable.progress = 0; 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 3d5f76979..6ab37252a 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 @@ -10,6 +10,7 @@ import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.Gravity; +import android.view.HapticFeedbackConstants; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -35,6 +36,7 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Components.BottomSheetWithRecyclerListView; import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.FireworksOverlay; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Premium.GLIcon.GLIconRenderer; import org.telegram.ui.Components.Premium.GLIcon.GLIconTextureView; @@ -49,6 +51,8 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { ArrayList premiumFeatures = new ArrayList<>(); int currentAccount; TLRPC.User user; + GiftPremiumBottomSheet.GiftTier giftTier; + boolean isOutboundGift; PremiumFeatureCell dummyCell; int totalGradientHeight; @@ -61,6 +65,7 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { int helpUsRow; int buttonRow; + FireworksOverlay fireworksOverlay; PremiumGradient.GradientTools gradientTools; StarParticlesView starParticlesView; GLIconTextureView iconTextureView; @@ -79,15 +84,27 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { boolean enterTransitionInProgress; ValueAnimator enterAnimator; + boolean animateConfetti; + FrameLayout buttonContainer; + public PremiumPreviewBottomSheet(BaseFragment fragment, int currentAccount, TLRPC.User user) { + this(fragment, currentAccount, user, null); + } + + public PremiumPreviewBottomSheet(BaseFragment fragment, int currentAccount, TLRPC.User user, GiftPremiumBottomSheet.GiftTier gift) { super(fragment, false, false); this.fragment = fragment; topPadding = 0.26f; this.user = user; this.currentAccount = currentAccount; + this.giftTier = gift; dummyCell = new PremiumFeatureCell(getContext()); PremiumPreviewFragment.fillPremiumFeaturesList(premiumFeatures, currentAccount); + if (giftTier != null || UserConfig.getInstance(currentAccount).isPremium()) { + buttonContainer.setVisibility(View.GONE); + } + gradientTools = new PremiumGradient.GradientTools(Theme.key_premiumGradient1, Theme.key_premiumGradient2, Theme.key_premiumGradient3, Theme.key_premiumGradient4); gradientTools.exactly = true; gradientTools.x1 = 0; @@ -102,28 +119,38 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { rowCount += premiumFeatures.size(); featuresEndRow = rowCount; sectionRow = rowCount++; - if (!UserConfig.getInstance(currentAccount).isPremium()) { + if (!UserConfig.getInstance(currentAccount).isPremium() && gift == null) { buttonRow = rowCount++; } recyclerListView.setPadding(AndroidUtilities.dp(6), 0, AndroidUtilities.dp(6), 0); - recyclerListView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() { - @Override - public void onItemClick(View view, int position) { - if (view instanceof PremiumFeatureCell) { - PremiumFeatureCell cell = (PremiumFeatureCell) view; - PremiumPreviewFragment.sentShowFeaturePreview(currentAccount, cell.data.type); - if (cell.data.type == PremiumPreviewFragment.PREMIUM_FEATURE_LIMITS) { - DoubledLimitsBottomSheet bottomSheet = new DoubledLimitsBottomSheet(fragment, currentAccount); - showDialog(bottomSheet); - } else { - showDialog(new PremiumFeatureBottomSheet(fragment, cell.data.type, false)); - } + recyclerListView.setOnItemClickListener((view, position) -> { + if (view instanceof PremiumFeatureCell) { + PremiumFeatureCell cell = (PremiumFeatureCell) view; + PremiumPreviewFragment.sentShowFeaturePreview(currentAccount, cell.data.type); + if (cell.data.type == PremiumPreviewFragment.PREMIUM_FEATURE_LIMITS) { + DoubledLimitsBottomSheet bottomSheet = new DoubledLimitsBottomSheet(fragment, currentAccount); + showDialog(bottomSheet); + } else { + showDialog(new PremiumFeatureBottomSheet(fragment, cell.data.type, false)); } } }); MediaDataController.getInstance(currentAccount).preloadPremiumPreviewStickers(); PremiumPreviewFragment.sentShowScreenStat("profile"); + + fireworksOverlay = new FireworksOverlay(getContext()); + container.addView(fireworksOverlay, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + } + + public PremiumPreviewBottomSheet setOutboundGift(boolean outboundGift) { + isOutboundGift = outboundGift; + return this; + } + + public PremiumPreviewBottomSheet setAnimateConfetti(boolean animateConfetti) { + this.animateConfetti = animateConfetti; + return this; } private void showDialog(Dialog dialog) { @@ -149,7 +176,7 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { } }); - FrameLayout buttonContainer = new FrameLayout(getContext()); + buttonContainer = new FrameLayout(getContext()); View buttonDivider = new View(getContext()); buttonDivider.setBackgroundColor(Theme.getColor(Theme.key_divider)); @@ -228,7 +255,6 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); titleView.setGravity(Gravity.CENTER_HORIZONTAL); - titleView.setText(LocaleController.getString("TelegramPremium", R.string.TelegramPremium)); titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); titleView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkText)); linearLayout.addView(titleView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, Gravity.CENTER_HORIZONTAL, 40, 0, 40, 0)); @@ -237,12 +263,21 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { subtitleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); subtitleView.setGravity(Gravity.CENTER_HORIZONTAL); subtitleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + subtitleView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkText)); linearLayout.addView(subtitleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 16, 9, 16, 20)); - titleView.setText(AndroidUtilities.replaceSingleTag(LocaleController.formatString("TelegramPremiumUserDialogTitle", R.string.TelegramPremiumUserDialogTitle, ContactsController.formatName(user.first_name, user.last_name)), () -> { - - })); - subtitleView.setText(AndroidUtilities.replaceTags(LocaleController.getString("TelegramPremiumUserDialogSubtitle", R.string.TelegramPremiumUserDialogSubtitle))); + if (giftTier != null) { + if (isOutboundGift) { + titleView.setText(AndroidUtilities.replaceSingleTag(LocaleController.formatString(R.string.TelegramPremiumUserGiftedPremiumOutboundDialogTitle, user != null ? user.first_name : "", giftTier.getMonths()), null)); + subtitleView.setText(AndroidUtilities.replaceSingleTag(LocaleController.formatString(R.string.TelegramPremiumUserGiftedPremiumOutboundDialogSubtitle, user != null ? user.first_name : ""), null)); + } else { + titleView.setText(AndroidUtilities.replaceSingleTag(LocaleController.formatString(R.string.TelegramPremiumUserGiftedPremiumDialogTitle, user != null ? user.first_name : "", giftTier.getMonths()), null)); + subtitleView.setText(AndroidUtilities.replaceTags(LocaleController.getString(R.string.TelegramPremiumUserGiftedPremiumDialogSubtitle))); + } + } else { + titleView.setText(AndroidUtilities.replaceSingleTag(LocaleController.formatString(R.string.TelegramPremiumUserDialogTitle, ContactsController.formatName(user.first_name, user.last_name)), null)); + subtitleView.setText(AndroidUtilities.replaceTags(LocaleController.getString(R.string.TelegramPremiumUserDialogSubtitle))); + } starParticlesView = new StarParticlesView(context); FrameLayout frameLayout = new FrameLayout(context) { @@ -343,6 +378,14 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { public void show() { super.show(); NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 4); + if (animateConfetti) { + AndroidUtilities.runOnUIThread(()->{ + try { + container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignored) {} + fireworksOverlay.start(); + }, 200); + } } @Override @@ -352,6 +395,10 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { if (enterAnimator != null) { enterAnimator.cancel(); } + + if (fireworksOverlay.isStarted()) { + fireworksOverlay.animate().alpha(0).setDuration(150).start(); + } } @Override @@ -374,6 +421,9 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { float cxTo = iconTextureView.getMeasuredWidth() / 2f; View view = iconTextureView; while (view != container) { + if (view == null) { + break; + } cxTo += view.getX(); view = (View) view.getParent(); } @@ -410,7 +460,7 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { @Override protected boolean onCustomOpenAnimation() { if (startEnterFromView == null) { - return true; + return false; } enterAnimator = ValueAnimator.ofFloat(0, 1f); enterTransitionProgress = 0f; @@ -419,12 +469,9 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { startEnterFromView.getRightDrawable().setAlpha(0); startEnterFromView.invalidate(); iconTextureView.startEnterAnimation(-360, 100); - enterAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - enterTransitionProgress = (float) animation.getAnimatedValue(); - container.invalidate(); - } + enterAnimator.addUpdateListener(animation -> { + enterTransitionProgress = (float) animation.getAnimatedValue(); + container.invalidate(); }); enterAnimator.addListener(new AnimatorListenerAdapter() { @Override @@ -434,12 +481,9 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView { iconContainer.invalidate(); ValueAnimator iconAlphaBack = ValueAnimator.ofInt(0, 255); Drawable drawable = startEnterFromView.getRightDrawable(); - iconAlphaBack.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - drawable.setAlpha((Integer) animation.getAnimatedValue()); - startEnterFromView.invalidate(); - } + iconAlphaBack.addUpdateListener(animation1 -> { + drawable.setAlpha((Integer) animation1.getAnimatedValue()); + startEnterFromView.invalidate(); }); iconAlphaBack.start(); super.onAnimationEnd(animation); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java index f6cace088..2a7b9023b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java @@ -111,7 +111,7 @@ public class StarParticlesView extends View { public boolean startFromCenter; private Paint paint = new Paint(); - ArrayList particles = new ArrayList<>(); + public ArrayList particles = new ArrayList<>(); public float speedScale = 1f; public final int count; @@ -140,6 +140,12 @@ public class StarParticlesView extends View { public String colorKey = Theme.key_premiumStartSmallStarsColor; public boolean svg; + public long pausedTime; + + float a; + float a1; + float a2; + public final static int TYPE_SETTINGS = 101; public Drawable(int count) { @@ -196,7 +202,19 @@ public class StarParticlesView extends View { stars[i] = SvgHelper.getBitmap(res, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); svg = true; continue; - }else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS) { + } else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI) { + int res; + if (i == 0) { + res = R.raw.premium_object_smile1; + } else if (i == 1) { + res = R.raw.premium_object_smile2; + } else { + res = R.raw.premium_object_like; + } + stars[i] = SvgHelper.getBitmap(res, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); + svg = true; + continue; + } else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS) { int res; if (i == 0) { res = R.raw.premium_object_adsbubble; @@ -300,10 +318,6 @@ public class StarParticlesView extends View { } } - float a; - float a1; - float a2; - public void onDraw(Canvas canvas) { onDraw(canvas, 1f); } @@ -354,15 +368,14 @@ public class StarParticlesView extends View { } } - long pausedTime; + public class Particle { + public long lifeTime; - private class Particle { private float x, y; private float x2, y2; private float drawingX, drawingY; private float vecX, vecY; private int starIndex; - private long lifeTime; private int alpha; private float randomRotate; float inProgress; @@ -496,7 +509,12 @@ public class StarParticlesView extends View { } else { alpha = (int) (255 * ((50 + Utilities.fastRandom.nextInt(50)) / 100f)); } - if ((type == PremiumPreviewFragment.PREMIUM_FEATURE_PROFILE_BADGE && (starIndex == 1 || starIndex == 2)) || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS) { + if ((type == PremiumPreviewFragment.PREMIUM_FEATURE_PROFILE_BADGE && (starIndex == 1 || starIndex == 2)) || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI + ) { randomRotate = (int) (45 * ((Utilities.fastRandom.nextInt() % 100) / 100f)); } if (type != TYPE_SETTINGS) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/VideoScreenPreview.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/VideoScreenPreview.java index e4a1c9d85..bd9e5d712 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/VideoScreenPreview.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/VideoScreenPreview.java @@ -104,7 +104,11 @@ public class VideoScreenPreview extends FrameLayout implements PagerHeaderView, if (type == PremiumPreviewFragment.PREMIUM_FEATURE_UPLOAD_LIMIT) { matrixParticlesDrawable = new MatrixParticlesDrawable(); matrixParticlesDrawable.init(); - } else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_PROFILE_BADGE || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS) { + } else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_PROFILE_BADGE || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI) { starDrawable = new StarParticlesView.Drawable(40); starDrawable.speedScale = 3; starDrawable.type = type; @@ -147,7 +151,7 @@ public class VideoScreenPreview extends FrameLayout implements PagerHeaderView, starDrawable.init(); } - if (type == PremiumPreviewFragment.PREMIUM_FEATURE_UPLOAD_LIMIT || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS) { + if (type == PremiumPreviewFragment.PREMIUM_FEATURE_UPLOAD_LIMIT || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI) { fromTop = true; } @@ -288,7 +292,11 @@ public class VideoScreenPreview extends FrameLayout implements PagerHeaderView, matrixParticlesDrawable.excludeRect.inset(AndroidUtilities.dp(16), AndroidUtilities.dp(16)); } if (starDrawable != null) { - if (type == PremiumPreviewFragment.PREMIUM_FEATURE_PROFILE_BADGE || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS) { + if (type == PremiumPreviewFragment.PREMIUM_FEATURE_PROFILE_BADGE || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS || + type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI) { starDrawable.rect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); starDrawable.rect.inset(AndroidUtilities.dp(30), AndroidUtilities.dp(30)); } else { 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 4b279db69..a9983caca 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java @@ -13,21 +13,25 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Animatable; import android.graphics.drawable.BitmapDrawable; import android.os.Handler; import android.os.Looper; -import android.os.SystemClock; import android.text.TextUtils; import android.view.HapticFeedbackConstants; import android.view.View; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.DispatchQueue; import org.telegram.messenger.DispatchQueuePool; +import org.telegram.messenger.DispatchQueuePoolBackground; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.R; import org.telegram.messenger.Utilities; +import org.telegram.messenger.utils.BitmapsCache; import java.io.File; import java.io.FileInputStream; @@ -35,13 +39,11 @@ import java.io.InputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -public class RLottieDrawable extends BitmapDrawable implements Animatable { +public class RLottieDrawable extends BitmapDrawable implements Animatable, BitmapsCache.Cacheable { + + public boolean skipFrameUpdate; public static native long create(String src, String json, int w, int h, int[] params, boolean precache, int[] colorReplacement, boolean limitFps, int fitzModifier); protected static native long createWithJson(String json, String name, int[] params, int[] colorReplacement); @@ -49,11 +51,9 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { private static native void setLayerColor(long ptr, String layer, int color); private static native void replaceColors(long ptr, int[] colorReplacement); public static native int getFrame(long ptr, int frame, Bitmap bitmap, int w, int h, int stride, boolean clear); - private static native void createCache(long ptr, int w, int h); - private static native String getCacheFile(long ptr); - protected int width; - protected int height; + protected final int width; + protected final int height; protected final int[] metaData = new int[3]; protected int timeBetweenFrames; protected int customEndFrame = -1; @@ -63,18 +63,21 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { private HashMap newColorUpdates = new HashMap<>(); private volatile HashMap pendingColorUpdates = new HashMap<>(); private HashMap vibrationPattern; + private boolean allowVibration = true; private WeakReference frameReadyCallback; protected WeakReference onFinishCallback; private int finishFrame; private View currentParentView; + private ArrayList parentViews = new ArrayList<>(); protected int isDice; protected int diceSwitchFramesCount = -1; protected int autoRepeat = 1; protected int autoRepeatPlayCount; + protected long autoRepeatTimeout; private long lastFrameTime; protected volatile boolean nextFrameIsLast; @@ -100,7 +103,9 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { private float scaleY = 1.0f; private boolean applyTransformation; private boolean needScale; - private final Rect dstRect = new Rect(); + private final RectF dstRect = new RectF(); + private RectF dstRectBackground; + private Paint backgroundPaint; protected static final Handler uiHandler = new Handler(Looper.getMainLooper()); protected volatile boolean isRunning; protected volatile boolean isRecycled; @@ -119,20 +124,17 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { private static ThreadLocal readBufferLocal = new ThreadLocal<>(); private static ThreadLocal bufferLocal = new ThreadLocal<>(); - private ArrayList> parentViews = new ArrayList<>(); - private static final DispatchQueuePool loadFrameRunnableQueue = new DispatchQueuePool(2); - private static final DispatchQueuePool largeSizeLoadFrameRunnableQueue = new DispatchQueuePool(4); - private static ThreadPoolExecutor lottieCacheGenerateQueue; - private static HashSet generatingCacheFiles = new HashSet<>(); + private static final DispatchQueuePool loadFrameRunnableQueue = new DispatchQueuePool(4); + public static DispatchQueue lottieCacheGenerateQueue; File file; - File cacheFile; boolean precache; private Runnable onAnimationEndListener; private Runnable onFrameReadyRunnable; - private DispatchQueuePool loadFrameQueue = loadFrameRunnableQueue; + private View masterParent; + NativePtrArgs args; protected Runnable uiRunnableNoFrame = new Runnable() { @Override @@ -158,25 +160,20 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } }; - private Runnable uiRunnableLastFrame = new Runnable() { - @Override - public void run() { - singleFrameDecoded = true; - isRunning = false; - invalidateInternal(); - decodeFrameFinishedInternal(); - } - }; - long startTime; + boolean generatingCache; private Runnable uiRunnableGenerateCache = new Runnable() { @Override public void run() { - if (!isRecycled && !destroyWhenDone && nativePtr != 0) { + if (!isRecycled && !destroyWhenDone && canLoadFrames() && cacheGenerateTask == null) { startTime = System.currentTimeMillis(); - lottieCacheGenerateQueue.execute(cacheGenerateTask = () -> { - createCache(nativePtr, width, height); + generatingCache = true; + lottieCacheGenerateQueue.postRunnable(cacheGenerateTask = () -> { + BitmapsCache bitmapsCacheFinal = bitmapsCache; + if (bitmapsCacheFinal != null) { + bitmapsCacheFinal.createCache(); + } uiHandler.post(uiRunnableCacheFinished); }); } @@ -187,16 +184,22 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { @Override public void run() { cacheGenerateTask = null; - generatingCacheFiles.remove(cacheFile.getPath()); + generatingCache = false; decodeFrameFinishedInternal(); } }; + BitmapsCache bitmapsCache; + int generateCacheFramePointer; + + public static void createCacheGenQueue() { + lottieCacheGenerateQueue = new DispatchQueue("cache generator queue"); + } + protected void checkRunningTasks() { if (cacheGenerateTask != null) { - if (lottieCacheGenerateQueue.remove(cacheGenerateTask)) { - cacheGenerateTask = null; - } + lottieCacheGenerateQueue.cancelRunnable(cacheGenerateTask); + cacheGenerateTask = null; } if (!hasParentView() && nextRenderingBitmap != null && loadFrameTask != null) { loadFrameTask = null; @@ -216,7 +219,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } } } - if (nativePtr == 0 && secondNativePtr == 0) { + if (nativePtr == 0 && secondNativePtr == 0 && bitmapsCache == null) { recycleResources(); return; } @@ -250,13 +253,14 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } } + private boolean genCacheSend; protected Runnable loadFrameRunnable = new Runnable() { @Override public void run() { if (isRecycled) { return; } - if (nativePtr == 0 || isDice == 2 && secondNativePtr == 0) { + if (!canLoadFrames() || isDice == 2 && secondNativePtr == 0) { if (frameWaitSync != null) { frameWaitSync.countDown(); } @@ -281,7 +285,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } catch (Exception ignore) { } - if (pendingReplaceColors != null) { + if (pendingReplaceColors != null && nativePtr != 0) { replaceColors(nativePtr, pendingReplaceColors); pendingReplaceColors = null; } @@ -297,7 +301,24 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } else { ptrToUse = nativePtr; } - int result = getFrame(ptrToUse, currentFrame, backgroundBitmap, width, height, backgroundBitmap.getRowBytes(), true); + int result = 0; + int framesPerUpdates = shouldLimitFps ? 2 : 1; + if (precache && bitmapsCache != null) { + try { + result = bitmapsCache.getFrame(currentFrame / framesPerUpdates, backgroundBitmap); + } catch (Exception e) { + FileLog.e(e); + } + } else { + result = getFrame(ptrToUse, currentFrame, backgroundBitmap, width, height, backgroundBitmap.getRowBytes(), true); + } + if (bitmapsCache != null && bitmapsCache.needGenCache()) { + if (!genCacheSend) { + genCacheSend = true; + uiHandler.post(uiRunnableGenerateCache); + } + result = -1; + } if (result == -1) { uiHandler.post(uiRunnableNoFrame); if (frameWaitSync != null) { @@ -305,12 +326,9 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } return; } - if (metaData[2] != 0) { - uiHandler.post(uiRunnableGenerateCache); - metaData[2] = 0; - } + nextRenderingBitmap = backgroundBitmap; - int framesPerUpdates = shouldLimitFps ? 2 : 1; + if (isDice == 1) { if (currentFrame + framesPerUpdates < (diceSwitchFramesCount == -1 ? metaData[0] : diceSwitchFramesCount)) { currentFrame += framesPerUpdates; @@ -380,61 +398,76 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } }; - public RLottieDrawable(File file, int w, int h, boolean precache, boolean limitFps) { - this(file, w, h, precache, limitFps, null, 0); + public RLottieDrawable(File file, int w, int h, BitmapsCache.CacheOptions cacheOptions, boolean limitFps) { + this(file, w, h, cacheOptions, limitFps, null, 0); } - public RLottieDrawable(File file, int w, int h, boolean precache, boolean limitFps, int[] colorReplacement, int fitzModifier) { + public RLottieDrawable(File file, int w, int h, BitmapsCache.CacheOptions cacheOptions, boolean limitFps, int[] colorReplacement, int fitzModifier) { width = w; height = h; shouldLimitFps = limitFps; + this.precache = cacheOptions != null; getPaint().setFlags(Paint.FILTER_BITMAP_FLAG); this.file = file; - nativePtr = create(file.getAbsolutePath(), null, w, h, metaData, precache, colorReplacement, shouldLimitFps, fitzModifier); if (precache && lottieCacheGenerateQueue == null) { - lottieCacheGenerateQueue = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); + createCacheGenQueue(); } - if (w > AndroidUtilities.dp(120) || h > AndroidUtilities.dp(120)) { - loadFrameQueue = largeSizeLoadFrameRunnableQueue; + if (precache) { + bitmapsCache = new BitmapsCache(file, this, cacheOptions, w, h); + args = new NativePtrArgs(); + args.file = file.getAbsoluteFile(); + args.json = null; + args.colorReplacement = colorReplacement; + args.fitzModifier = fitzModifier; + nativePtr = create(file.getAbsolutePath(), null, w, h, metaData, precache, colorReplacement, shouldLimitFps, fitzModifier); + destroy(nativePtr); + nativePtr = 0; } else { - loadFrameQueue = loadFrameRunnableQueue; - } - if (nativePtr == 0) { - file.delete(); - } - String cacheFilePath = getCacheFile(nativePtr); - if (cacheFilePath != null) { - cacheFile = new File(cacheFilePath); + nativePtr = create(file.getAbsolutePath(), null, w, h, metaData, precache, colorReplacement, shouldLimitFps, fitzModifier); + if (nativePtr == 0) { + file.delete(); + } } + if (shouldLimitFps && metaData[1] < 60) { shouldLimitFps = false; } timeBetweenFrames = Math.max(shouldLimitFps ? 33 : 16, (int) (1000.0f / metaData[1])); } - public RLottieDrawable(File file, String json, int w, int h, boolean precache, boolean limitFps, int[] colorReplacement, int fitzModifier) { + public RLottieDrawable(File file, String json, int w, int h, BitmapsCache.CacheOptions options, boolean limitFps, int[] colorReplacement, int fitzModifier) { width = w; height = h; shouldLimitFps = limitFps; + this.precache = options != null; getPaint().setFlags(Paint.FILTER_BITMAP_FLAG); - - nativePtr = create(file.getAbsolutePath(), json, w, h, metaData, precache, colorReplacement, shouldLimitFps, fitzModifier); if (precache && lottieCacheGenerateQueue == null) { - lottieCacheGenerateQueue = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); + createCacheGenQueue(); } - if (nativePtr == 0) { - file.delete(); + if (precache) { + bitmapsCache = new BitmapsCache(file, this, options, w, h); + args = new NativePtrArgs(); + args.file = file.getAbsoluteFile(); + args.json = json; + args.colorReplacement = colorReplacement; + args.fitzModifier = fitzModifier; + nativePtr = create(file.getAbsolutePath(), json, w, h, metaData, precache, colorReplacement, shouldLimitFps, fitzModifier); + if (nativePtr != 0) { + destroy(nativePtr); + } + nativePtr = 0; + } else { + nativePtr = create(file.getAbsolutePath(), json, w, h, metaData, precache, colorReplacement, shouldLimitFps, fitzModifier); + if (nativePtr == 0) { + file.delete(); + } } + if (shouldLimitFps && metaData[1] < 60) { shouldLimitFps = false; } timeBetweenFrames = Math.max(shouldLimitFps ? 33 : 16, (int) (1000.0f / metaData[1])); - if (w > AndroidUtilities.dp(100) || w > AndroidUtilities.dp(100)) { - loadFrameQueue = largeSizeLoadFrameRunnableQueue; - } else { - loadFrameQueue = loadFrameRunnableQueue; - } } public RLottieDrawable(int rawRes, String name, int w, int h) { @@ -639,63 +672,31 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { return metaData[0]; } - public void addParentView(View view) { - if (view == null) { + public void addParentView(ImageReceiver parent) { + if (parent == null) { return; } - for (int a = 0, N = parentViews.size(); a < N; a++) { - if (parentViews.get(a).get() == view) { - return; - } else if (parentViews.get(a).get() == null) { - parentViews.remove(a); - N--; - a--; - } - } - parentViews.add(0, new WeakReference<>(view)); + parentViews.add(parent); } - public void removeParentView(View view) { - if (view == null) { + public void removeParentView(ImageReceiver parent) { + if (parent == null) { return; } - for (int a = 0, N = parentViews.size(); a < N; a++) { - View v = parentViews.get(a).get(); - if (v == view || v == null) { - parentViews.remove(a); - N--; - a--; - } - } + parentViews.remove(parent); } + protected boolean hasParentView() { - if (getCallback() != null) { - return true; - } - for (int a = 0, N = parentViews.size(); a < N; a++) { - View view = parentViews.get(a).get(); - if (view != null) { - return true; - } else { - parentViews.remove(a); - N--; - a--; - } - } - return false; + return !parentViews.isEmpty() || masterParent != null || getCallback() != null; } protected void invalidateInternal() { - for (int a = 0, N = parentViews.size(); a < N; a++) { - View view = parentViews.get(a).get(); - if (view != null) { - view.invalidate(); - } else { - parentViews.remove(a); - N--; - a--; - } + for (int i = 0; i < parentViews.size(); i++) { + parentViews.get(i).invalidate(); + } + if (masterParent != null) { + masterParent.invalidate(); } if (getCallback() != null) { invalidateSelf(); @@ -715,7 +716,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { checkRunningTasks(); if (loadingInBackground || secondLoadingInBackground) { destroyAfterLoading = true; - } else if (loadFrameTask == null && cacheGenerateTask == null) { + } else if (loadFrameTask == null && cacheGenerateTask == null && !generatingCache) { if (nativePtr != 0) { destroy(nativePtr); nativePtr = 0; @@ -724,6 +725,10 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { destroy(secondNativePtr); secondNativePtr = 0; } + if (bitmapsCache != null) { + bitmapsCache.recycle(); + bitmapsCache = null; + } recycleResources(); } else { destroyWhenDone = true; @@ -737,6 +742,10 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { autoRepeat = value; } + public void setAutoRepeatTimeout(long timeout) { + autoRepeatTimeout = timeout; + } + @Override protected void finalize() throws Throwable { try { @@ -828,7 +837,14 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } protected boolean scheduleNextGetFrame() { - if (loadFrameTask != null || nextRenderingBitmap != null || nativePtr == 0 || loadingInBackground || destroyWhenDone || !isRunning && (!decodeSingleFrame || decodeSingleFrame && singleFrameDecoded)) { + return scheduleNextGetFrame(false); + } + + protected boolean scheduleNextGetFrame(boolean allowGroupedUpdateLocal) { + if (loadFrameTask != null || nextRenderingBitmap != null || !canLoadFrames() || loadingInBackground || destroyWhenDone || !isRunning && (!decodeSingleFrame || decodeSingleFrame && singleFrameDecoded)) { + return false; + } + if (generatingCache) { return false; } if (!newColorUpdates.isEmpty()) { @@ -839,7 +855,12 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { pendingReplaceColors = newReplaceColors; newReplaceColors = null; } - loadFrameQueue.execute(loadFrameTask = loadFrameRunnable); + loadFrameTask = loadFrameRunnable; + if (allowGroupedUpdateLocal && shouldLimitFps) { + DispatchQueuePoolBackground.execute(loadFrameTask); + } else { + loadFrameRunnableQueue.execute(loadFrameTask); + } return true; } @@ -887,7 +908,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { if (resetFrame && !isRunning) { isRunning = true; } - if (scheduleNextGetFrame()) { + if (scheduleNextGetFrame(false)) { if (!async) { try { frameWaitSync.await(); @@ -924,28 +945,6 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { currentParentView = view; } - private boolean isCurrentParentViewMaster() { - if (getCallback() != null) { - return true; - } - if (parentViews.size() <= 1) { - return true; - } - for (int a = 0, N = parentViews.size(); a < N; a++) { - View view = parentViews.get(a).get(); - if (view == null) { - parentViews.remove(a); - N--; - a--; - continue; - } - if (!view.isShown()) { - continue; - } - return view == currentParentView; - } - return true; - } @Override public boolean isRunning() { @@ -1009,54 +1008,89 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } } } - scheduleNextGetFrame(); + scheduleNextGetFrame(true); } @Override public void draw(Canvas canvas) { - if (nativePtr == 0 || destroyWhenDone) { + drawInternal(canvas, false, 0); + } + + public void drawInBackground(Canvas canvas, float x, float y, float w, float h, int alpha) { + if (dstRectBackground == null) { + dstRectBackground = new RectF(); + backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + backgroundPaint.setFilterBitmap(true); + } + backgroundPaint.setAlpha(alpha); + dstRectBackground.set(x, y, x + w, y + h); + drawInternal(canvas, true, 0); + } + + public void drawInternal(Canvas canvas, boolean drawInBackground, long time) { + if (!canLoadFrames() || destroyWhenDone) { + return; + } + if (!drawInBackground) { + updateCurrentFrame(time, false); + } + + RectF rect = drawInBackground ? dstRectBackground : dstRect; + Paint paint = drawInBackground ? backgroundPaint : getPaint(); + + if (paint.getAlpha() == 0) { return; } - updateCurrentFrame(); if (!isInvalid && renderingBitmap != null) { - if (applyTransformation) { - dstRect.set(getBounds()); - scaleX = (float) dstRect.width() / width; - scaleY = (float) dstRect.height() / height; - applyTransformation = false; - needScale = !(Math.abs(dstRect.width() - width) < AndroidUtilities.dp(1) && Math.abs(dstRect.width() - width) < AndroidUtilities.dp(1)); + float scaleX, scaleY; + boolean needScale; + if (!drawInBackground) { + rect.set(getBounds()); + if (applyTransformation) { + this.scaleX = rect.width() / width; + this.scaleY = rect.height() / height; + applyTransformation = false; + this.needScale = !(Math.abs(rect.width() - width) < AndroidUtilities.dp(1) && Math.abs(rect.height() - height) < AndroidUtilities.dp(1)); + } + scaleX = this.scaleX; + scaleY = this.scaleY; + needScale = this.needScale; + } else { + scaleX = rect.width() / width; + scaleY = rect.height() / height; + needScale = !(Math.abs(rect.width() - width) < AndroidUtilities.dp(1) && Math.abs(rect.height() - height) < AndroidUtilities.dp(1)); } if (!needScale) { - canvas.drawBitmap(renderingBitmap, dstRect.left, dstRect.top, getPaint()); + canvas.drawBitmap(renderingBitmap, rect.left, rect.top, paint); } else { canvas.save(); - canvas.translate(dstRect.left, dstRect.top); + canvas.translate(rect.left, rect.top); canvas.scale(scaleX, scaleY); - canvas.drawBitmap(renderingBitmap, 0, 0, getPaint()); + canvas.drawBitmap(renderingBitmap, 0, 0, paint); canvas.restore(); } - if (isRunning) { + if (isRunning && !drawInBackground) { invalidateInternal(); } } } - public void updateCurrentFrame() { - long now = SystemClock.elapsedRealtime(); - long timeDiff = Math.abs(now - lastFrameTime); + public void updateCurrentFrame(long time, boolean updateInBackground) { + long now = time == 0 ? System.currentTimeMillis() : time; + long timeDiff = now - lastFrameTime; int timeCheck; - if (AndroidUtilities.screenRefreshRate <= 60) { + if (AndroidUtilities.screenRefreshRate <= 60 || (updateInBackground && AndroidUtilities.screenRefreshRate <= 80)) { timeCheck = timeBetweenFrames - 6; } else { timeCheck = timeBetweenFrames; } if (isRunning) { if (renderingBitmap == null && nextRenderingBitmap == null) { - scheduleNextGetFrame(); - } else if (nextRenderingBitmap != null && (renderingBitmap == null || timeDiff >= timeCheck)) { - if (vibrationPattern != null && currentParentView != null) { + scheduleNextGetFrame(true); + } else if (nextRenderingBitmap != null && (renderingBitmap == null || (timeDiff >= timeCheck && !skipFrameUpdate))) { + if (vibrationPattern != null && currentParentView != null && allowVibration) { Integer force = vibrationPattern.get(currentFrame - 1); if (force != null) { currentParentView.performHapticFeedback(force == 1 ? HapticFeedbackConstants.LONG_PRESS : HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); @@ -1069,6 +1103,10 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } } + public void setAllowVibration(boolean allow) { + allowVibration = allow; + } + @Override public int getMinimumHeight() { return height; @@ -1101,7 +1139,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { } public boolean hasBitmap() { - return nativePtr != 0 && (renderingBitmap != null || nextRenderingBitmap != null) && !isInvalid; + return !isRecycled && (renderingBitmap != null || nextRenderingBitmap != null) && !isInvalid; } public void setInvalidateOnProgressSet(boolean value) { @@ -1119,4 +1157,75 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { public boolean isLastFrame() { return currentFrame == getFramesCount() - 1; } + + long generateCacheNativePtr; + + @Override + public void prepareForGenerateCache() { + generateCacheNativePtr = create(args.file.toString(), args.json, width, height, new int[3], false, args.colorReplacement, false, args.fitzModifier); + if (generateCacheNativePtr == 0) { + file.delete(); + } + } + + @Override + public int getNextFrame(Bitmap bitmap) { + if (generateCacheNativePtr == 0) { + return -1; + } + int framesPerUpdates = shouldLimitFps ? 2 : 1; + + int result = getFrame(generateCacheNativePtr, generateCacheFramePointer, bitmap, width, height, bitmap.getRowBytes(), true); + if (result == -5) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return getNextFrame(bitmap); + } + generateCacheFramePointer += framesPerUpdates; + if (generateCacheFramePointer > metaData[0]) { + return 0; + } + return 1; + } + + @Override + public void releaseForGenerateCache() { + if (generateCacheNativePtr != 0) { + destroy(generateCacheNativePtr); + generateCacheNativePtr = 0; + } + } + + @Override + public Bitmap getFirstFrame(Bitmap bitmap) { + long nativePtr = create(args.file.toString(), args.json, width, height, new int[3], false, args.colorReplacement, false, args.fitzModifier); + if (nativePtr == 0) { + return bitmap; + } + getFrame(nativePtr, 0, bitmap, width, height, bitmap.getRowBytes(), true); + destroy(nativePtr); + return bitmap; + } + + void setMasterParent(View parent) { + masterParent = parent; + } + + public boolean canLoadFrames() { + if (precache) { + return bitmapsCache != null; + } else { + return nativePtr != 0; + } + } + + private class NativePtrArgs { + public int[] colorReplacement; + public int fitzModifier; + File file; + String json; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieImageView.java index 90179ea62..ee890df89 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieImageView.java @@ -1,9 +1,24 @@ package org.telegram.ui.Components; import android.content.Context; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; import android.widget.ImageView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DocumentObject; +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.ImageLoader; +import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.SvgHelper; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; import java.util.HashMap; @@ -11,6 +26,7 @@ public class RLottieImageView extends ImageView { private HashMap layerColors; private RLottieDrawable drawable; + private ImageReceiver imageReceiver; private boolean autoRepeat; private boolean attachedToWindow; private boolean playing; @@ -58,7 +74,12 @@ public class RLottieImageView extends ImageView { if (drawable == lottieDrawable) { return; } + if (imageReceiver != null) { + imageReceiver.onDetachedFromWindow(); + imageReceiver = null; + } drawable = lottieDrawable; + drawable.setMasterParent(this); if (autoRepeat) { drawable.setAutoRepeat(1); } @@ -73,10 +94,78 @@ public class RLottieImageView extends ImageView { setImageDrawable(drawable); } + + public void setAnimation(TLRPC.Document document, int w, int h) { + if (imageReceiver != null) { + imageReceiver.onDetachedFromWindow(); + imageReceiver = null; + } + if (document == null) { + return; + } + imageReceiver = new ImageReceiver(); + if ("video/webm".equals(document.mime_type)) { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); + imageReceiver.setImage(ImageLocation.getForDocument(document), w + "_" + h + "_pcache_" + ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForDocument(thumb, document), null, null, document.size, null, document, 1); + } else { + Drawable thumbDrawable = null; + String probableCacheKey = document.id + "@" + w + "_" + h; + if (!ImageLoader.getInstance().hasLottieMemCache(probableCacheKey)) { + SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document.thumbs, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); + if (svgThumb != null) { + svgThumb.overrideWidthAndHeight(512, 512); + } + thumbDrawable = svgThumb; + } + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); + imageReceiver.setImage(ImageLocation.getForDocument(document), w + "_" + h, ImageLocation.getForDocument(thumb, document), null, null, null, thumbDrawable, 0, null, document, 1); + } + imageReceiver.setAspectFit(true); + imageReceiver.setParentView(this); + imageReceiver.setAutoRepeat(1); + imageReceiver.setAllowStartLottieAnimation(true); + imageReceiver.setAllowStartAnimation(true); + imageReceiver.clip = false; + + setImageDrawable(new Drawable() { + + @Override + public void draw(@NonNull Canvas canvas) { + AndroidUtilities.rectTmp2.set(getBounds()); + AndroidUtilities.rectTmp2.inset(AndroidUtilities.dp(11), AndroidUtilities.dp(11)); + imageReceiver.setImageCoords(AndroidUtilities.rectTmp2); + imageReceiver.draw(canvas); + } + + @Override + public void setAlpha(int alpha) { + imageReceiver.setAlpha(alpha / 255f); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + imageReceiver.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + }); + + if (attachedToWindow) { + imageReceiver.onAttachedToWindow(); + } + } + public void clearAnimationDrawable() { if (drawable != null) { drawable.stop(); } + if (imageReceiver != null) { + imageReceiver.onDetachedFromWindow(); + imageReceiver = null; + } drawable = null; setImageDrawable(null); } @@ -85,6 +174,9 @@ public class RLottieImageView extends ImageView { protected void onAttachedToWindow() { super.onAttachedToWindow(); attachedToWindow = true; + if (imageReceiver != null) { + imageReceiver.onAttachedToWindow(); + } if (drawable != null) { drawable.setCallback(this); if (playing) { @@ -100,6 +192,10 @@ public class RLottieImageView extends ImageView { if (drawable != null) { drawable.stop(); } + if (imageReceiver != null) { + imageReceiver.onDetachedFromWindow(); + imageReceiver = null; + } } public boolean isPlaying() { @@ -130,6 +226,9 @@ public class RLottieImageView extends ImageView { playing = true; if (attachedToWindow) { drawable.start(); + if (imageReceiver != null) { + imageReceiver.startAnimation(); + } } else { startOnAttach = true; } @@ -142,6 +241,9 @@ public class RLottieImageView extends ImageView { playing = false; if (attachedToWindow) { drawable.stop(); + if (imageReceiver != null) { + imageReceiver.stopAnimation(); + } } else { startOnAttach = false; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java index 8b26004dd..69abeb613 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java @@ -197,7 +197,7 @@ public class ReactionsEffectOverlay { sizeForFilter = (int) (2f * size / AndroidUtilities.density); } else if (animationType == SHORT_ANIMATION) { size = AndroidUtilities.dp(80); - sizeForFilter = (int) (2f * size / AndroidUtilities.density); + sizeForFilter = sizeForAroundReaction(); } else { size = Math.round(Math.min(AndroidUtilities.dp(350), Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) * 0.8f); sizeForFilter = sizeForBigReaction(); @@ -720,6 +720,11 @@ public class ReactionsEffectOverlay { return (int) (Math.round(Math.min(AndroidUtilities.dp(350), Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) * 0.7f) / AndroidUtilities.density); } + public static int sizeForAroundReaction() { + int size = AndroidUtilities.dp(80); + return (int) (2f * size / AndroidUtilities.density); + } + private class AvatarParticle { ImageReceiver imageReceiver; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java index 57541619f..0f70249c4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java @@ -213,11 +213,9 @@ public class ReactionsLayoutInBubble { } } int last = reactionButtons.size() - 1; - if (fromP != last) { - int lineOffset = availableWidth - (reactionButtons.get(last).x + reactionButtons.get(last).width); - for (int k = fromP; k <= last; k++) { - reactionButtons.get(k).x += lineOffset; - } + int lineOffset = availableWidth - (reactionButtons.get(last).x + reactionButtons.get(last).width); + for (int k = fromP; k <= last; k++) { + reactionButtons.get(k).x += lineOffset; } } lastLineX = currentX; 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 41617d7f5..d1f3193de 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionsContainerLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionsContainerLayout.java @@ -284,6 +284,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio invalidateShaders(); bgPaint.setColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuBackground, resourcesProvider)); + MediaDataController.getInstance(currentAccount).preloadReactions(); } private boolean showUnlockPremiumButton() { @@ -449,6 +450,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio shadow.draw(canvas); canvas.drawCircle(cx, cy, sr, bgPaint); canvas.restore(); + invalidate(); } private void checkPressedProgressForOtherViews(View view) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerAnimationScrollHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerAnimationScrollHelper.java index b2fe324d1..cd2c28361 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerAnimationScrollHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerAnimationScrollHelper.java @@ -164,6 +164,9 @@ public class RecyclerAnimationScrollHelper { if (view.getParent() == null) { recyclerView.addView(view); layoutManager.ignoreView(view); + if (animationCallback != null) { + animationCallback.ignoreView(view, true); + } } if (view instanceof ChatMessageCell) { ((ChatMessageCell) view).setAnimationRunning(true, true); @@ -174,6 +177,10 @@ public class RecyclerAnimationScrollHelper { oldT = 0; } + if (animationCallback != null) { + animationCallback.onPreAnimation(); + } + final int scrollLength ; if (oldViews.isEmpty()) { scrollLength = Math.abs(scrollDiff); @@ -233,6 +240,7 @@ public class RecyclerAnimationScrollHelper { layoutManager.stopIgnoringView(view); recyclerView.removeView(view); if (animationCallback != null) { + animationCallback.ignoreView(view, false); animationCallback.recycleView(view); } } @@ -286,7 +294,7 @@ public class RecyclerAnimationScrollHelper { if (hasSameViews) { duration = 600; } else { - duration = (long) (((scrollLength / (float) recyclerView.getMeasuredHeight()) + 1f) * 200L); + duration = (long) (((scrollLength / (float) recyclerView.getMeasuredHeight()) + 1f) * 200L); if (duration < 300) { duration = 300; } @@ -353,6 +361,14 @@ public class RecyclerAnimationScrollHelper { public void recycleView(View view) { } + + public void onPreAnimation() { + + } + + public void ignoreView(View view, boolean ignore) { + + } } public static abstract class AnimatableAdapter extends RecyclerListView.SelectionAdapter { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java index 4ba91be3f..022374d23 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java @@ -19,6 +19,7 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; @@ -45,6 +46,7 @@ import android.widget.FrameLayout; import androidx.annotation.IntDef; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; +import androidx.core.util.Consumer; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -165,6 +167,8 @@ public class RecyclerListView extends RecyclerView { HashSet selectedPositions; RecyclerItemsEnterAnimator itemsEnterAnimator; + Consumer selectorTransformer; + protected final Theme.ResourcesProvider resourcesProvider; private boolean accessibilityEnabled = true; @@ -179,6 +183,10 @@ public class RecyclerListView extends RecyclerView { } }; + public void setSelectorTransformer(Consumer transformer) { + selectorTransformer = transformer; + } + public FastScroll getFastScroll() { return fastScroll; } @@ -2210,6 +2218,10 @@ public class RecyclerListView extends RecyclerView { } } + public Rect getSelectorRect() { + return selectorRect; + } + @Override protected void dispatchDraw(Canvas canvas) { if (itemsEnterAnimator != null) { @@ -2218,12 +2230,22 @@ public class RecyclerListView extends RecyclerView { if (drawSelectorBehind && !selectorRect.isEmpty()) { selectorDrawable.setBounds(selectorRect); + canvas.save(); + if (selectorTransformer != null) { + selectorTransformer.accept(canvas); + } selectorDrawable.draw(canvas); + canvas.restore(); } super.dispatchDraw(canvas); if (!drawSelectorBehind && !selectorRect.isEmpty()) { selectorDrawable.setBounds(selectorRect); + canvas.save(); + if (selectorTransformer != null) { + selectorTransformer.accept(canvas); + } selectorDrawable.draw(canvas); + canvas.restore(); } if (overlayContainer != null) { overlayContainer.draw(canvas); 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 7f144ed46..33a831ce2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTabStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTabStrip.java @@ -15,6 +15,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Build; @@ -80,6 +81,10 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { private int tabCount; private int currentPosition; + private AnimatedFloat currentPositionAnimated = new AnimatedFloat(this, 350, CubicBezierInterpolator.EASE_OUT_QUINT); + private RectF leftTabBounds = new RectF(); + private RectF rightTabBounds = new RectF(); + private RectF tabBounds = new RectF(); private boolean animateFromPosition; private float startAnimationPosition; private float positionAnimationProgress; @@ -163,7 +168,7 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { } }; tabsContainer.setOrientation(LinearLayout.HORIZONTAL); - tabsContainer.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0); + tabsContainer.setPadding(AndroidUtilities.dp(9.5f), 0, AndroidUtilities.dp(9.5f), 0); tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); addView(tabsContainer); @@ -308,18 +313,20 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { return textView; } - public ImageView addIconTab(int id, Drawable drawable) { + public FrameLayout addIconTab(int id, Drawable drawable) { String key = "tab" + id; final int position = tabCount++; - ImageView tab = (ImageView) prevTypes.get(key); + FrameLayout tab = (FrameLayout) prevTypes.get(key); if (tab != null) { checkViewIndex(key, tab, position); } else { - tab = new ImageView(getContext()); + tab = new FrameLayout(getContext()); + ImageView imageView = new ImageView(getContext()); + imageView.setImageDrawable(drawable); + imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); + tab.addView(imageView, LayoutHelper.createFrame(StickerTabView.IMAGE_ICON_SMALL_SIZE, StickerTabView.IMAGE_ICON_SMALL_SIZE, Gravity.CENTER)); tab.setFocusable(true); - tab.setImageDrawable(drawable); - tab.setScaleType(ImageView.ScaleType.CENTER); tab.setOnClickListener(v -> delegate.onPageSelected((Integer) v.getTag(R.id.index_tag))); tabsContainer.addView(tab, position); } @@ -448,7 +455,8 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { ValueAnimator expandStickerAnimator; float expandProgress; - private float stickerTabExpandedWidth = AndroidUtilities.dp(86); + public static float EXPANDED_WIDTH = 64; + private float stickerTabExpandedWidth = AndroidUtilities.dp(EXPANDED_WIDTH); private float stickerTabWidth = AndroidUtilities.dp(StickerTabView.SMALL_WIDTH); private float expandOffset; private int scrollByOnNextMeasure = -1; @@ -544,7 +552,7 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { if (child instanceof StickerTabView) { ((StickerTabView) child).setExpanded(true); } - child.getLayoutParams().width = AndroidUtilities.dp(86); + child.getLayoutParams().width = AndroidUtilities.dp(EXPANDED_WIDTH); } tabsContainer.requestLayout(); @@ -611,7 +619,7 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { } public void setImages() { - float tabSize = AndroidUtilities.dp(StickerTabView.SMALL_WIDTH) + AndroidUtilities.dp(86 - StickerTabView.SMALL_WIDTH) * expandProgress; + float tabSize = AndroidUtilities.dp(StickerTabView.SMALL_WIDTH) + AndroidUtilities.dp(EXPANDED_WIDTH - StickerTabView.SMALL_WIDTH) * expandProgress; float scrollOffset = animateToExpanded ? expandOffset * (1f - expandProgress) : 0; int start = (int) ((getScrollX() - scrollOffset - tabsContainer.getPaddingLeft()) / tabSize); int end = Math.min(tabsContainer.getChildCount(), start + (int) Math.ceil(getMeasuredWidth() / tabSize) + 1); @@ -670,19 +678,23 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { continue; } + if (!tabView.inited && tabView.svgThumb == null && sticker != null) { + tabView.svgThumb = DocumentObject.getSvgThumb(sticker, Theme.key_emptyListPlaceholder, 0.2f); + } + if (imageLocation == null) { continue; } tabView.inited = true; SvgHelper.SvgDrawable svgThumb = tabView.svgThumb; BackupImageView imageView = tabView.imageView; - if (object instanceof TLRPC.Document && MessageObject.isVideoSticker(sticker)) { + if (MessageObject.isVideoSticker(sticker)) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(sticker), "40_40", svgThumb, 0, parentObject); } else { imageView.setImage(ImageLocation.getForDocument(sticker), "40_40", imageLocation, null, 0, parentObject); } - } else if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(sticker, true)) { + } else if (MessageObject.isAnimatedStickerDocument(sticker, true)) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(sticker), "40_40", svgThumb, 0, parentObject); } else { @@ -713,7 +725,7 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { } private int getTabSize() { - return AndroidUtilities.dp(animateToExpanded ? 86 : StickerTabView.SMALL_WIDTH); + return AndroidUtilities.dp(animateToExpanded ? EXPANDED_WIDTH : StickerTabView.SMALL_WIDTH); } @Override @@ -722,10 +734,12 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { setImages(); } + private Paint selectorPaint = new Paint(); + @Override protected void dispatchDraw(Canvas canvas) { - float dif = (stickerTabWidth - stickerTabExpandedWidth); - float offset = expandOffset * (1f - expandProgress); + final float dif = (stickerTabWidth - stickerTabExpandedWidth); + final float offset = expandOffset * (1f - expandProgress); for (int i = 0; i < tabsContainer.getChildCount(); i++) { if (tabsContainer.getChildAt(i) instanceof StickerTabView) { StickerTabView stickerTabView = (StickerTabView) tabsContainer.getChildAt(i); @@ -738,78 +752,66 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { } } - super.dispatchDraw(canvas); - if (isInEditMode() || tabCount == 0) { - return; - } - float height = getHeight(); if (animateToExpanded) { height = getHeight() - AndroidUtilities.dp(50) * (1f - expandProgress); } - if (underlineHeight > 0) { - rectPaint.setColor(underlineColor); - canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); + if (!(isInEditMode() || tabCount == 0) && indicatorHeight >= 0) { + float position = currentPositionAnimated.set(currentPosition); + int floorPosition = (int) Math.floor(position); + int ceilPosition = (int) Math.ceil(position); + + View leftTab = floorPosition < 0 || floorPosition >= tabsContainer.getChildCount() ? null : tabsContainer.getChildAt(floorPosition); + View rightTab = ceilPosition < 0 || ceilPosition >= tabsContainer.getChildCount() ? null : tabsContainer.getChildAt(ceilPosition); + + float cy = height / 2f; + float cx; + + float textWidth; + + if (leftTab != null && rightTab != null) { + cx = AndroidUtilities.lerp( + leftTab.getLeft() + leftTab.getTranslationX() + AndroidUtilities.lerp(AndroidUtilities.dp(StickerTabView.SMALL_WIDTH), AndroidUtilities.dp(EXPANDED_WIDTH), expandProgress) / 2f, + rightTab.getLeft() + rightTab.getTranslationX() + AndroidUtilities.lerp(AndroidUtilities.dp(StickerTabView.SMALL_WIDTH), AndroidUtilities.dp(EXPANDED_WIDTH), expandProgress) / 2f, + position - floorPosition + ); + textWidth = AndroidUtilities.lerp( + (leftTab instanceof StickerTabView ? ((StickerTabView) leftTab).getTextWidth() : 0), + (rightTab instanceof StickerTabView ? ((StickerTabView) rightTab).getTextWidth() : 0), + position - floorPosition + ); + } else { + if (leftTab != null) { + cx = leftTab.getLeft() + leftTab.getTranslationX() + AndroidUtilities.lerp(AndroidUtilities.dp(StickerTabView.SMALL_WIDTH), AndroidUtilities.dp(EXPANDED_WIDTH), expandProgress) / 2f; + textWidth = leftTab instanceof StickerTabView ? ((StickerTabView) leftTab).getTextWidth() : 0; + } else if (rightTab != null) { + cx = rightTab.getLeft() + rightTab.getTranslationX() + AndroidUtilities.lerp(AndroidUtilities.dp(StickerTabView.SMALL_WIDTH), AndroidUtilities.dp(EXPANDED_WIDTH), expandProgress) / 2f; + textWidth = rightTab instanceof StickerTabView ? ((StickerTabView) rightTab).getTextWidth() : 0; + } else { + cx = 0; + textWidth = 0; + } + } + + float sz = AndroidUtilities.dp(30); + float w = sz * (1.25f - .25f * Math.abs(.5f - currentPositionAnimated.getTransitionProgressInterpolated()) * 2); + float h = sz * (.9f + .1f * Math.abs(.5f - currentPositionAnimated.getTransitionProgressInterpolated()) * 2); + float expandProgressInterpolated = CubicBezierInterpolator.EASE_IN.getInterpolation(expandProgress); + w = AndroidUtilities.lerp(w, textWidth + AndroidUtilities.dp(10), expandProgressInterpolated); + cy += AndroidUtilities.lerp(0, AndroidUtilities.dp(26), expandProgressInterpolated); + h *= AndroidUtilities.lerp(1f, 0.55f, expandProgressInterpolated); + tabBounds.set(cx - w / 2, cy - h / 2, cx + w / 2, cy + h / 2); + + selectorPaint.setColor(0x2effffff & getThemedColor(Theme.key_chat_emojiPanelIcon)); + canvas.drawRoundRect(tabBounds, AndroidUtilities.dp(8), AndroidUtilities.dp(8), selectorPaint); } - if (indicatorHeight >= 0) { - View currentTab = tabsContainer.getChildAt(currentPosition); - float lineLeft = 0; - float width = 0; - if (currentTab != null) { - lineLeft = currentTab.getX(); - width = currentTab.getMeasuredWidth(); - } - if (animateToExpanded) { - width = stickerTabWidth + (stickerTabExpandedWidth - stickerTabWidth) * expandProgress; - } - if (animateFromPosition) { - long newTime = SystemClock.elapsedRealtime(); - long dt = newTime - lastAnimationTime; - lastAnimationTime = newTime; + super.dispatchDraw(canvas); - positionAnimationProgress += dt / 150.0f; - if (positionAnimationProgress >= 1.0f) { - positionAnimationProgress = 1.0f; - animateFromPosition = false; - } - lineLeft = startAnimationPosition + (lineLeft - startAnimationPosition) * CubicBezierInterpolator.EASE_OUT_QUINT.getInterpolation(positionAnimationProgress); - invalidate(); - } - - if (draggingView != null && draggingViewIndicatorOutProgress != 1f) { - draggingViewIndicatorOutProgress += 16 / 150f; - if (draggingViewIndicatorOutProgress > 1f) { - draggingViewIndicatorOutProgress = 1f; - } else { - invalidate(); - } - } else if (draggingView == null && draggingViewIndicatorOutProgress != 0){ - draggingViewIndicatorOutProgress -= 16 / 150f; - if (draggingViewIndicatorOutProgress < 0) { - draggingViewIndicatorOutProgress = 0; - } else { - invalidate(); - } - } - - switch (type) { - case LINE: - if (indicatorHeight == 0) { - indicatorDrawable.setBounds((int) lineLeft, 0, (int) (lineLeft + width), (int) height); - } else { - indicatorDrawable.setBounds((int) lineLeft, (int) (height - indicatorHeight), (int) (lineLeft + width), (int) height); - } - break; - case TAB: - float yOffset = AndroidUtilities.dp(3) * draggingViewIndicatorOutProgress; - indicatorDrawable.setBounds((int) lineLeft + AndroidUtilities.dp(6), (int) (height - AndroidUtilities.dp(3) + yOffset), (int) (lineLeft + width - AndroidUtilities.dp(6)), (int) (height + yOffset)); - break; - } - - indicatorDrawable.setColor(indicatorColor); - indicatorDrawable.draw(canvas); + if (!(isInEditMode() || tabCount == 0) && underlineHeight > 0) { + rectPaint.setColor(underlineColor); + canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); } } @@ -983,6 +985,9 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { if (draggingView != null) { if (startDragFromPosition != currentDragPosition) { stickerSetPositionChanged(startDragFromPosition, currentDragPosition); + for (int i = 0; i < tabsContainer.getChildCount(); i++) { + tabsContainer.getChildAt(i).setTag(R.id.index_tag, i); + } } ValueAnimator dragViewOutAnimator = ValueAnimator.ofFloat(0, 1f); dragViewOutAnimator.addUpdateListener(valueAnimator -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarWaveform.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarWaveform.java index 5a522d201..531f65852 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarWaveform.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarWaveform.java @@ -55,7 +55,7 @@ public class SeekBarWaveform { private float clearProgress = 1f; private boolean isUnread; - private AnimatedFloat appearFloat = new AnimatedFloat(125, 450, CubicBezierInterpolator.EASE_OUT_QUINT); + private AnimatedFloat appearFloat = new AnimatedFloat(125, 600, CubicBezierInterpolator.EASE_OUT_QUINT); private float waveScaling = 1f; @@ -324,6 +324,7 @@ public class SeekBarWaveform { float x = barNum * AndroidUtilities.dpf2(3); float bart = MathUtils.clamp(appearProgress * totalBarsCount - barNum, 0, 1); float h = AndroidUtilities.dpf2(heights[barNum]) * bart; + h -= AndroidUtilities.dpf2(1) * (1f - bart); addBar(path, x, h); } } 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 a73a72b5f..d32f274df 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java @@ -17,7 +17,6 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Outline; import android.graphics.Paint; @@ -28,6 +27,7 @@ import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.Editable; +import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextPaint; @@ -102,6 +102,7 @@ import org.telegram.ui.MessageStatisticActivity; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Locale; public class ShareAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate { @@ -130,6 +131,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi protected LongSparseArray selectedDialogs = new LongSparseArray<>(); private SwitchView switchView; private int containerViewTop = -1; + private boolean fullyShown = false; private ChatActivity parentFragment; private Activity parentActivity; @@ -466,6 +468,13 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi sendingText[1] = text2; useSmoothKeyboard = true; + super.setDelegate(new BottomSheetDelegate() { + @Override + public void onOpenAnimationEnd() { + fullyShown = true; + } + }); + if (sendingMessageObjects != null) { for (int a = 0, N = sendingMessageObjects.size(); a < N; a++) { MessageObject messageObject = sendingMessageObjects.get(a); @@ -594,7 +603,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @Override protected boolean heightAnimationEnabled() { - if (isDismissed()) { + if (isDismissed() || !fullyShown) { return false; } return !commentTextView.isPopupVisible(); @@ -1192,7 +1201,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi containerView.addView(frameLayout2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM)); frameLayout2.setOnTouchListener((v, event) -> true); - commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG, resourcesProvider) { + commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG, true, resourcesProvider) { private boolean shouldAnimateEditTextWithBounds; private int messageEditTextPredrawHeigth; @@ -1609,15 +1618,33 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi } } + CharSequence[] text = new CharSequence[] { commentTextView.getText() }; + ArrayList entities = MediaDataController.getInstance(currentAccount).getEntities(text, true); if (sendingMessageObjects != null) { + List removeKeys = new ArrayList<>(); for (int a = 0; a < selectedDialogs.size(); a++) { long key = selectedDialogs.keyAt(a); if (frameLayout2.getTag() != null && commentTextView.length() > 0) { - SendMessagesHelper.getInstance(currentAccount).sendMessage(commentTextView.getText().toString(), key, null, null, null, true, null, null, null, withSound, 0, null); + SendMessagesHelper.getInstance(currentAccount).sendMessage(text[0] == null ? null : text[0].toString(), key, null, null, null, true, entities, null, null, withSound, 0, null); + } + int result = SendMessagesHelper.getInstance(currentAccount).sendMessage(sendingMessageObjects, key, !showSendersName,false, withSound, 0); + if (result != 0) { + removeKeys.add(key); + } + if (selectedDialogs.size() == 1) { + AlertsCreator.showSendMediaAlert(result, parentFragment, null); + + if (result != 0) { + break; + } } - SendMessagesHelper.getInstance(currentAccount).sendMessage(sendingMessageObjects, key, !showSendersName,false, withSound, 0); } - onSend(selectedDialogs, sendingMessageObjects.size()); + for (long key : removeKeys) { + selectedDialogs.remove(key); + } + if (!selectedDialogs.isEmpty()) { + onSend(selectedDialogs, sendingMessageObjects.size()); + } } else { int num; if (switchView != null) { @@ -1629,7 +1656,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi for (int a = 0; a < selectedDialogs.size(); a++) { long key = selectedDialogs.keyAt(a); if (frameLayout2.getTag() != null && commentTextView.length() > 0) { - SendMessagesHelper.getInstance(currentAccount).sendMessage(commentTextView.getText().toString(), key, null, null, null, true, null, null, null, withSound, 0, null); + SendMessagesHelper.getInstance(currentAccount).sendMessage(text[0] == null ? null : text[0].toString(), key, null, null, null, true, entities, null, null, withSound, 0, null); } SendMessagesHelper.getInstance(currentAccount).sendMessage(sendingText[num], key, null, null, null, true, null, null, null, withSound, 0, null); } @@ -1882,6 +1909,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi if (commentTextView != null) { AndroidUtilities.hideKeyboard(commentTextView.getEditText()); } + fullyShown = false; super.dismiss(); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.dialogsNeedReload); } 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 3ccb97328..32868db83 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -5635,7 +5635,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter for (int a = 0; a < mediaPages.length; a++) { if (mediaPages[a].selectedType == currentType) { if (searchesInProgress == 0 && count == 0) { - mediaPages[a].emptyView.title.setText(LocaleController.formatString(R.string.NoResultFoundFor, "NoResultFoundFor", query)); + mediaPages[a].emptyView.title.setText(LocaleController.formatString("NoResultFoundFor", R.string.NoResultFoundFor, query)); mediaPages[a].emptyView.showProgress(false, true); } else if (oldItemCounts == 0) { animateItemsEnter(mediaPages[a].listView, 0, null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierFrameLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierFrameLayout.java index 103bdcc37..907d39bee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierFrameLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierFrameLayout.java @@ -240,6 +240,7 @@ public class SizeNotifierFrameLayout extends FrameLayout { } }; addView(backgroundView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + checkLayerType(); } public void setBackgroundImage(Drawable bitmap, boolean motion) { @@ -275,6 +276,15 @@ public class SizeNotifierFrameLayout extends FrameLayout { translationY = 0; } backgroundView.invalidate(); + checkLayerType(); + } + + private void checkLayerType() { + if (parallaxEffect == null && backgroundDrawable instanceof MotionBackgroundDrawable && SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_HIGH) { + backgroundView.setLayerType(LAYER_TYPE_HARDWARE, null); + } else { + backgroundView.setLayerType(LAYER_TYPE_NONE, null); + } } public Drawable getBackgroundImage() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SmoothScroller.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SmoothScroller.java new file mode 100644 index 000000000..50d034f68 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SmoothScroller.java @@ -0,0 +1,72 @@ +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.PointF; +import android.view.View; +import android.view.animation.Interpolator; + +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; + +public class SmoothScroller extends LinearSmoothScroller { + + private Interpolator interpolator = CubicBezierInterpolator.DEFAULT; + + public SmoothScroller(Context context) { + super(context); + } + + public SmoothScroller(Context context, Interpolator customInterpolator) { + super(context); + this.interpolator = customInterpolator; + } + + protected void onEnd() { + + } + + @Override + protected void updateActionForInterimTarget(Action action) { + // find an interim target position + PointF scrollVector = computeScrollVectorForPosition(getTargetPosition()); + if (scrollVector == null || (scrollVector.x == 0 && scrollVector.y == 0)) { + final int target = getTargetPosition(); + action.jumpTo(target); + stop(); + return; + } + normalize(scrollVector); + mTargetVector = scrollVector; + + mInterimTargetDx = (int) (TARGET_SEEK_SCROLL_DISTANCE_PX * scrollVector.x); + mInterimTargetDy = (int) (TARGET_SEEK_SCROLL_DISTANCE_PX * scrollVector.y); + final int time = calculateTimeForScrolling(TARGET_SEEK_SCROLL_DISTANCE_PX); + // To avoid UI hiccups, trigger a smooth scroll to a distance little further than the + // interim target. Since we track the distance travelled in onSeekTargetStep callback, it + // won't actually scroll more than what we need. + action.update((int) (mInterimTargetDx * TARGET_SEEK_EXTRA_SCROLL_RATIO), + (int) (mInterimTargetDy * TARGET_SEEK_EXTRA_SCROLL_RATIO), + (int) (time * TARGET_SEEK_EXTRA_SCROLL_RATIO), interpolator); + } + + @Override + protected void onTargetFound(View targetView, RecyclerView.State state, Action action) { + final int dx = calculateDxToMakeVisible(targetView, getHorizontalSnapPreference()); + final int dy = calculateDyToMakeVisible(targetView, getVerticalSnapPreference()); + final int distance = (int) Math.sqrt(dx * dx + dy * dy); + final int time = calculateTimeForDeceleration(distance); + if (time > 0) { + action.update(-dx, -dy, time, interpolator); + } + AndroidUtilities.runOnUIThread(this::onEnd, Math.max(0, time)); + } + + protected int calculateTimeForDeceleration(int dx) { + return Math.min(super.calculateTimeForDeceleration(dx), 500); + } + protected int calculateTimeForScrolling(int dx) { + return Math.min(super.calculateTimeForScrolling(dx), 150); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerMasksAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerMasksAlert.java index 95c94a063..d6785ccb0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerMasksAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerMasksAlert.java @@ -551,7 +551,7 @@ public class StickerMasksAlert extends BottomSheet implements NotificationCenter stickersTab.setIndicatorColor(0xff6ebaed); stickersTab.setUnderlineColor(0xff0B0B0B); stickersTab.setBackgroundColor(0xff252525); - containerView.addView(stickersTab, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.TOP)); + containerView.addView(stickersTab, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP)); stickersTab.setDelegate(page -> { int scrollToPosition; if (page == recentTabBum) { @@ -1312,7 +1312,7 @@ public class StickerMasksAlert extends BottomSheet implements NotificationCenter clear(); notifyDataSetChanged(); } - }); + }, false); } ArrayList local = MediaDataController.getInstance(currentAccount).getStickerSets(currentType); int index; 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 74e2b6b96..af281cb38 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerSetBulletinLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerSetBulletinLayout.java @@ -12,6 +12,7 @@ import org.telegram.messenger.BuildVars; 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; @@ -43,13 +44,17 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout { } public StickerSetBulletinLayout(@NonNull Context context, TLObject setObject, @Type int type) { - this(context, setObject, type, null, null); + this(context, setObject, 1, type, null, null); } public StickerSetBulletinLayout(@NonNull Context context, TLObject setObject, @Type int type, TLRPC.Document sticker, Theme.ResourcesProvider resourcesProvider) { + this(context, setObject, 1, type, sticker, resourcesProvider); + } + + public StickerSetBulletinLayout(@NonNull Context context, TLObject setObject, int count, @Type int type, TLRPC.Document sticker, Theme.ResourcesProvider resourcesProvider) { super(context, resourcesProvider); - final TLRPC.StickerSet stickerSet; + TLRPC.StickerSet stickerSet; if (setObject instanceof TLRPC.TL_messages_stickerSet) { final TLRPC.TL_messages_stickerSet obj = (TLRPC.TL_messages_stickerSet) setObject; @@ -77,6 +82,13 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout { stickerSet = null; } + if (stickerSet == null && sticker != null) { + TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(UserConfig.selectedAccount).getStickerSet(MessageObject.getInputStickerSet(sticker), true); + if (set != null) { + stickerSet = set.set; + } + } + if (sticker != null) { TLObject object = stickerSet == null ? null : FileLoader.getClosestPhotoSizeWithSize(stickerSet.thumbs, 90); @@ -112,30 +124,50 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout { switch (type) { case TYPE_ADDED: - if (stickerSet.masks) { - titleTextView.setText(LocaleController.getString("AddMasksInstalled", R.string.AddMasksInstalled)); - subtitleTextView.setText(LocaleController.formatString("AddMasksInstalledInfo", R.string.AddMasksInstalledInfo, stickerSet.title)); - } else { - titleTextView.setText(LocaleController.getString("AddStickersInstalled", R.string.AddStickersInstalled)); - subtitleTextView.setText(LocaleController.formatString("AddStickersInstalledInfo", R.string.AddStickersInstalledInfo, stickerSet.title)); + if (stickerSet != null) { + if (stickerSet.masks) { + titleTextView.setText(LocaleController.getString("AddMasksInstalled", R.string.AddMasksInstalled)); + subtitleTextView.setText(LocaleController.formatString("AddMasksInstalledInfo", R.string.AddMasksInstalledInfo, stickerSet.title)); + } else if (stickerSet.emojis) { + titleTextView.setText(LocaleController.getString("AddEmojiInstalled", R.string.AddEmojiInstalled)); + if (count > 1) { + subtitleTextView.setText(LocaleController.formatPluralString("AddEmojiMultipleInstalledInfo", count)); + } else { + subtitleTextView.setText(LocaleController.formatString("AddEmojiInstalledInfo", R.string.AddEmojiInstalledInfo, stickerSet.title)); + } + } else { + titleTextView.setText(LocaleController.getString("AddStickersInstalled", R.string.AddStickersInstalled)); + subtitleTextView.setText(LocaleController.formatString("AddStickersInstalledInfo", R.string.AddStickersInstalledInfo, stickerSet.title)); + } } break; case TYPE_REMOVED: - if (stickerSet.masks) { - titleTextView.setText(LocaleController.getString("MasksRemoved", R.string.MasksRemoved)); - subtitleTextView.setText(LocaleController.formatString("MasksRemovedInfo", R.string.MasksRemovedInfo, stickerSet.title)); - } else { - titleTextView.setText(LocaleController.getString("StickersRemoved", R.string.StickersRemoved)); - subtitleTextView.setText(LocaleController.formatString("StickersRemovedInfo", R.string.StickersRemovedInfo, stickerSet.title)); + if (stickerSet != null) { + if (stickerSet.masks) { + titleTextView.setText(LocaleController.getString("MasksRemoved", R.string.MasksRemoved)); + subtitleTextView.setText(LocaleController.formatString("MasksRemovedInfo", R.string.MasksRemovedInfo, stickerSet.title)); + } else if (stickerSet.emojis) { + titleTextView.setText(LocaleController.getString("EmojiRemoved", R.string.EmojiRemoved)); + if (count > 1) { + subtitleTextView.setText(LocaleController.formatPluralString("EmojiRemovedMultipleInfo", count)); + } else { + subtitleTextView.setText(LocaleController.formatString("EmojiRemovedInfo", R.string.EmojiRemovedInfo, stickerSet.title)); + } + } else { + titleTextView.setText(LocaleController.getString("StickersRemoved", R.string.StickersRemoved)); + subtitleTextView.setText(LocaleController.formatString("StickersRemovedInfo", R.string.StickersRemovedInfo, stickerSet.title)); + } } break; case TYPE_ARCHIVED: - if (stickerSet.masks) { - titleTextView.setText(LocaleController.getString("MasksArchived", R.string.MasksArchived)); - subtitleTextView.setText(LocaleController.formatString("MasksArchivedInfo", R.string.MasksArchivedInfo, stickerSet.title)); - } else { - titleTextView.setText(LocaleController.getString("StickersArchived", R.string.StickersArchived)); - subtitleTextView.setText(LocaleController.formatString("StickersArchivedInfo", R.string.StickersArchivedInfo, stickerSet.title)); + if (stickerSet != null) { + if (stickerSet.masks) { + titleTextView.setText(LocaleController.getString("MasksArchived", R.string.MasksArchived)); + subtitleTextView.setText(LocaleController.formatString("MasksArchivedInfo", R.string.MasksArchivedInfo, stickerSet.title)); + } else { + titleTextView.setText(LocaleController.getString("StickersArchived", R.string.StickersArchived)); + subtitleTextView.setText(LocaleController.formatString("StickersArchivedInfo", R.string.StickersArchivedInfo, stickerSet.title)); + } } break; case TYPE_REMOVED_FROM_FAVORITES: diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerTabView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerTabView.java index 68aafa711..c74b2c7f3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerTabView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerTabView.java @@ -23,10 +23,11 @@ public class StickerTabView extends FrameLayout { public final static int ICON_TYPE = 1; public final static int EMOJI_TYPE = 2; - public final static int SMALL_WIDTH = 38; + public final static int SMALL_WIDTH = 33; public final static int SMALL_HEIGHT = 36; - private final static int IMAGE_SMALL_SIZE = 26; + public final static int IMAGE_SMALL_SIZE = 26; + public final static int IMAGE_ICON_SMALL_SIZE = 24; public int type; public float dragOffset; @@ -46,6 +47,7 @@ public class StickerTabView extends FrameLayout { ValueAnimator dragOffsetAnimator; float lastLeft; boolean hasSavedLeft; + private float textWidth; public StickerTabView(Context context, int type) { super(context); @@ -55,22 +57,34 @@ public class StickerTabView extends FrameLayout { imageView = new BackupImageView(getContext()); imageView.setLayerNum(1); imageView.setAspectFit(false); + imageView.setRoundRadius(AndroidUtilities.dp(6)); addView(imageView, LayoutHelper.createFrame(IMAGE_SMALL_SIZE, IMAGE_SMALL_SIZE, Gravity.CENTER)); visibleView = imageView; } else if (type == ICON_TYPE) { iconView = new ImageView(context); iconView.setScaleType(ImageView.ScaleType.CENTER_CROP); - addView(iconView, LayoutHelper.createFrame(24, 24, Gravity.CENTER)); + addView(iconView, LayoutHelper.createFrame(IMAGE_ICON_SMALL_SIZE, IMAGE_ICON_SMALL_SIZE, Gravity.CENTER)); visibleView = iconView; } else { imageView = new BackupImageView(getContext()); imageView.setLayerNum(1); imageView.setAspectFit(true); + imageView.setRoundRadius(AndroidUtilities.dp(6)); addView(imageView, LayoutHelper.createFrame(IMAGE_SMALL_SIZE, IMAGE_SMALL_SIZE, Gravity.CENTER)); visibleView = imageView; } - textView = new TextView(context); + textView = new TextView(context) { + @Override + public void setText(CharSequence text, BufferType type) { + super.setText(text, type); + } + }; + textView.addOnLayoutChangeListener((v, a, b, c, d, e, f, g, h) -> { + if (textView != null && textView.getLayout() != null) { + textWidth = textView.getLayout().getLineWidth(0); + } + }); textView.setLines(1); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); @@ -81,13 +95,17 @@ public class StickerTabView extends FrameLayout { textView.setVisibility(View.GONE); } + public float getTextWidth() { + return textWidth; + } + public void setExpanded(boolean expanded) { if (type == EMOJI_TYPE) { return; } this.expanded = expanded; - float size = type == ICON_TYPE ? 24 : IMAGE_SMALL_SIZE; - float sizeExpanded = type == ICON_TYPE ? 38 : 56; + float size = type == ICON_TYPE ? IMAGE_ICON_SMALL_SIZE : IMAGE_SMALL_SIZE; + float sizeExpanded = type == ICON_TYPE ? 38 : 44; visibleView.getLayoutParams().width = AndroidUtilities.dp(expanded ? sizeExpanded : size); visibleView.getLayoutParams().height = AndroidUtilities.dp(expanded ? sizeExpanded : size); @@ -104,11 +122,11 @@ public class StickerTabView extends FrameLayout { return; } if (expanded) { - float size = type == ICON_TYPE ? 24 : IMAGE_SMALL_SIZE; - float sizeExpanded = type == ICON_TYPE ? 38 : 56; + float size = type == ICON_TYPE ? IMAGE_ICON_SMALL_SIZE : IMAGE_SMALL_SIZE; + float sizeExpanded = type == ICON_TYPE ? 38 : 44; float fromX = AndroidUtilities.dp(SMALL_WIDTH - size) / 2f; float fromY = AndroidUtilities.dp(SMALL_HEIGHT - size) / 2f; - float toX = AndroidUtilities.dp(86 - sizeExpanded) / 2f; + float toX = AndroidUtilities.dp(ScrollSlidingTabStrip.EXPANDED_WIDTH - sizeExpanded) / 2f; float toY = AndroidUtilities.dp(SMALL_HEIGHT + 50 - sizeExpanded) / 2f; visibleView.setTranslationY((fromY - toY) * (1 - expandProgress) - AndroidUtilities.dp(8) * expandProgress); 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 a53536368..1e1c17f74 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java @@ -66,6 +66,7 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SendMessagesHelper; +import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.RequestDelegate; @@ -81,7 +82,11 @@ import org.telegram.ui.Cells.EmptyCell; import org.telegram.ui.Cells.FeaturedStickerSetInfoCell; import org.telegram.ui.Cells.StickerEmojiCell; import org.telegram.ui.ChatActivity; +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.PremiumPreviewFragment; import java.io.File; import java.util.ArrayList; @@ -127,12 +132,16 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } } + private boolean wasLightStatusBar; + private Pattern urlPattern; private RecyclerListView gridView; private GridAdapter adapter; private TextView titleTextView; + private TextView descriptionTextView; private ActionBarMenuItem optionsButton; private TextView pickerBottomLayout; + private PremiumButtonView premiumButtonView; private FrameLayout pickerBottomFrameLayout; private FrameLayout stickerPreviewLayout; private TextView previewSendButton; @@ -146,7 +155,8 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private BaseFragment parentFragment; private GridLayoutManager layoutManager; private Activity parentActivity; - private int itemSize; + private int itemSize, itemHeight; + public boolean probablyEmojis; private TLRPC.TL_messages_stickerSet stickerSet; private TLRPC.Document selectedSticker; @@ -173,6 +183,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private String buttonTextColorKey; private ContentPreviewViewer.ContentPreviewViewerDelegate previewDelegate = new ContentPreviewViewer.ContentPreviewViewerDelegate() { + @Override + public boolean can() { + return stickerSet == null || stickerSet.set == null || !stickerSet.set.emojis; + } + @Override public void sendSticker(TLRPC.Document sticker, String query, Object parent, boolean notify, int scheduleDate) { if (delegate == null) { @@ -451,10 +466,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not mediaDataController.preloadStickerSetThumb(stickerSet); updateSendButton(); updateFields(); + updateDescription(); adapter.notifyDataSetChanged(); } else { - Toast.makeText(getContext(), LocaleController.getString("AddStickersNotFound", R.string.AddStickersNotFound), Toast.LENGTH_SHORT).show(); dismiss(); + BulletinFactory.of(parentFragment).createErrorBulletin(LocaleController.getString("AddStickersNotFound", R.string.AddStickersNotFound)).show(); } })); } else { @@ -463,6 +479,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not updateFields(); adapter.notifyDataSetChanged(); } + updateDescription(); mediaDataController.preloadStickerSetThumb(stickerSet); checkPremiumStickers(); } @@ -482,6 +499,10 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } } + private boolean isEmoji() { + return stickerSet != null && stickerSet.set != null && stickerSet.set.emojis || stickerSet == null && probablyEmojis; + } + private void init(Context context) { containerView = new FrameLayout(context) { @@ -511,23 +532,46 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not setPadding(backgroundPaddingLeft, AndroidUtilities.statusBarHeight, backgroundPaddingLeft, 0); ignoreLayout = false; } - itemSize = (MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(36)) / 5; + if (isEmoji()) { + int width = gridView.getMeasuredWidth(); + if (width == 0) { + width = AndroidUtilities.displaySize.x; + } + adapter.stickersPerRow = Math.max(1, width / AndroidUtilities.dp(AndroidUtilities.isTablet() ? 60 : 45)); + itemSize = (int) ((MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(36)) / adapter.stickersPerRow); + itemHeight = itemSize; + } else { + adapter.stickersPerRow = 5; + itemSize = (int) ((MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(36)) / adapter.stickersPerRow); + itemHeight = AndroidUtilities.dp(82); + } + float spansCount = adapter.stickersPerRow; int contentSize; MarginLayoutParams params = (MarginLayoutParams) gridView.getLayoutParams(); if (importingStickers != null) { - contentSize = AndroidUtilities.dp(48) + params.bottomMargin + Math.max(3, (int) Math.ceil(importingStickers.size() / 5.0f)) * AndroidUtilities.dp(82) + backgroundPaddingTop + AndroidUtilities.statusBarHeight; + contentSize = AndroidUtilities.dp(48) + params.bottomMargin + Math.max(3, (int) Math.ceil(importingStickers.size() / spansCount)) * itemHeight + backgroundPaddingTop + AndroidUtilities.statusBarHeight; } else if (stickerSetCovereds != null) { - contentSize = AndroidUtilities.dp(8) + params.bottomMargin + AndroidUtilities.dp(60) * stickerSetCovereds.size() + adapter.stickersRowCount * AndroidUtilities.dp(82) + backgroundPaddingTop + AndroidUtilities.dp(24); + contentSize = AndroidUtilities.dp(8) + params.bottomMargin + AndroidUtilities.dp(60) * stickerSetCovereds.size() + adapter.stickersRowCount * itemHeight + backgroundPaddingTop + AndroidUtilities.dp(24); } else { - contentSize = AndroidUtilities.dp(48) + params.bottomMargin + Math.max(3, (stickerSet != null ? (int) Math.ceil(stickerSet.documents.size() / 5.0f) : 0)) * AndroidUtilities.dp(82) + backgroundPaddingTop + AndroidUtilities.statusBarHeight; + contentSize = AndroidUtilities.dp(48) + params.bottomMargin + (Math.max(isEmoji() ? 2 : 3, (stickerSet != null ? (int) Math.ceil(stickerSet.documents.size() / spansCount) : 0))) * itemHeight + backgroundPaddingTop + AndroidUtilities.statusBarHeight; } - int padding = contentSize < (height / 5 * 3.2) ? 0 : (height / 5 * 2); + if (isEmoji()) { + contentSize += itemHeight * .15f; + } + if (descriptionTextView != null) { + descriptionTextView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(9999, MeasureSpec.AT_MOST)); + contentSize += descriptionTextView.getMeasuredHeight(); + } + int padding = contentSize < (height / 5f * 3.2) ? 0 : (int) (height / 5f * 2); if (padding != 0 && contentSize < height) { padding -= (height - contentSize); } if (padding == 0) { padding = backgroundPaddingTop; } + if (descriptionTextView != null) { + padding += AndroidUtilities.dp(32) + descriptionTextView.getMeasuredHeight(); + } if (stickerSetCovereds != null) { padding += AndroidUtilities.dp(8); } @@ -561,6 +605,17 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not super.requestLayout(); } + private Boolean statusBarOpen; + 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 = open ? openBgLight : closedBgLight; + AndroidUtilities.setLightStatusBar(getWindow(), isLight); + } + @Override protected void onDraw(Canvas canvas) { int y = scrollOffsetY - backgroundPaddingTop + AndroidUtilities.dp(6); @@ -595,15 +650,17 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not canvas.drawRoundRect(rect, AndroidUtilities.dp(12) * radProgress, AndroidUtilities.dp(12) * radProgress, Theme.dialogs_onlineCirclePaint); } + float statusBarProgress = statusBarHeight / (float) AndroidUtilities.statusBarHeight; + int w = AndroidUtilities.dp(36); rect.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + AndroidUtilities.dp(4)); Theme.dialogs_onlineCirclePaint.setColor(getThemedColor(Theme.key_sheet_scrollUp)); + Theme.dialogs_onlineCirclePaint.setAlpha((int) (255 * Math.max(0, Math.min(1f, (y - AndroidUtilities.statusBarHeight) / (float) AndroidUtilities.dp(16))))); canvas.drawRoundRect(rect, AndroidUtilities.dp(2), AndroidUtilities.dp(2), Theme.dialogs_onlineCirclePaint); + updateLightStatusBar(statusBarHeight > AndroidUtilities.statusBarHeight / 2); if (statusBarHeight > 0) { - int color1 = getThemedColor(Theme.key_dialogBackground); - int finalColor = Color.argb(0xff, (int) (Color.red(color1) * 0.8f), (int) (Color.green(color1) * 0.8f), (int) (Color.blue(color1) * 0.8f)); - Theme.dialogs_onlineCirclePaint.setColor(finalColor); + Theme.dialogs_onlineCirclePaint.setColor(getThemedColor(Theme.key_dialogBackground)); canvas.drawRect(backgroundPaddingLeft, AndroidUtilities.statusBarHeight - statusBarHeight, getMeasuredWidth() - backgroundPaddingLeft, AndroidUtilities.statusBarHeight, Theme.dialogs_onlineCirclePaint); } } @@ -723,7 +780,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not stickerEmojiTextView.setText(Emoji.replaceEmoji(MediaDataController.getInstance(currentAccount).getEmojiForSticker(selectedSticker.id), stickerEmojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(30), false)); } - if (!ContentPreviewViewer.getInstance().showMenuFor(view)) { + if ((stickerSet == null || stickerSet.set == null || !stickerSet.set.emojis) && !ContentPreviewViewer.getInstance().showMenuFor(view)) { TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(selectedSticker.thumbs, 90); stickerImageView.getImageReceiver().setImage(ImageLocation.getForDocument(selectedSticker), null, ImageLocation.getForDocument(thumb, selectedSticker), null, "webp", stickerSet, 1); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) stickerPreviewLayout.getLayoutParams(); @@ -799,6 +856,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not pickerBottomFrameLayout.addView(pickerBottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48)); containerView.addView(pickerBottomFrameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM)); + premiumButtonView = new PremiumButtonView(context, false); + premiumButtonView.setIcon(R.raw.unlock_icon); + premiumButtonView.setVisibility(View.INVISIBLE); + containerView.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 8, 0, 8, 8)); + stickerPreviewLayout = new FrameLayout(context); stickerPreviewLayout.setVisibility(View.GONE); stickerPreviewLayout.setSoundEffectsEnabled(false); @@ -848,27 +910,42 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not updateFields(); updateSendButton(); + updateDescription(); updateColors(); adapter.notifyDataSetChanged(); } + private void updateDescription() { + if (containerView == null) { + return; + } + if (!UserConfig.getInstance(currentAccount).isPremium() && MessageObject.isPremiumEmojiPack(stickerSet)) { +// descriptionTextView = new TextView(getContext()); +// descriptionTextView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelTrendingDescription)); +// descriptionTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); +// descriptionTextView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); +// descriptionTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("PremiumPreviewEmojiPack", R.string.PremiumPreviewEmojiPack))); +// containerView.addView(descriptionTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 50, 40, 0)); + } + } + private void updateSendButton() { int size = (int) (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) / 2 / AndroidUtilities.density); if (importingStickers != null) { - previewSendButton.setText(LocaleController.getString("ImportStickersRemove", R.string.ImportStickersRemove).toUpperCase()); + previewSendButton.setText(LocaleController.getString("ImportStickersRemove", R.string.ImportStickersRemove)); previewSendButton.setTextColor(getThemedColor(Theme.key_dialogTextRed)); stickerImageView.setLayoutParams(LayoutHelper.createFrame(size, size, Gravity.CENTER, 0, 0, 0, 30)); stickerEmojiTextView.setLayoutParams(LayoutHelper.createFrame(size, size, Gravity.CENTER, 0, 0, 0, 30)); previewSendButton.setVisibility(View.VISIBLE); previewSendButtonShadow.setVisibility(View.VISIBLE); } else if (delegate != null && (stickerSet == null || !stickerSet.set.masks)) { - previewSendButton.setText(LocaleController.getString("SendSticker", R.string.SendSticker).toUpperCase()); + previewSendButton.setText(LocaleController.getString("SendSticker", R.string.SendSticker)); stickerImageView.setLayoutParams(LayoutHelper.createFrame(size, size, Gravity.CENTER, 0, 0, 0, 30)); stickerEmojiTextView.setLayoutParams(LayoutHelper.createFrame(size, size, Gravity.CENTER, 0, 0, 0, 30)); previewSendButton.setVisibility(View.VISIBLE); previewSendButtonShadow.setVisibility(View.VISIBLE); } else { - previewSendButton.setText(LocaleController.getString("Close", R.string.Close).toUpperCase()); + previewSendButton.setText(LocaleController.getString("Close", R.string.Close)); stickerImageView.setLayoutParams(LayoutHelper.createFrame(size, size, Gravity.CENTER)); stickerEmojiTextView.setLayoutParams(LayoutHelper.createFrame(size, size, Gravity.CENTER)); previewSendButton.setVisibility(View.GONE); @@ -902,7 +979,12 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not if (stickerSet == null) { return; } - String stickersUrl = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addstickers/" + stickerSet.set.short_name; + String stickersUrl; + if (stickerSet.set != null && stickerSet.set.emojis) { + stickersUrl = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addemoji/" + stickerSet.set.short_name; + } else { + stickersUrl = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addstickers/" + stickerSet.set.short_name; + } if (id == 1) { Context context = parentActivity; if (context == null && parentFragment != null) { @@ -911,9 +993,23 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not if (context == null) { context = getContext(); } - ShareAlert alert = new ShareAlert(context, null, stickersUrl, false, stickersUrl, false, resourcesProvider); + ShareAlert alert = new ShareAlert(context, null, stickersUrl, false, stickersUrl, false, resourcesProvider) { + @Override + public void dismissInternal() { + super.dismissInternal(); + if (parentFragment instanceof ChatActivity) { + AndroidUtilities.requestAdjustResize(parentFragment.getParentActivity(), parentFragment.getClassGuid()); + if (((ChatActivity) parentFragment).getChatActivityEnterView().getVisibility() == View.VISIBLE) { + parentFragment.getFragmentView().requestLayout(); + } + } + } + }; if (parentFragment != null) { parentFragment.showDialog(alert); + if (parentFragment instanceof ChatActivity) { + alert.setCalcMandatoryInsets(((ChatActivity) parentFragment).isKeyboardVisible()); + } } else { alert.show(); } @@ -962,18 +1058,76 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } titleTextView.setText(stringBuilder != null ? stringBuilder : stickerSet.set.title); + if (isEmoji()) { + int width = gridView.getMeasuredWidth(); + if (width == 0) { + width = AndroidUtilities.displaySize.x; + } + adapter.stickersPerRow = Math.max(1, width / AndroidUtilities.dp(AndroidUtilities.isTablet() ? 60 : 45)); + } else { + adapter.stickersPerRow = 5; + } + layoutManager.setSpanCount(adapter.stickersPerRow); + + if (stickerSet != null && stickerSet.set != null && stickerSet.set.emojis && !UserConfig.getInstance(currentAccount).isPremium()) { + boolean hasPremiumEmoji = false; + if (stickerSet.documents != null) { + for (int i = 0; i < stickerSet.documents.size(); ++i) { + if (!MessageObject.isFreeEmoji(stickerSet.documents.get(i))) { + hasPremiumEmoji = true; + break; + } + } + } + + if (hasPremiumEmoji) { + premiumButtonView.setVisibility(View.VISIBLE); + pickerBottomLayout.setBackground(null); + + setButton(null, null, null); + premiumButtonView.setButton(LocaleController.getString("UnlockPremiumEmoji", R.string.UnlockPremiumEmoji), e -> { + if (parentFragment != null) { + new PremiumFeatureBottomSheet(parentFragment, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false).show(); + } else if (getContext() instanceof LaunchActivity) { + ((LaunchActivity) getContext()).presentFragment(new PremiumPreviewFragment(null)); + } + }); + + return; + } + } else { + premiumButtonView.setVisibility(View.INVISIBLE); + } + + boolean notInstalled; + if (stickerSet != null && stickerSet.set != null && stickerSet.set.emojis) { + ArrayList sets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS); + boolean has = false; + for (int i = 0; sets != null && i < sets.size(); ++i) { + if (sets.get(i) != null && sets.get(i).set != null && sets.get(i).set.id == stickerSet.set.id) { + has = true; + break; + } + } + notInstalled = !has; + } else { + notInstalled = stickerSet == null || stickerSet.set == null || !MediaDataController.getInstance(currentAccount).isStickerPackInstalled(stickerSet.set.id); + } + if (customButtonDelegate != null) { setButton(v -> { if (customButtonDelegate.onCustomButtonPressed()) { dismiss(); } }, customButtonDelegate.getCustomButtonText(), customButtonDelegate.getCustomButtonTextColorKey(), customButtonDelegate.getCustomButtonColorKey(), customButtonDelegate.getCustomButtonRippleColorKey()); - } else if (stickerSet.set == null || !MediaDataController.getInstance(currentAccount).isStickerPackInstalled(stickerSet.set.id)) { + } else if (notInstalled) { String text; - if (stickerSet.set != null && stickerSet.set.masks) { - text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())).toUpperCase(); + if (stickerSet != null && stickerSet.set != null && stickerSet.set.masks) { + text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())); + } else if (stickerSet != null && stickerSet.set != null && stickerSet.set.emojis) { + text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("EmojiCountButton", stickerSet.documents.size())); } else { - text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("Stickers", stickerSet.documents.size())).toUpperCase(); + text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("Stickers", stickerSet.documents == null ? 0 : stickerSet.documents.size())); } setButton(v -> { dismiss(); @@ -986,7 +1140,12 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not TLRPC.TL_messages_installStickerSet req = new TLRPC.TL_messages_installStickerSet(); req.stickerset = inputStickerSet; ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { - final int type = stickerSet.set.masks ? MediaDataController.TYPE_MASK : MediaDataController.TYPE_IMAGE; + int type = MediaDataController.TYPE_IMAGE; + if (stickerSet.set.masks) { + type = MediaDataController.TYPE_MASK; + } else if (stickerSet.set.emojis) { + type = MediaDataController.TYPE_EMOJIPACKS; + }; try { if (error == null) { if (showTooltipWhenToggle) { @@ -1007,9 +1166,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } else { String text; if (stickerSet.set.masks) { - text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())).toUpperCase(); + text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())); + } else if (stickerSet.set.emojis) { + text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("EmojiCountButton", stickerSet.documents.size())); } else { - text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("Stickers", stickerSet.documents.size())).toUpperCase(); + text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("Stickers", stickerSet.documents.size())); } if (stickerSet.set.official) { setButton(v -> { @@ -1033,14 +1194,14 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } else if (importingStickers != null) { titleTextView.setText(LocaleController.formatPluralString("Stickers", importingStickersPaths != null ? importingStickersPaths.size() : importingStickers.size())); if (uploadImportStickers == null || uploadImportStickers.isEmpty()) { - setButton(v -> showNameEnterAlert(), LocaleController.formatString("ImportStickers", R.string.ImportStickers, LocaleController.formatPluralString("Stickers", importingStickersPaths != null ? importingStickersPaths.size() : importingStickers.size())).toUpperCase(), Theme.key_dialogTextBlue2); + setButton(v -> showNameEnterAlert(), LocaleController.formatString("ImportStickers", R.string.ImportStickers, LocaleController.formatPluralString("Stickers", importingStickersPaths != null ? importingStickersPaths.size() : importingStickers.size())), Theme.key_dialogTextBlue2); pickerBottomLayout.setEnabled(true); } else { - setButton(null, LocaleController.getString("ImportStickersProcessing", R.string.ImportStickersProcessing).toUpperCase(), Theme.key_dialogTextGray2); + setButton(null, LocaleController.getString("ImportStickersProcessing", R.string.ImportStickersProcessing), Theme.key_dialogTextGray2); pickerBottomLayout.setEnabled(false); } } else { - String text = LocaleController.getString("Close", R.string.Close).toUpperCase(); + String text = LocaleController.getString("Close", R.string.Close); setButton((v) -> dismiss(), text, Theme.key_dialogTextBlue2); } } @@ -1279,6 +1440,13 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } else { runShadowAnimation(0, true); } + +// if (layoutManager.findLastCompletelyVisibleItemPosition() == adapter.getItemCount() - 1) { +// runShadowAnimation(1, false); +// } else { + runShadowAnimation(1, true); +// } + if (scrollOffsetY != newOffset) { setScrollOffsetY(newOffset); } @@ -1289,6 +1457,9 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not gridView.setTopGlowOffset(newOffset); if (stickerSetCovereds == null) { titleTextView.setTranslationY(newOffset); + if (descriptionTextView != null) { + descriptionTextView.setTranslationY(newOffset); + } if (importingStickers == null) { optionsButton.setTranslationY(newOffset); } @@ -1465,8 +1636,10 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } private void setButton(View.OnClickListener onClickListener, String title, String colorKey, String backgroundColorKey, String backgroundSelectorColorKey) { - pickerBottomLayout.setTextColor(getThemedColor(buttonTextColorKey = colorKey)); - pickerBottomLayout.setText(customButtonDelegate == null ? title.toUpperCase() : title); + if (colorKey != null) { + pickerBottomLayout.setTextColor(getThemedColor(buttonTextColorKey = colorKey)); + } + pickerBottomLayout.setText(title); pickerBottomLayout.setOnClickListener(onClickListener); ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) pickerBottomLayout.getLayoutParams(); @@ -1545,6 +1718,9 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not descriptions.add(new ThemeDescription(shadow[1], ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_dialogShadowLine)); descriptions.add(new ThemeDescription(gridView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_dialogScrollGlow)); descriptions.add(new ThemeDescription(titleTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_dialogTextBlack)); + if (descriptionTextView != null) { + descriptions.add(new ThemeDescription(descriptionTextView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_chat_emojiPanelTrendingDescription)); + } descriptions.add(new ThemeDescription(titleTextView, ThemeDescription.FLAG_LINKCOLOR, null, null, null, null, Theme.key_dialogTextLink)); descriptions.add(new ThemeDescription(optionsButton, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_player_actionBarSelector)); descriptions.add(new ThemeDescription(pickerBottomLayout, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_dialogBackground)); @@ -1613,7 +1789,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not case 0: StickerEmojiCell cell = new StickerEmojiCell(context, false) { public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(MeasureSpec.makeMeasureSpec(itemSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(82), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(itemSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(itemSize/*AndroidUtilities.dp(82)*/, MeasureSpec.EXACTLY)); } }; cell.getImageView().setLayerNum(7); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java new file mode 100644 index 000000000..1d5aec6da --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java @@ -0,0 +1,758 @@ +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.CornerPathEffect; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextWatcher; +import android.util.Log; +import android.view.Gravity; +import android.view.HapticFeedbackConstants; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.OvershootInterpolator; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.exoplayer2.util.SystemClock; + +import org.checkerframework.checker.units.qual.A; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChatActivity; + +import java.util.ArrayList; +import java.util.Arrays; + +public class SuggestEmojiView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { + + private final int currentAccount; + private final Theme.ResourcesProvider resourcesProvider; + private final ChatActivityEnterView enterView; + + private final FrameLayout containerView = new FrameLayout(getContext()) { + @Override + protected void dispatchDraw(Canvas canvas) { + SuggestEmojiView.this.drawContainerBegin(canvas); + super.dispatchDraw(canvas); + SuggestEmojiView.this.drawContainerEnd(canvas); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + this.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(8), AndroidUtilities.dp(10), AndroidUtilities.dp(6.66f)); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public void setVisibility(int visibility) { + boolean same = getVisibility() == visibility; + super.setVisibility(visibility); + if (!same) { + boolean visible = visibility == View.VISIBLE; + for (int i = 0; i < listView.getChildCount(); ++i) { + if (visible) { + ((Adapter.EmojiImageView) listView.getChildAt(i)).attach(); + } else { + ((Adapter.EmojiImageView) listView.getChildAt(i)).detach(); + } + } + } + } + }; + private final RecyclerListView listView; + private final Adapter adapter; + private final LinearLayoutManager layout; + + private boolean show, forceClose; + private ArrayList keywordResults = new ArrayList<>(); + private boolean clear; + + public SuggestEmojiView(Context context, int currentAccount, ChatActivityEnterView enterView, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.currentAccount = currentAccount; + this.enterView = enterView; + this.resourcesProvider = resourcesProvider; + + this.listView = new RecyclerListView(context) { + private boolean left, right; + @Override + public void onScrolled(int dx, int dy) { + super.onScrolled(dx, dy); + boolean left = canScrollHorizontally(-1); + boolean right = canScrollHorizontally(1); + if (this.left != left || this.right != right) { + containerView.invalidate(); + this.left = left; + this.right = right; + } + } + }; + this.listView.setAdapter(this.adapter = new Adapter()); + this.layout = new LinearLayoutManager(context); + this.layout.setOrientation(RecyclerView.HORIZONTAL); + this.listView.setLayoutManager(this.layout); + DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); + itemAnimator.setDurations(45); + itemAnimator.setTranslationInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + this.listView.setItemAnimator(itemAnimator); + this.listView.setSelectorDrawableColor(Theme.getColor(Theme.key_listSelector, resourcesProvider)); + this.listView.setOnItemClickListener((view, position) -> { + onClick(((Adapter.EmojiImageView) view).emoji); + }); + + this.containerView.addView(this.listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 44 + 8)); + this.addView(this.containerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 8 + 44 + 8 + 6.66f, Gravity.BOTTOM)); + + this.enterView.getEditField().addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} + @Override + public void afterTextChanged(Editable editable) { + if (enterView.getVisibility() == View.VISIBLE) { + fireUpdate(); + } + } + }); + + this.leftGradient = getResources().getDrawable(R.drawable.gradient_right).mutate(); + this.leftGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + + this.rightGradient = getResources().getDrawable(R.drawable.gradient_left).mutate(); + this.rightGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + + MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_EMOJIPACKS); + } + + public void onTextSelectionChanged(int start, int end) { + fireUpdate(); + } + + public boolean isShown() { + return show; + } + + public void updateColors() { + if (backgroundPaint != null) { + backgroundPaint.setColor(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider)); + } + this.leftGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + this.rightGradient.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + } + + public void forceClose() { + if (updateRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(updateRunnable); + updateRunnable = null; + } + show = false; + forceClose = true; + containerView.invalidate(); + } + + private Runnable updateRunnable; + public void fireUpdate() { + if (updateRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(updateRunnable); + updateRunnable = null; + } + AndroidUtilities.runOnUIThread(updateRunnable = this::update, 16); + } + + private void update() { + updateRunnable = null; + if (enterView == null || enterView.getEditField() == null || enterView.getFieldText() == null) { + show = false; + forceClose = true; + containerView.invalidate(); + return; + } + int selectionStart = enterView.getEditField().getSelectionStart(); + int selectionEnd = enterView.getEditField().getSelectionEnd(); + if (selectionStart != selectionEnd) { + show = false; + containerView.invalidate(); + return; + } + CharSequence text = enterView.getFieldText(); + Emoji.EmojiSpan[] emojiSpans = (text instanceof Spanned) ? ((Spanned) text).getSpans(Math.max(0, selectionEnd - 24), selectionEnd, Emoji.EmojiSpan.class) : null; + if (emojiSpans != null && emojiSpans.length > 0 && SharedConfig.suggestAnimatedEmoji) { + Emoji.EmojiSpan lastEmoji = emojiSpans[emojiSpans.length - 1]; + if (lastEmoji != null) { + int emojiStart = ((Spanned) text).getSpanStart(lastEmoji); + int emojiEnd = ((Spanned) text).getSpanEnd(lastEmoji); + if (selectionStart == emojiEnd) { + String emoji = text.toString().substring(emojiStart, emojiEnd); + show = true; + containerView.setVisibility(View.VISIBLE); + arrowToSpan = lastEmoji; + arrowToStart = arrowToEnd = null; + searchAnimated(emoji); + containerView.invalidate(); + return; + } + } + } else { + AnimatedEmojiSpan[] aspans = (text instanceof Spanned) ? ((Spanned) text).getSpans(Math.max(0, selectionEnd), selectionEnd, AnimatedEmojiSpan.class) : null; + if ((aspans == null || aspans.length == 0) && selectionEnd < 52) { + show = true; + containerView.setVisibility(View.VISIBLE); + arrowToSpan = null; + searchKeywords(text.toString().substring(0, selectionEnd)); + containerView.invalidate(); + return; + } + } + if (searchRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(searchRunnable); + searchRunnable = null; + } + show = false; + containerView.invalidate(); + } + + private int lastQueryType; + private String lastQuery; + private int lastQueryId; + private String[] lastLang; + private Runnable searchRunnable; + private void searchKeywords(String query) { + if (query == null) { + return; + } + if (lastQuery != null && lastQueryType == 1 && lastQuery.equals(query) && !clear && !keywordResults.isEmpty()) { + forceClose = false; + containerView.setVisibility(View.VISIBLE); + lastSpanY = AndroidUtilities.dp(10); + containerView.invalidate(); + return; + } + final int id = ++lastQueryId; + + String[] lang = AndroidUtilities.getCurrentKeyboardLanguage(); + if (lastLang == null || !Arrays.equals(lang, lastLang)) { + MediaDataController.getInstance(currentAccount).fetchNewEmojiKeywords(lang); + } + lastLang = lang; + + if (searchRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(searchRunnable); + searchRunnable = null; + } + searchRunnable = () -> { + MediaDataController.getInstance(currentAccount).getEmojiSuggestions(lang, query, true, (param, alias) -> { + if (id == lastQueryId) { + lastQueryType = 1; + lastQuery = query; + if (param != null && !param.isEmpty()) { + clear = false; + forceClose = false; + containerView.setVisibility(View.VISIBLE); + lastSpanY = AndroidUtilities.dp(10); + keywordResults = param; + arrowToStart = 0; + arrowToEnd = query.length(); + containerView.invalidate(); + adapter.notifyDataSetChanged(); + } else { + clear = true; + forceClose(); + } + } + }, true); + }; + if (keywordResults.isEmpty()) { + AndroidUtilities.runOnUIThread(searchRunnable, 600); + } else { + searchRunnable.run(); + } + } + + private void searchAnimated(String emoji) { + if (emoji == null) { + return; + } + if (lastQuery != null && lastQueryType == 2 && lastQuery.equals(emoji) && !clear && !keywordResults.isEmpty()) { + forceClose = false; + containerView.setVisibility(View.VISIBLE); + containerView.invalidate(); + return; + } + final int id = ++lastQueryId; + + if (searchRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(searchRunnable); + searchRunnable = null; + } + + searchRunnable = () -> { + ArrayList standard = new ArrayList<>(1); + standard.add(new MediaDataController.KeywordResult(emoji, null)); + MediaDataController.getInstance(currentAccount).fillWithAnimatedEmoji(standard, 15, () -> { + if (id == lastQueryId) { + lastQuery = emoji; + lastQueryType = 2; + standard.remove(standard.size() - 1); + if (!standard.isEmpty()) { + clear = false; + forceClose = false; + containerView.setVisibility(View.VISIBLE); + keywordResults = standard; + adapter.notifyDataSetChanged(); + containerView.invalidate(); + } else { + clear = true; + forceClose(); + } + } + }); + }; + if (keywordResults.isEmpty()) { + AndroidUtilities.runOnUIThread(searchRunnable, 600); + } else { + searchRunnable.run(); + } + } + + private CharSequence makeEmoji(String emojiSource) { + Paint.FontMetricsInt fontMetricsInt = enterView.getEditField().getPaint().getFontMetricsInt(); + CharSequence emoji; + if (emojiSource != null && emojiSource.startsWith("animated_")) { + try { + long documentId = Long.parseLong(emojiSource.substring(9)); + TLRPC.Document document = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); + emoji = new SpannableString(MessageObject.findAnimatedEmojiEmoticon(document)); + AnimatedEmojiSpan span; + if (document == null) { + span = new AnimatedEmojiSpan(documentId, fontMetricsInt); + } else { + span = new AnimatedEmojiSpan(document, fontMetricsInt); + } + ((SpannableString) emoji).setSpan(span, 0, emoji.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } catch (Exception ignore) { + return null; + } + } else { + emoji = emojiSource; + emoji = Emoji.replaceEmoji(emoji, fontMetricsInt, AndroidUtilities.dp(20), true); + } + return emoji; + } + + private void onClick(String emojiSource) { + if (!show || enterView == null || !(enterView.getFieldText() instanceof Spanned)) { + return; + } + int start, end; + if (arrowToSpan != null) { + start = ((Spanned) enterView.getFieldText()).getSpanStart(arrowToSpan); + end = ((Spanned) enterView.getFieldText()).getSpanEnd(arrowToSpan); + } else if (arrowToStart != null && arrowToEnd != null) { + start = arrowToStart; + end = arrowToEnd; + arrowToStart = arrowToEnd = null; + } else { + return; + } + Editable editable = enterView.getEditField().getText(); + if (editable == null || start < 0 || end < 0 || start > editable.length() || end > editable.length()) { + return; + } + if (arrowToSpan != null) { + if (enterView.getFieldText() instanceof Spannable) { + ((Spannable) enterView.getFieldText()).removeSpan(arrowToSpan); + } + arrowToSpan = null; + } + String fromString = editable.toString(); + String replacing = fromString.substring(start, end); + int replacingLength = replacing.length(); + for (int i = end - replacingLength; i >= 0; i -= replacingLength) { + if (fromString.substring(i, i + replacingLength).equals(replacing)) { + CharSequence emoji = makeEmoji(emojiSource); + if (emoji != null) { + AnimatedEmojiSpan[] animatedEmojiSpans = editable.getSpans(i, i + replacingLength, AnimatedEmojiSpan.class); + if (animatedEmojiSpans != null && animatedEmojiSpans.length > 0) { + break; + } + Emoji.EmojiSpan[] emojiSpans = editable.getSpans(i, i + replacingLength, Emoji.EmojiSpan.class); + if (emojiSpans != null) { + for (int j = 0; j < emojiSpans.length; ++j) { + editable.removeSpan(emojiSpans[j]); + } + } + editable.replace(i, i + replacingLength, emoji); + } else { + break; + } + } else { + break; + } + } + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {} + Emoji.addRecentEmoji(emojiSource); + show = false; + forceClose = true; + lastQueryType = 0; + containerView.invalidate(); + } + + private Path path = new Path(), circlePath = new Path(); + private Paint backgroundPaint; + private AnimatedFloat showFloat1 = new AnimatedFloat(containerView, 120, 350, CubicBezierInterpolator.EASE_OUT_QUINT); + private AnimatedFloat showFloat2 = new AnimatedFloat(containerView, 150, 600, CubicBezierInterpolator.EASE_OUT_QUINT); + private OvershootInterpolator overshootInterpolator = new OvershootInterpolator(.4f); + + private Drawable leftGradient, rightGradient; + private AnimatedFloat leftGradientAlpha = new AnimatedFloat(containerView, 300, CubicBezierInterpolator.EASE_OUT_QUINT); + private AnimatedFloat rightGradientAlpha = new AnimatedFloat(containerView, 300, CubicBezierInterpolator.EASE_OUT_QUINT); + + private Emoji.EmojiSpan arrowToSpan; + private float lastSpanY; + private Integer arrowToStart, arrowToEnd; + private float arrowX; + private AnimatedFloat arrowXAnimated = new AnimatedFloat(containerView, 200, CubicBezierInterpolator.EASE_OUT_QUINT); + + private AnimatedFloat listViewCenterAnimated = new AnimatedFloat(containerView, 350, CubicBezierInterpolator.EASE_OUT_QUINT); + private AnimatedFloat listViewWidthAnimated = new AnimatedFloat(containerView, 350, CubicBezierInterpolator.EASE_OUT_QUINT); + + private void drawContainerBegin(Canvas canvas) { + if (enterView != null && enterView.getEditField() != null) { + if (arrowToSpan != null && arrowToSpan.drawn) { + arrowX = enterView.getEditField().getX() + enterView.getEditField().getPaddingLeft() + arrowToSpan.lastDrawX; + lastSpanY = arrowToSpan.lastDrawY; + } else if (arrowToStart != null && arrowToEnd != null) { + arrowX = enterView.getEditField().getX() + enterView.getEditField().getPaddingLeft() + AndroidUtilities.dp(12); + } + } + + final boolean show = this.show && !forceClose && !keywordResults.isEmpty() && !clear; + final float showT1 = showFloat1.set(show ? 1f : 0f); + final float showT2 = showFloat2.set(show ? 1f : 0f); + final float arrowX = arrowXAnimated.set(this.arrowX); + + if (showT1 <= 0 && showT2 <= 0 && !show) { + containerView.setVisibility(View.GONE); + } + + path.rewind(); + + float listViewLeft = listView.getLeft(); + float listViewRight = listView.getLeft() + keywordResults.size() * AndroidUtilities.dp(44); + + boolean force = listViewWidthAnimated.get() <= 0; + float width = listViewRight - listViewLeft <= 0 ? listViewWidthAnimated.get() : listViewWidthAnimated.set(listViewRight - listViewLeft, force); + float center = listViewCenterAnimated.set((listViewLeft + listViewRight) / 2f, force); + + if (enterView != null && enterView.getEditField() != null) { + containerView.setTranslationY(-enterView.getEditField().getHeight() - enterView.getEditField().getScrollY() + lastSpanY + AndroidUtilities.dp(5)); + } + int listViewPaddingLeft = (int) Math.max(this.arrowX - Math.max(width / 4f, Math.min(width / 2f, AndroidUtilities.dp(66))) - listView.getLeft(), 0); + if (listView.getPaddingLeft() != listViewPaddingLeft) { + int dx = listView.getPaddingLeft() - listViewPaddingLeft; + listView.setPadding(listViewPaddingLeft, 0, 0, 0); + listView.scrollBy(dx, 0); + } + int listViewPaddingLeftI = (int) Math.max(arrowX - Math.max(width / 4f, Math.min(width / 2f, AndroidUtilities.dp(66))) - listView.getLeft(), 0); + listView.setTranslationX(listViewPaddingLeftI - listViewPaddingLeft); + + float left = center - width / 2f + listView.getPaddingLeft() + listView.getTranslationX(); + float top = listView.getTop() + listView.getTranslationY() + listView.getPaddingTop(); + float right = Math.min(center + width / 2f + listView.getPaddingLeft() + listView.getTranslationX(), getWidth() - containerView.getPaddingRight()); + float bottom = listView.getBottom() + listView.getTranslationY() - AndroidUtilities.dp(6.66f); + + float R = Math.min(AndroidUtilities.dp(9), width / 2f), D = R * 2; + + AndroidUtilities.rectTmp.set(left, bottom - D, left + D, bottom); + path.arcTo(AndroidUtilities.rectTmp, 90, 90); + + AndroidUtilities.rectTmp.set(left, top, left + D, top + D); + path.arcTo(AndroidUtilities.rectTmp, -180, 90); + + AndroidUtilities.rectTmp.set(right - D, top, right, top + D); + path.arcTo(AndroidUtilities.rectTmp, -90, 90); + + AndroidUtilities.rectTmp.set(right - D, bottom - D, right, bottom); + path.arcTo(AndroidUtilities.rectTmp, 0, 90); + + path.lineTo(arrowX + AndroidUtilities.dp(8.66f), bottom); + path.lineTo(arrowX, bottom + AndroidUtilities.dp(6.66f)); + path.lineTo(arrowX - AndroidUtilities.dp(8.66f), bottom); + + path.close(); + + if (backgroundPaint == null) { + backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + backgroundPaint.setPathEffect(new CornerPathEffect(AndroidUtilities.dp(2))); + backgroundPaint.setShadowLayer(AndroidUtilities.dp(4.33f), 0, AndroidUtilities.dp(1 / 3f), 0x33000000); + backgroundPaint.setColor(Theme.getColor(Theme.key_chat_stickersHintPanel, resourcesProvider)); + } + + if (showT1 < 1) { + circlePath.rewind(); + float cx = arrowX, cy = bottom + AndroidUtilities.dp(6.66f); + float toRadius = (float) Math.sqrt(Math.max( + Math.max( + Math.pow(cx - left, 2) + Math.pow(cy - top, 2), + Math.pow(cx - right, 2) + Math.pow(cy - top, 2) + ), + Math.max( + Math.pow(cx - left, 2) + Math.pow(cy - bottom, 2), + Math.pow(cx - right, 2) + Math.pow(cy - bottom, 2) + ) + )); + circlePath.addCircle(cx, cy, toRadius * showT1, Path.Direction.CW); + canvas.save(); + canvas.clipPath(circlePath); + canvas.saveLayerAlpha(0, 0, getWidth(), getHeight(), (int) (255 * showT1), Canvas.ALL_SAVE_FLAG); + } + + canvas.drawPath(path, backgroundPaint); + canvas.save(); + canvas.clipPath(path); + +// final int count = listView.getChildCount(); +// for (int i = 0; i < count; ++i) { +// listView.getChildAt(i).setTranslationY((1f - overshootInterpolator.getInterpolation(AndroidUtilities.cascade(showT2, i, count + 1, 4))) * AndroidUtilities.dp(16)); +// } + } + + public void drawContainerEnd(Canvas canvas) { + + final float width = listViewWidthAnimated.get(); + final float center = listViewCenterAnimated.get(); + + float left = center - width / 2f + listView.getPaddingLeft() + listView.getTranslationX(); + float top = listView.getTop() + listView.getPaddingTop(); + float right = Math.min(center + width / 2f + listView.getPaddingLeft() + listView.getTranslationX(), getWidth() - containerView.getPaddingRight()); + float bottom = listView.getBottom(); + + float leftAlpha = leftGradientAlpha.set(listView.canScrollHorizontally(-1) ? 1f : 0f); + if (leftAlpha > 0) { + leftGradient.setBounds((int) left, (int) top, (int) left + AndroidUtilities.dp(32), (int) bottom); + leftGradient.setAlpha((int) (255 * leftAlpha)); + leftGradient.draw(canvas); + } + + float rightAlpha = rightGradientAlpha.set(listView.canScrollHorizontally(1) ? 1f : 0f); + if (rightAlpha > 0) { + rightGradient.setBounds((int) right - AndroidUtilities.dp(32), (int) top, (int) right, (int) bottom); + rightGradient.setAlpha((int) (255 * rightAlpha)); + rightGradient.draw(canvas); + } + + canvas.restore(); + if (showFloat1.get() < 1) { + canvas.restore(); + canvas.restore(); + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + + final float width = listViewWidthAnimated.get(); + final float center = listViewCenterAnimated.get(); + + AndroidUtilities.rectTmp.set( + center - width / 2f + listView.getPaddingLeft() + listView.getTranslationX(), + listView.getTop() + listView.getPaddingTop(), + Math.min(center + width / 2f + listView.getPaddingLeft() + listView.getTranslationX(), getWidth() - containerView.getPaddingRight()), + listView.getBottom() + ); + AndroidUtilities.rectTmp.offset(containerView.getX(), containerView.getY()); + + if (show && AndroidUtilities.rectTmp.contains(ev.getX(), ev.getY())) { + return super.dispatchTouchEvent(ev); + } else { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + return false; + } else { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + ev.setAction(MotionEvent.ACTION_CANCEL); + } + return super.dispatchTouchEvent(ev); + } + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiLoaded); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.newEmojiSuggestionsAvailable); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.newEmojiSuggestionsAvailable); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.newEmojiSuggestionsAvailable) { + if (!keywordResults.isEmpty()) { + fireUpdate(); + } + } else if (id == NotificationCenter.emojiLoaded) { + for (int i = 0; i < listView.getChildCount(); ++i) { + listView.getChildAt(i).invalidate(); + } + } + } + + public void invalidateContent() { + containerView.invalidate(); + } + + private class Adapter extends RecyclerListView.SelectionAdapter { + + private class EmojiImageView extends View { + + private String emoji; + private Drawable drawable; + private boolean attached; + + private AnimatedFloat pressed = new AnimatedFloat(this, 350, new OvershootInterpolator(5.0f)); + + public EmojiImageView(Context context) { + super(context); + } + + private final int paddingDp = 3; + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setPadding(AndroidUtilities.dp(paddingDp), AndroidUtilities.dp(paddingDp), AndroidUtilities.dp(paddingDp), AndroidUtilities.dp(paddingDp + 6.66f)); + super.onMeasure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(44), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(44 + 8), MeasureSpec.EXACTLY) + ); + } + + private void setEmoji(String emoji) { + this.emoji = emoji; + if (emoji != null && emoji.startsWith("animated_")) { + try { + long documentId = Long.parseLong(emoji.substring(9)); + if (!(drawable instanceof AnimatedEmojiDrawable) || ((AnimatedEmojiDrawable) drawable).getDocumentId() != documentId) { + setImageDrawable(AnimatedEmojiDrawable.make(currentAccount, AnimatedEmojiDrawable.CACHE_TYPE_KEYBOARD, documentId)); + } + } catch (Exception ignore) { + setImageDrawable(null); + } + } else { + setImageDrawable(Emoji.getEmojiBigDrawable(emoji)); + } + } + + public void setImageDrawable(@Nullable Drawable drawable) { + if (this.drawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) this.drawable).removeView(this); + } + this.drawable = drawable; + if (drawable instanceof AnimatedEmojiDrawable && attached) { + ((AnimatedEmojiDrawable) drawable).addView(this); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + float scale = 0.8f + 0.2f * (1f - pressed.set(isPressed() ? 1f : 0f)); + if (drawable != null) { + int cx = getWidth() / 2, cy = (getHeight() - getPaddingBottom() + getPaddingTop()) / 2, w = getWidth() - getPaddingLeft() - getPaddingRight(), h = getHeight() - getPaddingTop() - getPaddingBottom(); + drawable.setBounds((int) (cx - w / 2 * scale), (int) (cy - h / 2 * scale), (int) (cx + w / 2 * scale), (int) (cy + h / 2 * scale)); + if (drawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) drawable).setTime(System.currentTimeMillis()); + } + drawable.draw(canvas); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + attach(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + detach(); + } + + public void detach() { + if (drawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) drawable).removeView(this); + } + attached = false; + } + public void attach() { + if (drawable instanceof AnimatedEmojiDrawable) { + ((AnimatedEmojiDrawable) drawable).addView(this); + } + attached = true; + } + } + + public Adapter() { +// setHasStableIds(true); + } + + @Override + public long getItemId(int position) { + return keywordResults.get(position).emoji.hashCode(); + } + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + return true; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new RecyclerListView.Holder(new EmojiImageView(getContext())); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + ((EmojiImageView) holder.itemView).setEmoji(keywordResults.get(position).emoji); + } + + @Override + public int getItemCount() { + return keywordResults.size(); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TextStyleSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TextStyleSpan.java index 550f183b0..84562c121 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TextStyleSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TextStyleSpan.java @@ -137,6 +137,10 @@ public class TextStyleSpan extends MetricAffectingSpan { return (style.flags & FLAG_STYLE_SPOILER) > 0; } + public boolean isSpoilerRevealed() { + return (style.flags & FLAG_STYLE_SPOILER_REVEALED) > 0; + } + public void setSpoilerRevealed(boolean b) { if (b) style.flags |= FLAG_STYLE_SPOILER_REVEALED; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranscribeButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranscribeButton.java index 9457c0ec7..bf173f9e7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranscribeButton.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranscribeButton.java @@ -76,7 +76,6 @@ public class TranscribeButton { outIconDrawable = new RLottieDrawable(R.raw.transcribe_out, "transcribe_out", AndroidUtilities.dp(26), AndroidUtilities.dp(26)); outIconDrawable.setCurrentFrame(0); outIconDrawable.setCallback(parent); - outIconDrawable.addParentView(parent); outIconDrawable.setOnFinishCallback(() -> { outIconDrawable.stop(); inIconDrawable.stop(); @@ -88,7 +87,7 @@ public class TranscribeButton { inIconDrawable = new RLottieDrawable(R.raw.transcribe_in, "transcribe_in", AndroidUtilities.dp(26), AndroidUtilities.dp(26)); inIconDrawable.setCurrentFrame(0); inIconDrawable.setCallback(parent); - inIconDrawable.addParentView(parent); + inIconDrawable.setMasterParent(parent); inIconDrawable.setOnFinishCallback(() -> { inIconDrawable.stop(); outIconDrawable.stop(); @@ -222,12 +221,12 @@ public class TranscribeButton { inIconDrawable.setLayerColor("Artboard Outlines.**", this.iconColor); inIconDrawable.commitApplyLayerColors(); inIconDrawable.setAllowDecodeSingleFrame(true); - inIconDrawable.updateCurrentFrame(); + inIconDrawable.updateCurrentFrame(0, false); outIconDrawable.beginApplyLayerColors(); outIconDrawable.setLayerColor("Artboard Outlines.**", this.iconColor); outIconDrawable.commitApplyLayerColors(); outIconDrawable.setAllowDecodeSingleFrame(true); - outIconDrawable.updateCurrentFrame(); + outIconDrawable.updateCurrentFrame(0, false); } // inIconDrawable.setAlpha(disabled ? 125 : 255); // outIconDrawable.setAlpha(disabled ? 125 : 255); @@ -355,7 +354,7 @@ public class TranscribeButton { lottie.setLayerColor("Comp 1.**", color); lottie.commitApplyLayerColors(); lottie.setAllowDecodeSingleFrame(true); - lottie.updateCurrentFrame(); + lottie.updateCurrentFrame(0, false); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersAlert.java index 024b40bd3..19b4d51ff 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersAlert.java @@ -240,12 +240,33 @@ public class TrendingStickersAlert extends BottomSheet { canvas.restore(); } + private boolean statusBarOpen; + private void updateLightStatusBar(boolean open) { + if (statusBarOpen != open) { + statusBarOpen = open; + boolean openBgLight = AndroidUtilities.computePerceivedBrightness(getThemedColor(Theme.key_dialogBackground)) > .721f; + boolean closedBgLight = AndroidUtilities.computePerceivedBrightness(Theme.blendOver(getThemedColor(Theme.key_actionBarDefault), 0x33000000)) > .721f; + boolean isLight = open ? openBgLight : closedBgLight; + AndroidUtilities.setLightStatusBar(getWindow(), isLight); + } + } + @Override protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); final float fraction = getFraction(); + // status bar + setStatusBarVisible(fraction == 0f && Build.VERSION.SDK_INT >= 21 && !isDismissed(), true); + updateLightStatusBar(statusBarAlpha > .5f); + if (statusBarAlpha > 0f) { + paint.setColor(getThemedColor(Theme.key_dialogBackground)); + int bottom = (int) Math.max(0, scrollOffsetY + (topOffset * (1f - getFraction())) + AndroidUtilities.dp(24) + (layout.getTranslationY() + ((Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0) - topOffset))); + canvas.drawRect(backgroundPaddingLeft, AndroidUtilities.lerp(bottom, -AndroidUtilities.statusBarHeight, statusBarAlpha), getMeasuredWidth() - backgroundPaddingLeft, bottom, paint); + } + + super.dispatchDraw(canvas); + canvas.save(); canvas.translate(0, layout.getTranslationY() + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0) - topOffset); @@ -260,14 +281,6 @@ public class TrendingStickersAlert extends BottomSheet { shapeDrawable.draw(canvas); canvas.restore(); - - // status bar - setStatusBarVisible(fraction == 0f && Build.VERSION.SDK_INT >= 21 && !isDismissed(), true); - if (statusBarAlpha > 0f) { - final int color = getThemedColor(Theme.key_dialogBackground); - paint.setColor(Color.argb((int) (0xff * statusBarAlpha), (int) (Color.red(color) * 0.8f), (int) (Color.green(color) * 0.8f), (int) (Color.blue(color) * 0.8f))); - canvas.drawRect(backgroundPaddingLeft, 0, getMeasuredWidth() - backgroundPaddingLeft, AndroidUtilities.statusBarHeight, paint); - } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersLayout.java index fd8cd6f08..7c71e784f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TrendingStickersLayout.java @@ -502,7 +502,7 @@ public class TrendingStickersLayout extends FrameLayout implements NotificationC } } } else if (id == NotificationCenter.featuredStickersDidLoad) { - if (hash != MediaDataController.getInstance(currentAccount).getFeaturesStickersHashWithoutUnread()) { + if (hash != MediaDataController.getInstance(currentAccount).getFeaturedStickersHashWithoutUnread(false)) { loaded = false; } if (loaded) { @@ -790,7 +790,7 @@ public class TrendingStickersLayout extends FrameLayout implements NotificationC final ArrayList unreadStickers = mediaDataController.getUnreadStickerSets(); unread = unreadStickers != null && unreadStickers.contains(stickerSetCovered.set.id); if (unread) { - mediaDataController.markFaturedStickersByIdAsRead(stickerSetCovered.set.id); + mediaDataController.markFeaturedStickersByIdAsRead(false, stickerSetCovered.set.id); } } else { stickerSetCovered = sets.get((Integer) cache.get(position)); @@ -924,7 +924,7 @@ public class TrendingStickersLayout extends FrameLayout implements NotificationC } if (totalItems != 0) { loaded = true; - hash = mediaDataController.getFeaturesStickersHashWithoutUnread(); + hash = mediaDataController.getFeaturedStickersHashWithoutUnread(false); } notifyDataSetChanged(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoSeekPreviewImage.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoSeekPreviewImage.java index 5c5d1974d..1f29431bc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoSeekPreviewImage.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoSeekPreviewImage.java @@ -186,10 +186,10 @@ public class VideoSeekPreviewImage extends View { } else { path = FileLoader.getInstance(currentAccount).getPathToAttach(document, false).getAbsolutePath(); } - fileDrawable = new AnimatedFileDrawable(new File(path), true, document.size, document, null, parentObject, 0, currentAccount, true); + fileDrawable = new AnimatedFileDrawable(new File(path), true, document.size, document, null, parentObject, 0, currentAccount, true, null); } else { path = uri.getPath(); - fileDrawable = new AnimatedFileDrawable(new File(path), true, 0, null, null, null, 0, 0, true); + fileDrawable = new AnimatedFileDrawable(new File(path), true, 0, null, null, null, 0, 0, true, null); } duration = fileDrawable.getDurationMs(); if (pendingProgress != 0.0f) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/WallpaperUpdater.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/WallpaperUpdater.java index c5c048c7c..4d4881a84 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/WallpaperUpdater.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/WallpaperUpdater.java @@ -17,10 +17,11 @@ import android.graphics.Point; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; + import androidx.core.content.FileProvider; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildConfig; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLoader; @@ -79,7 +80,7 @@ public class WallpaperUpdater { File image = AndroidUtilities.generatePicturePath(); if (image != null) { if (Build.VERSION.SDK_INT >= 24) { - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(parentActivity, BuildConfig.APPLICATION_ID + ".provider", image)); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(parentActivity, ApplicationLoader.getApplicationId() + ".provider", image)); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java index 3d71ccf25..73ae23c2c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilerEffect.java @@ -526,7 +526,7 @@ public class SpoilerEffect extends Drawable { int w = textLayout.getWidth(); int h = textLayout.getHeight(); - if (w == 0 || h == 0) + if (w <= 0 || h <= 0) return Collections.emptyList(); Bitmap measureBitmap = Bitmap.createBitmap(Math.round(w), Math.round(h), Bitmap.Config.ARGB_4444); // We can use 4444 as we don't need accuracy here diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/CellFlickerDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/CellFlickerDrawable.java index 4292c2d12..75d08fdf1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/CellFlickerDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/CellFlickerDrawable.java @@ -199,7 +199,7 @@ public class CellFlickerDrawable { svgDrawable.setPaint(paint); float x = (parentWidth + size * 2) * progress - size; int drawableSize = (int) (parentWidth * 0.5f); - float s = svgDrawable.getScale(); + float s = svgDrawable.getScale(getBounds().width(), getBounds().height()); matrix.reset(); matrix.setScale(1f / s, 0, size / 2f, 0); matrix.setTranslate(x - svgDrawable.getBounds().left - size / s, 0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java index 7311ecca0..22dabdb56 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java @@ -81,6 +81,10 @@ public class ContentPreviewViewer { } public interface ContentPreviewViewerDelegate { + default boolean can() { + return true; + } + void sendSticker(TLRPC.Document sticker, String query, Object parent, boolean notify, int scheduleDate); void openSet(TLRPC.InputStickerSet set, boolean clearInputField); @@ -533,6 +537,9 @@ public class ContentPreviewViewer { public boolean onTouch(MotionEvent event, final RecyclerListView listView, final int height, final Object listener, ContentPreviewViewerDelegate contentPreviewViewerDelegate, Theme.ResourcesProvider resourcesProvider) { delegate = contentPreviewViewerDelegate; this.resourcesProvider = resourcesProvider; + if (delegate != null && !delegate.can()) { + return false; + } if (openPreviewRunnable != null || isVisible()) { if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_POINTER_UP) { AndroidUtilities.runOnUIThread(() -> { @@ -693,6 +700,9 @@ public class ContentPreviewViewer { public boolean onInterceptTouchEvent(MotionEvent event, final RecyclerListView listView, final int height, ContentPreviewViewerDelegate contentPreviewViewerDelegate, Theme.ResourcesProvider resourcesProvider) { delegate = contentPreviewViewerDelegate; this.resourcesProvider = resourcesProvider; + if (delegate != null && !delegate.can()) { + return false; + } if (event.getAction() == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); @@ -749,7 +759,7 @@ public class ContentPreviewViewer { listView.setOnItemClickListener((RecyclerListView.OnItemClickListener) null); listView.requestDisallowInterceptTouchEvent(true); openPreviewRunnable = null; - setParentActivity((Activity) listView.getContext()); + setParentActivity(AndroidUtilities.findActivity(listView.getContext())); //setKeyboardHeight(height); clearsInputField = false; if (currentPreviewCell instanceof StickerEmojiCell) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DefaultThemesPreviewCell.java b/TMessagesProj/src/main/java/org/telegram/ui/DefaultThemesPreviewCell.java index 1a5360069..0f71d31ec 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DefaultThemesPreviewCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DefaultThemesPreviewCell.java @@ -206,66 +206,67 @@ public class DefaultThemesPreviewCell extends LinearLayout { dayNightCell.getImageView().getLocationInWindow(pos); pos[0] += dayNightCell.getImageView().getMeasuredWidth() / 2; pos[1] += dayNightCell.getImageView().getMeasuredHeight() / 2 + AndroidUtilities.dp(3); - NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, themeInfo, false, pos, -1, toDark, dayNightCell.getImageView(), dayNightCell); - updateDayNightMode(); - updateSelectedPosition(); + Runnable then = () -> AndroidUtilities.runOnUIThread(() -> { + updateDayNightMode(); + updateSelectedPosition(); - int iconNewColor = Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4); - darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconNewColor, PorterDuff.Mode.SRC_IN)); - ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f); - valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - int iconColor = ColorUtils.blendARGB(iconOldColor, iconNewColor, (float) valueAnimator.getAnimatedValue()); - darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconColor, PorterDuff.Mode.SRC_IN)); - } - }); - valueAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconNewColor, PorterDuff.Mode.SRC_IN)); - super.onAnimationEnd(animation); - } - }); - valueAnimator.setDuration(350); - valueAnimator.start(); - - int navBarNewColor = Theme.getColor(Theme.key_windowBackgroundGray); - final Window window = context instanceof Activity ? ((Activity) context).getWindow() : null; - if (window != null) { - if (navBarAnimator != null && navBarAnimator.isRunning()) { - navBarOldColor = navBarColor; - navBarAnimator.cancel(); - } - final int navBarFromColor = navBarOldColor; - navBarAnimator = ValueAnimator.ofFloat(0, 1); - final float startDelay = toDark ? 50 : 200, duration = 150, fullDuration = 350; - navBarAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + int iconNewColor = Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4); + darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconNewColor, PorterDuff.Mode.SRC_IN)); + ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f); + valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { - float t = Math.max(0, Math.min(1, ((float) valueAnimator.getAnimatedValue() * fullDuration - startDelay) / duration)); - navBarColor = ColorUtils.blendARGB(navBarFromColor, navBarNewColor, t); - AndroidUtilities.setNavigationBarColor(window, navBarColor, false); - AndroidUtilities.setLightNavigationBar(window, AndroidUtilities.computePerceivedBrightness(navBarColor) >= 0.721f); + int iconColor = ColorUtils.blendARGB(iconOldColor, iconNewColor, (float) valueAnimator.getAnimatedValue()); + darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconColor, PorterDuff.Mode.SRC_IN)); } }); - navBarAnimator.addListener(new AnimatorListenerAdapter() { + valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - AndroidUtilities.setNavigationBarColor(window, navBarNewColor, false); - AndroidUtilities.setLightNavigationBar(window, AndroidUtilities.computePerceivedBrightness(navBarNewColor) >= 0.721f); + darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconNewColor, PorterDuff.Mode.SRC_IN)); + super.onAnimationEnd(animation); } }); - navBarAnimator.setDuration((long) fullDuration); - navBarAnimator.start(); - } + valueAnimator.setDuration(350); + valueAnimator.start(); - if (Theme.isCurrentThemeDay()) { - dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToNightMode", R.string.SettingsSwitchToNightMode), darkThemeDrawable, true); - } else { - dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToDayMode", R.string.SettingsSwitchToDayMode), darkThemeDrawable, true); - } + int navBarNewColor = Theme.getColor(Theme.key_windowBackgroundGray); + final Window window = context instanceof Activity ? ((Activity) context).getWindow() : null; + if (window != null) { + if (navBarAnimator != null && navBarAnimator.isRunning()) { + navBarAnimator.cancel(); + } + final int navBarFromColor = navBarAnimator != null && navBarAnimator.isRunning() ? navBarColor : navBarOldColor; + navBarAnimator = ValueAnimator.ofFloat(0, 1); + final float startDelay = toDark ? 50 : 200, duration = 150, fullDuration = 350; + navBarAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + float t = Math.max(0, Math.min(1, ((float) valueAnimator.getAnimatedValue() * fullDuration - startDelay) / duration)); + navBarColor = ColorUtils.blendARGB(navBarFromColor, navBarNewColor, t); + AndroidUtilities.setNavigationBarColor(window, navBarColor, false); + AndroidUtilities.setLightNavigationBar(window, AndroidUtilities.computePerceivedBrightness(navBarColor) >= 0.721f); + } + }); + navBarAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + AndroidUtilities.setNavigationBarColor(window, navBarNewColor, false); + AndroidUtilities.setLightNavigationBar(window, AndroidUtilities.computePerceivedBrightness(navBarNewColor) >= 0.721f); + } + }); + navBarAnimator.setDuration((long) fullDuration); + navBarAnimator.start(); + } + + if (Theme.isCurrentThemeDay()) { + dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToNightMode", R.string.SettingsSwitchToNightMode), darkThemeDrawable, true); + } else { + dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToDayMode", R.string.SettingsSwitchToDayMode), darkThemeDrawable, true); + } + }); + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, themeInfo, false, pos, -1, toDark, dayNightCell.getImageView(), dayNightCell, then); } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 9a56d18f1..57898a06b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -2229,6 +2229,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. actionBar.setBackButtonDrawable(backDrawable = new BackDrawable(false)); } else { actionBar.setBackButtonDrawable(menuDrawable = new MenuDrawable()); + menuDrawable.setRoundCap(); actionBar.setBackButtonContentDescription(LocaleController.getString("AccDescrOpenMenu", R.string.AccDescrOpenMenu)); } if (folderId != 0) { @@ -3422,7 +3423,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. contentView.setClipToPadding(false); commentView.allowBlur = false; commentView.forceSmoothKeyboard(true); - commentView.setAllowStickersAndGifs(false, false); + commentView.setAllowStickersAndGifs(true, false, false); commentView.setForceShowSendButton(true, false); commentView.setPadding(0, 0, AndroidUtilities.dp(20), 0); commentView.setVisibility(View.GONE); @@ -4297,8 +4298,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updateFilterTabsVisibility(animated); int id = filterTabsView.getCurrentTabId(); int stableId = filterTabsView.getCurrentTabStableId(); + boolean selectWithStableId = false; if (id != filterTabsView.getDefaultTabId() && id >= filters.size()) { filterTabsView.resetTabId(); + selectWithStableId = true; } filterTabsView.removeTabs(); for (int a = 0, N = filters.size(); a < N; a++) { @@ -4313,6 +4316,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updateCurrentTab = true; viewPages[0].selectedType = id; } + if (selectWithStableId) { + filterTabsView.selectTabWithStableId(stableId); + } } for (int a = 0; a < viewPages.length; a++) { if (viewPages[a].selectedType >= filters.size()) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java index 38249336a..92f59f525 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java @@ -25,6 +25,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Cells.ChatActionCell; import org.telegram.ui.Cells.ChatMessageCell; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.RecyclerListView; @@ -188,6 +189,10 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe } } + public boolean supports(String emoticon) { + return emojiInteractionsStickersMap.containsKey(unwrapEmoji(emoticon)); + } + private void findViewAndShowAnimation(int messageId, int animation) { if (!attached) { return; @@ -197,7 +202,11 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe View child = listView.getChildAt(i); if (child instanceof ChatMessageCell) { ChatMessageCell cell = (ChatMessageCell) child; - if (cell.getPhotoImage().hasNotThumb() && cell.getMessageObject().getStickerEmoji() != null) { + String stickerEmoji = cell.getMessageObject().getStickerEmoji(); + if (stickerEmoji == null) { + stickerEmoji = cell.getMessageObject().messageOwner.message; + } + if (cell.getPhotoImage().hasNotThumb() && stickerEmoji != null) { if (cell.getMessageObject().getId() == messageId) { bestView = cell; break; @@ -208,7 +217,7 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe if (bestView != null) { chatActivity.restartSticker(bestView); - if (!EmojiData.hasEmojiSupportVibration(bestView.getMessageObject().getStickerEmoji())) { + if (!EmojiData.hasEmojiSupportVibration(bestView.getMessageObject().getStickerEmoji()) && !bestView.getMessageObject().isPremiumSticker()) { bestView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); } showAnimationForCell(bestView, animation, false, true); @@ -223,32 +232,40 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe float childY = 0; for (int k = 0; k < listView.getChildCount(); k++) { View child = listView.getChildAt(k); + ImageReceiver photoImage = null; + MessageObject messageObject = null; if (child instanceof ChatMessageCell) { ChatMessageCell cell = (ChatMessageCell) child; - if (cell.getMessageObject().getId() == drawingObject.messageId) { - drawingObject.viewFound = true; - float viewX = listView.getX() + child.getX(); - float viewY = listView.getY() + child.getY(); - childY = child.getY(); - if (drawingObject.isPremiumSticker) { - drawingObject.lastX = viewX + cell.getPhotoImage().getImageX(); - drawingObject.lastY = viewY + cell.getPhotoImage().getImageY(); + messageObject = cell.getMessageObject(); + photoImage = cell.getPhotoImage(); + } else if (child instanceof ChatActionCell) { + ChatActionCell cell = (ChatActionCell) child; + messageObject = cell.getMessageObject(); + photoImage = cell.getPhotoImage(); + } + if (messageObject != null && messageObject.getId() == drawingObject.messageId) { + drawingObject.viewFound = true; + float viewX = listView.getX() + child.getX(); + float viewY = listView.getY() + child.getY(); + childY = child.getY(); + if (drawingObject.isPremiumSticker) { + drawingObject.lastX = viewX + photoImage.getImageX(); + drawingObject.lastY = viewY + photoImage.getImageY(); + } else { + viewX += photoImage.getImageX(); + viewY += photoImage.getImageY(); + if (drawingObject.isOut) { + viewX += -photoImage.getImageWidth() * 2 + AndroidUtilities.dp(24); } else { - viewX += cell.getPhotoImage().getImageX(); - viewY += cell.getPhotoImage().getImageY(); - if (drawingObject.isOut) { - viewX += -cell.getPhotoImage().getImageWidth() * 2 + AndroidUtilities.dp(24); - } else { - viewX += -AndroidUtilities.dp(24); - } - viewY -= cell.getPhotoImage().getImageWidth(); - drawingObject.lastX = viewX; - drawingObject.lastY = viewY; + viewX += -AndroidUtilities.dp(24); } - drawingObject.lastW = cell.getPhotoImage().getImageWidth(); - drawingObject.lastH = cell.getPhotoImage().getImageHeight(); - break; + viewY -= photoImage.getImageWidth(); + drawingObject.lastX = viewX; + drawingObject.lastY = viewY; } + drawingObject.lastW = photoImage.getImageWidth(); + drawingObject.lastH = photoImage.getImageHeight(); + break; } } @@ -312,19 +329,19 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe } - public boolean onTapItem(ChatMessageCell view, ChatActivity chatActivity) { + public boolean onTapItem(ChatMessageCell view, ChatActivity chatActivity, boolean userTapped) { if (chatActivity.isSecretChat() || view.getMessageObject() == null || view.getMessageObject().getId() < 0) { return false; } if (!view.getMessageObject().isPremiumSticker() && chatActivity.currentUser == null) { return false; } - boolean show = showAnimationForCell(view, -1, true, false); + boolean show = showAnimationForCell(view, -1, userTapped, false); - if (show && (!EmojiData.hasEmojiSupportVibration(view.getMessageObject().getStickerEmoji()) || view.getMessageObject().isPremiumSticker())) { + if (userTapped && show && !EmojiData.hasEmojiSupportVibration(view.getMessageObject().getStickerEmoji()) && !view.getMessageObject().isPremiumSticker()) { view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); } - if (view.getMessageObject().isPremiumSticker()) { + if (view.getMessageObject().isPremiumSticker() || (!userTapped && view.getMessageObject().isAnimatedEmojiStickerSingle())) { view.getMessageObject().forcePlayEffect = false; view.getMessageObject().messageOwner.premiumEffectWasPlayed = true; chatActivity.getMessagesStorage().updateMessageCustomParams(dialogId, view.getMessageObject().messageOwner); @@ -337,7 +354,12 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe } if (canShowHint && hintRunnable == null && show && (Bulletin.getVisibleBulletin() == null || !Bulletin.getVisibleBulletin().isShowing()) && SharedConfig.emojiInteractionsHintCount > 0 && UserConfig.getInstance(currentAccount).getClientUserId() != chatActivity.currentUser.id) { SharedConfig.updateEmojiInteractionsHintCount(SharedConfig.emojiInteractionsHintCount - 1); - TLRPC.Document document = MediaDataController.getInstance(currentAccount).getEmojiAnimatedSticker(view.getMessageObject().getStickerEmoji()); + TLRPC.Document document; + if (view.getMessageObject().isAnimatedAnimatedEmoji()) { + document = view.getMessageObject().getDocument(); + } else { + document = MediaDataController.getInstance(currentAccount).getEmojiAnimatedSticker(view.getMessageObject().getStickerEmoji()); + } StickerSetBulletinLayout layout = new StickerSetBulletinLayout(chatActivity.getParentActivity(), null, StickerSetBulletinLayout.TYPE_EMPTY, document, chatActivity.getResourceProvider()); layout.subtitleTextView.setVisibility(View.GONE); layout.titleTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("EmojiInteractionTapHint", R.string.EmojiInteractionTapHint, chatActivity.currentUser.first_name))); @@ -363,6 +385,68 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe hintRunnable = null; } + public boolean showAnimationForActionCell(ChatActionCell view, TLRPC.Document document, TLRPC.VideoSize videoSize) { + if (drawingObjects.size() > 12) { + return false; + } + if (!view.getPhotoImage().hasNotThumb()) { + return false; + } + float imageH = view.getPhotoImage().getImageHeight(); + float imageW = view.getPhotoImage().getImageWidth(); + if (imageH <= 0 || imageW <= 0) { + return false; + } + + int sameAnimationsCountMessageId = 0; + int sameAnimationsCountDocumentId = 0; + for (int i = 0; i < drawingObjects.size(); i++) { + if (drawingObjects.get(i).messageId == view.getMessageObject().getId()) { + sameAnimationsCountMessageId++; + if (drawingObjects.get(i).imageReceiver.getLottieAnimation() == null || drawingObjects.get(i).imageReceiver.getLottieAnimation().isGeneratingCache()) { + return false; + } + } + if (drawingObjects.get(i).document != null && document != null && drawingObjects.get(i).document.id == document.id) { + sameAnimationsCountDocumentId++; + } + } + if (sameAnimationsCountMessageId >= 4) { + return false; + } + + DrawingObject drawingObject = new DrawingObject(); + drawingObject.isPremiumSticker = true; + drawingObject.randomOffsetX = imageW / 4 * ((random.nextInt() % 101) / 100f); + drawingObject.randomOffsetY = imageH / 4 * ((random.nextInt() % 101) / 100f); + drawingObject.messageId = view.getMessageObject().getId(); + drawingObject.isOut = true; + drawingObject.imageReceiver.setAllowStartAnimation(true); + int w = (int) (1.5f * imageW / AndroidUtilities.density); + if (sameAnimationsCountDocumentId > 0) { + Integer lastIndex = lastAnimationIndex.get(document.id); + int currentIndex = lastIndex == null ? 0 : lastIndex; + lastAnimationIndex.put(document.id, (currentIndex + 1) % 4); + drawingObject.imageReceiver.setUniqKeyPrefix(currentIndex + "_" + drawingObject.messageId + "_"); + } + drawingObject.document = document; + drawingObject.imageReceiver.setImage(ImageLocation.getForDocument(videoSize, document), w + "_" + w, null, "tgs", set, 1); + + drawingObject.imageReceiver.setLayerNum(Integer.MAX_VALUE); + drawingObject.imageReceiver.setAutoRepeat(0); + if (drawingObject.imageReceiver.getLottieAnimation() != null) { + if (drawingObject.isPremiumSticker) { + drawingObject.imageReceiver.getLottieAnimation().setCurrentFrame(0, false, true); + } + drawingObject.imageReceiver.getLottieAnimation().start(); + } + drawingObjects.add(drawingObject); + drawingObject.imageReceiver.onAttachedToWindow(); + drawingObject.imageReceiver.setParentView(contentLayout); + contentLayout.invalidate(); + return true; + } + private boolean showAnimationForCell(ChatMessageCell view, int animation, boolean sendTap, boolean sendSeen) { if (drawingObjects.size() > 12) { return false; @@ -372,6 +456,9 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe } MessageObject messageObject = view.getMessageObject(); String emoji = messageObject.getStickerEmoji(); + if (emoji == null) { + emoji = messageObject.messageOwner.message; + } if (emoji == null) { return false; } @@ -449,12 +536,13 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe drawingObject.document = document; drawingObject.isOut = view.getMessageObject().isOutOwner(); drawingObject.imageReceiver.setAllowStartAnimation(true); + drawingObject.imageReceiver.setAllowLottieVibration(sendTap); int w; if (document != null) { w = (int) (2f * imageW / AndroidUtilities.density); Integer lastIndex = lastAnimationIndex.get(document.id); - int currentIndex = lastIndex == null ? 0 : lastIndex; - lastAnimationIndex.put(document.id, (currentIndex + 1) % 4); + int currentIndex = ((lastIndex == null ? 0 : lastIndex) + 1) % 4; + lastAnimationIndex.put(document.id, currentIndex); ImageLocation imageLocation = ImageLocation.getForDocument(document); drawingObject.imageReceiver.setUniqKeyPrefix(currentIndex + "_" + drawingObject.messageId + "_"); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FeaturedStickersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FeaturedStickersActivity.java index ddf69f8d8..81a3febf3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FeaturedStickersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FeaturedStickersActivity.java @@ -180,7 +180,7 @@ public class FeaturedStickersActivity extends BaseFragment implements Notificati if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } - MediaDataController.getInstance(currentAccount).markFaturedStickersAsRead(true); + MediaDataController.getInstance(currentAccount).markFeaturedStickersAsRead(false, true); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java index 0426b01a1..006d21684 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java @@ -794,7 +794,19 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe if (wasEmpty) { adapter.notifyItemInserted(filtersHeaderRow); } - adapter.notifyItemInserted(filtersStartRow); + int indexToInsert = 0; + for (int i = 0; i < getMessagesController().dialogFilters.size(); i++) { + if (filter.id == getMessagesController().dialogFilters.get(i).id) { + indexToInsert = i; + } + } + if (!getUserConfig().isPremium()) { + indexToInsert--; + } + if (indexToInsert < 0) { + indexToInsert = 0; + } + adapter.notifyItemInserted(filtersStartRow + indexToInsert); } else { updateRows(true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index f54be02ba..69b95ce56 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -515,7 +515,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati showAvatarProgress(false, false); - editText = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT); + editText = new EditTextEmoji(context, sizeNotifierFrameLayout, this, EditTextEmoji.STYLE_FRAGMENT, false); editText.setHint(chatType == ChatObject.CHAT_TYPE_CHAT || chatType == ChatObject.CHAT_TYPE_MEGAGROUP ? LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder) : LocaleController.getString("EnterListName", R.string.EnterListName)); if (nameToSet != null) { editText.setText(nameToSet); @@ -547,7 +547,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati }); listView.setOnItemClickListener((view, position) -> { if (view instanceof TextSettingsCell) { - if (!AndroidUtilities.isGoogleMapsInstalled(GroupCreateFinalActivity.this)) { + if (!AndroidUtilities.isMapsInstalled(GroupCreateFinalActivity.this)) { return; } LocationActivity fragment = new LocationActivity(LocationActivity.LOCATION_TYPE_GROUP); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 22b614f68..f57a045f9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -31,7 +31,6 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Shader; -import android.graphics.drawable.Drawable; import android.location.LocationManager; import android.media.AudioManager; import android.net.Uri; @@ -39,12 +38,12 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.os.StatFs; +import android.os.StrictMode; import android.os.SystemClock; import android.provider.ContactsContract; import android.provider.Settings; import android.text.TextUtils; import android.util.Base64; -import android.util.Log; import android.util.TypedValue; import android.view.ActionMode; import android.view.Gravity; @@ -100,6 +99,7 @@ import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.PushListenerController; import org.telegram.messenger.R; import org.telegram.messenger.SendMessagesHelper; import org.telegram.messenger.SharedConfig; @@ -114,9 +114,6 @@ import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBarLayout; -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.DrawerLayoutContainer; @@ -137,6 +134,7 @@ import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.Easings; import org.telegram.ui.Components.EmbedBottomSheet; +import org.telegram.ui.Components.EmojiPacksAlert; import org.telegram.ui.Components.FireworksOverlay; import org.telegram.ui.Components.GroupCallPip; import org.telegram.ui.Components.JoinGroupAlert; @@ -256,6 +254,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar private boolean isNavigationBarColorFrozen = false; private boolean navigateToPremiumBot; + private Runnable navigateToPremiumGiftCallback; private Runnable lockRunnable; @@ -266,6 +265,11 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar @Override protected void onCreate(Bundle savedInstanceState) { + if (BuildVars.DEBUG_VERSION) { + StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(StrictMode.getVmPolicy()) + .detectLeakedClosableObjects() + .build()); + } ApplicationLoader.postInitApplication(); AndroidUtilities.checkDisplaySize(this, getResources().getConfiguration()); currentAccount = UserConfig.selectedAccount; @@ -1648,6 +1652,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar String login = null; String group = null; String sticker = null; + String emoji = null; HashMap auth = null; String unsupportedUrl = null; String botUser = null; @@ -1789,6 +1794,8 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar } } else if (path.startsWith("addstickers/")) { sticker = path.replace("addstickers/", ""); + } else if (path.startsWith("addemoji/")) { + emoji = path.replace("addemoji/", ""); } else if (path.startsWith("msg/") || path.startsWith("share/")) { message = data.getQueryParameter("url"); if (message == null) { @@ -1870,7 +1877,15 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar } case "tg": { String url = data.toString(); - if (url.startsWith("tg:resolve") || url.startsWith("tg://resolve")) { + if (url.startsWith("tg:premium_offer") || url.startsWith("tg://premium_offer")) { + String finalUrl = url; + AndroidUtilities.runOnUIThread(() -> { + if (!actionBarLayout.fragmentsStack.isEmpty()) { + BaseFragment fragment = actionBarLayout.fragmentsStack.get(0); + Uri uri = Uri.parse(finalUrl); + fragment.presentFragment(new PremiumPreviewFragment(uri.getQueryParameter("ref"))); + }}); + } else if (url.startsWith("tg:resolve") || url.startsWith("tg://resolve")) { url = url.replace("tg:resolve", "tg://telegram.org").replace("tg://resolve", "tg://telegram.org"); data = Uri.parse(url); username = data.getQueryParameter("domain"); @@ -1918,7 +1933,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar } } } - if (url.startsWith("tg:invoice") || url.startsWith("tg://invoice")) { + else if (url.startsWith("tg:invoice") || url.startsWith("tg://invoice")) { url = url.replace("tg:invoice", "tg://invoice"); data = Uri.parse(url); inputInvoiceSlug = data.getQueryParameter("slug"); @@ -2031,6 +2046,10 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar url = url.replace("tg:addstickers", "tg://telegram.org").replace("tg://addstickers", "tg://telegram.org"); data = Uri.parse(url); sticker = data.getQueryParameter("set"); + } else if (url.startsWith("tg:addemoji") || url.startsWith("tg://addemoji")) { + url = url.replace("tg:addemoji", "tg://telegram.org").replace("tg://addemoji", "tg://telegram.org"); + data = Uri.parse(url); + emoji = data.getQueryParameter("set"); } else if (url.startsWith("tg:msg") || url.startsWith("tg://msg") || url.startsWith("tg://share") || url.startsWith("tg:share")) { url = url.replace("tg:msg", "tg://telegram.org").replace("tg://msg", "tg://telegram.org").replace("tg://share", "tg://telegram.org").replace("tg:share", "tg://telegram.org"); data = Uri.parse(url); @@ -2209,7 +2228,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar req.hash = phoneHash; req.settings = new TLRPC.TL_codeSettings(); req.settings.allow_flashcall = false; - req.settings.allow_app_hash = ApplicationLoader.hasPlayServices; + req.settings.allow_app_hash = PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices(); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); if (req.settings.allow_app_hash) { preferences.edit().putString("sms_hash", BuildVars.SMS_HASH).apply(); @@ -2229,11 +2248,11 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar AlertsCreator.processError(currentAccount, error, getActionBarLayout().getLastFragment(), req); } }), ConnectionsManager.RequestFlagFailOnServerErrors); - } else if (username != null || group != null || sticker != 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 || message != null || game != null || voicechat != null || auth != null || unsupportedUrl != null || lang != null || code != null || wallPaper != null || inputInvoiceSlug != null || channelId != null || theme != null || login != null) { if (message != null && message.startsWith("@")) { message = " " + message; } - runLinkRequest(intentAccount[0], username, group, sticker, botUser, botChat, botChannel, botChatAdminParams, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 0, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); + runLinkRequest(intentAccount[0], username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 0, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); } else { try (Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null)) { if (cursor != null) { @@ -2268,9 +2287,10 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar } else if (intent.getAction().equals("new_dialog")) { open_new_dialog = 1; } else if (intent.getAction().startsWith("com.tmessages.openchat")) { - - long chatId = intent.getLongExtra("chatId", intent.getIntExtra("chatId", 0)); - long userId = intent.getLongExtra("userId", intent.getIntExtra("userId", 0)); +// Integer chatIdInt = intent.getIntExtra("chatId", 0); + long chatId = intent.getLongExtra("chatId", 0); +// Integer userIdInt = intent.getIntExtra("userId", 0); + long userId = intent.getLongExtra("userId", 0); int encId = intent.getIntExtra("encId", 0); int widgetId = intent.getIntExtra("appWidgetId", 0); if (widgetId != 0) { @@ -2908,6 +2928,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar final String username, final String group, final String sticker, + final String emoji, final String botUser, final String botChat, final String botChannel, @@ -2939,7 +2960,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar if (account != intentAccount) { switchToAccount(account, true); } - runLinkRequest(account, username, group, sticker, botUser, botChat, botChannel, botChatAdminParams, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); + runLinkRequest(account, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); }).show(); return; } else if (code != null) { @@ -2974,12 +2995,26 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar if (error != null) { BulletinFactory.of(mainFragmentsStack.get(mainFragmentsStack.size() - 1)).createErrorBulletin(LocaleController.getString(R.string.PaymentInvoiceLinkInvalid)).show(); } else if (!LaunchActivity.this.isFinishing()) { + PaymentFormActivity paymentFormActivity = null; if (response instanceof TLRPC.TL_payments_paymentForm) { TLRPC.TL_payments_paymentForm form = (TLRPC.TL_payments_paymentForm) response; MessagesController.getInstance(intentAccount).putUsers(form.users, false); - presentFragment(new PaymentFormActivity(form, inputInvoiceSlug, getActionBarLayout().getLastFragment())); + paymentFormActivity = new PaymentFormActivity(form, inputInvoiceSlug, getActionBarLayout().getLastFragment()); } else if (response instanceof TLRPC.TL_payments_paymentReceipt) { - presentFragment(new PaymentFormActivity((TLRPC.TL_payments_paymentReceipt) response)); + paymentFormActivity = new PaymentFormActivity((TLRPC.TL_payments_paymentReceipt) response); + } + + if (paymentFormActivity != null) { + if (navigateToPremiumGiftCallback != null) { + Runnable callback = navigateToPremiumGiftCallback; + navigateToPremiumGiftCallback = null; + paymentFormActivity.setPaymentFormCallback(status -> { + if (status == PaymentFormActivity.InvoiceStatus.PAID) { + callback.run(); + } + }); + } + presentFragment(paymentFormActivity); } } @@ -3071,7 +3106,12 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar if (dialogsActivity != null) { presentFragment(dialogsActivity); } else if (lastFragment instanceof ChatActivity) { - ((ChatActivity) lastFragment).openAttachBotLayout(user.id, setAsAttachBot); + ChatActivity chatActivity = (ChatActivity) lastFragment; + if (!MediaDataController.canShowAttachMenuBot(attachMenuBot, chatActivity.getCurrentUser() != null ? chatActivity.getCurrentUser() : chatActivity.getCurrentChat())) { + BulletinFactory.of(lastFragment).createErrorBulletin(LocaleController.getString(R.string.BotAlreadyAddedToAttachMenu)).show(); + return; + } + chatActivity.openAttachBotLayout(user.id, setAsAttachBot); } else { BulletinFactory.of(lastFragment).createErrorBulletin(LocaleController.getString(R.string.BotAlreadyAddedToAttachMenu)).show(); } @@ -3581,7 +3621,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar } else if (sticker != null) { if (!mainFragmentsStack.isEmpty()) { TLRPC.TL_inputStickerSetShortName stickerset = new TLRPC.TL_inputStickerSetShortName(); - stickerset.short_name = sticker; + stickerset.short_name = sticker != null ? sticker : emoji; BaseFragment fragment = mainFragmentsStack.get(mainFragmentsStack.size() - 1); StickersAlert alert; if (fragment instanceof ChatActivity) { @@ -3591,6 +3631,25 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar } else { alert = new StickersAlert(LaunchActivity.this, fragment, stickerset, null, null); } + alert.probablyEmojis = emoji != null; + fragment.showDialog(alert); + } + return; + } else if (emoji != null) { + if (!mainFragmentsStack.isEmpty()) { + TLRPC.TL_inputStickerSetShortName stickerset = new TLRPC.TL_inputStickerSetShortName(); + stickerset.short_name = sticker != null ? sticker : emoji; + ArrayList sets = new ArrayList<>(1); + sets.add(stickerset); + BaseFragment fragment = mainFragmentsStack.get(mainFragmentsStack.size() - 1); + EmojiPacksAlert alert; + if (fragment instanceof ChatActivity) { + ChatActivity chatActivity = (ChatActivity) fragment; + alert = new EmojiPacksAlert(fragment, LaunchActivity.this, chatActivity.getResourceProvider(), sets); + alert.setCalcMandatoryInsets(chatActivity.isKeyboardVisible()); + } else { + alert = new EmojiPacksAlert(fragment, LaunchActivity.this, null, sets); + } fragment.showDialog(alert); } return; @@ -4264,6 +4323,10 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar navigateToPremiumBot = val; } + public void setNavigateToPremiumGiftCallback(Runnable val) { + navigateToPremiumGiftCallback = val; + } + @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -4890,7 +4953,7 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar return; } BaseFragment lastFragment = mainFragmentsStack.get(mainFragmentsStack.size() - 1); - if (!AndroidUtilities.isGoogleMapsInstalled(lastFragment)) { + if (!AndroidUtilities.isMapsInstalled(lastFragment)) { return; } LocationActivity fragment = new LocationActivity(0); @@ -5086,7 +5149,8 @@ public class LaunchActivity extends BasePermissionsActivity implements ActionBar Theme.ThemeInfo theme = (Theme.ThemeInfo) args[0]; boolean nightTheme = (Boolean) args[1]; int accentId = (Integer) args[3]; - actionBarLayout.animateThemedValues(theme, accentId, nightTheme, instant); + Runnable calcInBackgroundEnd = args.length > 7 ? (Runnable) args[7] : null; + actionBarLayout.animateThemedValues(theme, accentId, nightTheme, instant, calcInBackgroundEnd); if (AndroidUtilities.isTablet()) { layersActionBarLayout.animateThemedValues(theme, accentId, nightTheme, instant); rightActionBarLayout.animateThemedValues(theme, accentId, nightTheme, instant); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index d7669c35e..f115db74d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -59,30 +59,12 @@ import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.gms.maps.CameraUpdate; -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.MapView; -import com.google.android.gms.maps.MapsInitializer; -import com.google.android.gms.maps.Projection; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.CameraPosition; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.CircleOptions; -import com.google.android.gms.maps.model.Dash; -import com.google.android.gms.maps.model.Gap; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.MapStyleOptions; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.PatternItem; - import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ChatObject; import org.telegram.messenger.DialogObject; import org.telegram.messenger.FileLog; +import org.telegram.messenger.IMapsProvider; import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocationController; import org.telegram.messenger.MessageObject; @@ -149,13 +131,13 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private boolean proximityAnimationInProgress; - private GoogleMap googleMap; - private CameraUpdate moveToBounds; - private MapView mapView; - private CameraUpdate forceUpdate; + private IMapsProvider.IMap map; + private IMapsProvider.ICameraUpdate moveToBounds; + private IMapsProvider.IMapView mapView; + private IMapsProvider.ICameraUpdate forceUpdate; private float yOffset; - private Circle proximityCircle; + private IMapsProvider.ICircle proximityCircle; private double previousRadius; private boolean scrolling; @@ -192,7 +174,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private AnimatorSet animatorSet; - private Marker lastPressedMarker; + private IMapsProvider.IMarker lastPressedMarker; private VenueLocation lastPressedVenue; private FrameLayout lastPressedMarkerView; @@ -218,7 +200,6 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private boolean userLocationMoved; private boolean searchedForCustomLocations; private boolean firstWas; - private CircleOptions circleOptions; private LocationActivityDelegate delegate; private int locationType; @@ -241,7 +222,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter public static class VenueLocation { public int num; - public Marker marker; + public IMapsProvider.IMarker marker; public TLRPC.TL_messageMediaVenue venue; } @@ -250,8 +231,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter public TLRPC.Message object; public TLRPC.User user; public TLRPC.Chat chat; - public Marker marker; - public Marker directionMarker; + public IMapsProvider.IMarker marker; + public IMapsProvider.IMarker directionMarker; public boolean hasRotation; } @@ -287,13 +268,13 @@ public class LocationActivity extends BaseFragment implements NotificationCenter public class MapOverlayView extends FrameLayout { - private HashMap views = new HashMap<>(); + private HashMap views = new HashMap<>(); public MapOverlayView(Context context) { super(context); } - public void addInfoView(Marker marker) { + public void addInfoView(IMapsProvider.IMarker marker) { VenueLocation location = (VenueLocation) marker.getTag(); if (location == null || lastPressedVenue == location) { return; @@ -397,10 +378,10 @@ public class LocationActivity extends BaseFragment implements NotificationCenter views.put(marker, frameLayout); - googleMap.animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition()), 300, null); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(marker.getPosition()), 300, null); } - public void removeInfoView(Marker marker) { + public void removeInfoView(IMapsProvider.IMarker marker) { View view = views.get(marker); if (view != null) { removeView(view); @@ -409,12 +390,12 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } public void updatePositions() { - if (googleMap == null) { + if (map == null) { return; } - Projection projection = googleMap.getProjection(); - for (HashMap.Entry entry : views.entrySet()) { - Marker marker = entry.getKey(); + IMapsProvider.IProjection projection = map.getProjection(); + for (HashMap.Entry entry : views.entrySet()) { + IMapsProvider.IMarker marker = entry.getKey(); View view = entry.getValue(); Point point = projection.toScreenLocation(marker.getPosition()); view.setTranslationX(point.x - view.getMeasuredWidth() / 2); @@ -457,8 +438,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter getNotificationCenter().removeObserver(this, NotificationCenter.didReceiveNewMessages); getNotificationCenter().removeObserver(this, NotificationCenter.replaceMessagesObjects); try { - if (googleMap != null) { - googleMap.setMyLocationEnabled(false); + if (map != null) { + map.setMyLocationEnabled(false); } } catch (Exception e) { FileLog.e(e); @@ -763,15 +744,15 @@ public class LocationActivity extends BaseFragment implements NotificationCenter mapViewClip.addView(mapTypeButton, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 40 : 44, Build.VERSION.SDK_INT >= 21 ? 40 : 44, Gravity.RIGHT | Gravity.TOP, 0, 12, 12, 0)); mapTypeButton.setOnClickListener(v -> mapTypeButton.toggleSubMenu()); mapTypeButton.setDelegate(id -> { - if (googleMap == null) { + if (map == null) { return; } if (id == map_list_menu_map) { - googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); + map.setMapType(IMapsProvider.MAP_TYPE_NORMAL); } else if (id == map_list_menu_satellite) { - googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); + map.setMapType(IMapsProvider.MAP_TYPE_SATELLITE); } else if (id == map_list_menu_hybrid) { - googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); + map.setMapType(IMapsProvider.MAP_TYPE_HYBRID); } }); @@ -819,17 +800,17 @@ public class LocationActivity extends BaseFragment implements NotificationCenter return; } if (messageObject != null || chatLocation != null) { - if (myLocation != null && googleMap != null) { - googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()), googleMap.getMaxZoomLevel() - 4)); + if (myLocation != null && map != null) { + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude()), map.getMaxZoomLevel() - 4)); } } else { - if (myLocation != null && googleMap != null) { + if (myLocation != null && map != null) { locationButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_location_actionActiveIcon), PorterDuff.Mode.MULTIPLY)); locationButton.setTag(Theme.key_location_actionActiveIcon); adapter.setCustomLocation(null); userLocationMoved = false; showSearchPlacesButton(false); - googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()))); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude()))); if (searchedForCustomLocations) { if (myLocation != null) { adapter.searchPlacesWithQuery(null, myLocation, true, true); @@ -869,7 +850,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter proximityButton.setContentDescription(LocaleController.getString("AccDescrLocationNotify", R.string.AccDescrLocationNotify)); mapViewClip.addView(proximityButton, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 40 : 44, Build.VERSION.SDK_INT >= 21 ? 40 : 44, Gravity.RIGHT | Gravity.TOP, 0, 12 + 50, 12, 0)); proximityButton.setOnClickListener(v -> { - if (getParentActivity() == null || myLocation == null || !checkGpsEnabled() || googleMap == null) { + if (getParentActivity() == null || myLocation == null || !checkGpsEnabled() || map == null) { return; } if (hintView != null) { @@ -1041,12 +1022,12 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } } else if (locationType == LOCATION_TYPE_GROUP_VIEW) { - if (googleMap != null) { - googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(chatLocation.geo_point.lat, chatLocation.geo_point._long), googleMap.getMaxZoomLevel() - 4)); + if (map != null) { + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(new IMapsProvider.LatLng(chatLocation.geo_point.lat, chatLocation.geo_point._long), map.getMaxZoomLevel() - 4)); } } else if (position == 1 && messageObject != null && (!messageObject.isLiveLocation() || locationType == LOCATION_TYPE_LIVE_VIEW)) { - if (googleMap != null) { - googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(messageObject.messageOwner.media.geo.lat, messageObject.messageOwner.media.geo._long), googleMap.getMaxZoomLevel() - 4)); + if (map != null) { + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(new IMapsProvider.LatLng(messageObject.messageOwner.media.geo.lat, messageObject.messageOwner.media.geo._long), map.getMaxZoomLevel() - 4)); } } else if (position == 1 && locationType != 2) { if (delegate != null && userLocation != null) { @@ -1089,7 +1070,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } else if (object instanceof LiveLocation) { LiveLocation liveLocation = (LiveLocation) object; - googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(liveLocation.marker.getPosition(), googleMap.getMaxZoomLevel() - 4)); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(liveLocation.marker.getPosition(), map.getMaxZoomLevel() - 4)); } } }); @@ -1098,79 +1079,64 @@ public class LocationActivity extends BaseFragment implements NotificationCenter frameLayout.addView(mapViewClip, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP)); - mapView = new MapView(context) { - - @Override - public boolean onTouchEvent(MotionEvent event) { - return super.onTouchEvent(event); + mapView = ApplicationLoader.getMapsProvider().onCreateMapView(context); + mapView.setOnDispatchTouchEventInterceptor((ev, origMethod) -> { + MotionEvent eventToRecycle = null; + if (yOffset != 0) { + ev = eventToRecycle = MotionEvent.obtain(ev); + eventToRecycle.offsetLocation(0, -yOffset / 2); } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - MotionEvent eventToRecycle = null; - if (yOffset != 0) { - ev = eventToRecycle = MotionEvent.obtain(ev); - eventToRecycle.offsetLocation(0, -yOffset / 2); - } - boolean result = super.dispatchTouchEvent(ev); - if (eventToRecycle != null) { - eventToRecycle.recycle(); - } - return result; + boolean result = origMethod.call(ev); + if (eventToRecycle != null) { + eventToRecycle.recycle(); } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (messageObject == null && chatLocation == null) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - if (animatorSet != null) { - animatorSet.cancel(); - } - animatorSet = new AnimatorSet(); - animatorSet.setDuration(200); - animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop - AndroidUtilities.dp(10))); - animatorSet.start(); - } else if (ev.getAction() == MotionEvent.ACTION_UP) { - if (animatorSet != null) { - animatorSet.cancel(); - } - yOffset = 0; - animatorSet = new AnimatorSet(); - animatorSet.setDuration(200); - animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop)); - animatorSet.start(); - adapter.fetchLocationAddress(); + return result; + }); + mapView.setOnInterceptTouchEventInterceptor((ev, origMethod) -> { + if (messageObject == null && chatLocation == null) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (animatorSet != null) { + animatorSet.cancel(); } - if (ev.getAction() == MotionEvent.ACTION_MOVE) { - if (!userLocationMoved) { - locationButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_location_actionIcon), PorterDuff.Mode.MULTIPLY)); - locationButton.setTag(Theme.key_location_actionIcon); - userLocationMoved = true; - } - if (googleMap != null) { - if (userLocation != null) { - userLocation.setLatitude(googleMap.getCameraPosition().target.latitude); - userLocation.setLongitude(googleMap.getCameraPosition().target.longitude); - } - } - adapter.setCustomLocation(userLocation); + animatorSet = new AnimatorSet(); + animatorSet.setDuration(200); + animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop - AndroidUtilities.dp(10))); + animatorSet.start(); + } else if (ev.getAction() == MotionEvent.ACTION_UP) { + if (animatorSet != null) { + animatorSet.cancel(); } + yOffset = 0; + animatorSet = new AnimatorSet(); + animatorSet.setDuration(200); + animatorSet.playTogether(ObjectAnimator.ofFloat(markerImageView, View.TRANSLATION_Y, markerTop)); + animatorSet.start(); + adapter.fetchLocationAddress(); } - return super.onInterceptTouchEvent(ev); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - AndroidUtilities.runOnUIThread(() -> { - if (moveToBounds != null) { - googleMap.moveCamera(moveToBounds); - moveToBounds = null; + if (ev.getAction() == MotionEvent.ACTION_MOVE) { + if (!userLocationMoved) { + locationButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_location_actionIcon), PorterDuff.Mode.MULTIPLY)); + locationButton.setTag(Theme.key_location_actionIcon); + userLocationMoved = true; } - }); + if (map != null) { + if (userLocation != null) { + userLocation.setLatitude(map.getCameraPosition().target.latitude); + userLocation.setLongitude(map.getCameraPosition().target.longitude); + } + } + adapter.setCustomLocation(userLocation); + } } - }; - final MapView map = mapView; + return origMethod.call(ev); + }); + mapView.setOnLayoutListener(()-> AndroidUtilities.runOnUIThread(() -> { + if (moveToBounds != null) { + map.moveCamera(moveToBounds); + moveToBounds = null; + } + })); + IMapsProvider.IMapView map = mapView; new Thread(() -> { try { map.onCreate(null); @@ -1181,15 +1147,15 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (mapView != null && getParentActivity() != null) { try { map.onCreate(null); - MapsInitializer.initialize(ApplicationLoader.applicationContext); + ApplicationLoader.getMapsProvider().initializeMaps(ApplicationLoader.applicationContext); mapView.getMapAsync(map1 -> { - googleMap = map1; + this.map = map1; if (isActiveThemeDark()) { currentMapStyleDark = true; - MapStyleOptions style = MapStyleOptions.loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); - googleMap.setMapStyle(style); + IMapsProvider.IMapStyleOptions style = ApplicationLoader.getMapsProvider().loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); + this.map.setMapStyle(style); } - googleMap.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); + this.map.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); onMapInit(); }); mapsInitialized = true; @@ -1483,8 +1449,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter getLocationController().setProximityLocation(dialogId, radius, true); return true; }, () -> { - if (googleMap != null) { - googleMap.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); + if (map != null) { + map.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); } if (!proximitySheet.getRadiusSet()) { if (previousRadius > 0) { @@ -1583,14 +1549,14 @@ public class LocationActivity extends BaseFragment implements NotificationCenter for (int a = 0, N = places.size(); a < N; a++) { TLRPC.TL_messageMediaVenue venue = places.get(a); try { - MarkerOptions options = new MarkerOptions().position(new LatLng(venue.geo.lat, venue.geo._long)); - options.icon(BitmapDescriptorFactory.fromBitmap(createPlaceBitmap(a))); + IMapsProvider.IMarkerOptions options = ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(new IMapsProvider.LatLng(venue.geo.lat, venue.geo._long)); + options.icon(createPlaceBitmap(a)); options.anchor(0.5f, 0.5f); options.title(venue.title); options.snippet(venue.address); VenueLocation venueLocation = new VenueLocation(); venueLocation.num = a; - venueLocation.marker = googleMap.addMarker(options); + venueLocation.marker = map.addMarker(options); venueLocation.venue = venue; venueLocation.marker.setTag(venueLocation); placeMarkers.add(venueLocation); @@ -1602,7 +1568,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private LiveLocation addUserMarker(TLRPC.Message message) { LiveLocation liveLocation; - LatLng latLng = new LatLng(message.media.geo.lat, message.media.geo._long); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(message.media.geo.lat, message.media.geo._long); if ((liveLocation = markersMap.get(MessageObject.getFromChatId(message))) == null) { liveLocation = new LiveLocation(); liveLocation.object = message; @@ -1620,25 +1586,25 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } try { - MarkerOptions options = new MarkerOptions().position(latLng); + IMapsProvider.IMarkerOptions options = ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(latLng); Bitmap bitmap = createUserBitmap(liveLocation); if (bitmap != null) { - options.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); + options.icon(bitmap); options.anchor(0.5f, 0.907f); - liveLocation.marker = googleMap.addMarker(options); + liveLocation.marker = map.addMarker(options); if (!UserObject.isUserSelf(liveLocation.user)) { - MarkerOptions dirOptions = new MarkerOptions().position(latLng).flat(true); + IMapsProvider.IMarkerOptions dirOptions = ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(latLng).flat(true); dirOptions.anchor(0.5f, 0.5f); - liveLocation.directionMarker = googleMap.addMarker(dirOptions); + liveLocation.directionMarker = map.addMarker(dirOptions); if (message.media.heading != 0) { liveLocation.directionMarker.setRotation(message.media.heading); - liveLocation.directionMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin_cone2)); + liveLocation.directionMarker.setIcon(R.drawable.map_pin_cone2); liveLocation.hasRotation = true; } else { liveLocation.directionMarker.setRotation(0); - liveLocation.directionMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin_circle)); + liveLocation.directionMarker.setIcon(R.drawable.map_pin_circle); liveLocation.hasRotation = false; } } @@ -1647,7 +1613,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter markersMap.put(liveLocation.id, liveLocation); LocationController.SharingLocationInfo myInfo = getLocationController().getSharingLocationInfo(dialogId); if (liveLocation.id == getUserConfig().getClientUserId() && myInfo != null && liveLocation.object.id == myInfo.mid && myLocation != null) { - LatLng latLng1 = new LatLng(myLocation.getLatitude(), myLocation.getLongitude()); + IMapsProvider.LatLng latLng1 = new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude()); liveLocation.marker.setPosition(latLng1); } } @@ -1665,7 +1631,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } private LiveLocation addUserMarker(TLRPC.TL_channelLocation location) { - LatLng latLng = new LatLng(location.geo_point.lat, location.geo_point._long); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(location.geo_point.lat, location.geo_point._long); LiveLocation liveLocation = new LiveLocation(); if (DialogObject.isUserDialog(dialogId)) { liveLocation.user = getMessagesController().getUser(dialogId); @@ -1675,18 +1641,18 @@ public class LocationActivity extends BaseFragment implements NotificationCenter liveLocation.id = dialogId; try { - MarkerOptions options = new MarkerOptions().position(latLng); + IMapsProvider.IMarkerOptions options = ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(latLng); Bitmap bitmap = createUserBitmap(liveLocation); if (bitmap != null) { - options.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); + options.icon(bitmap); options.anchor(0.5f, 0.907f); - liveLocation.marker = googleMap.addMarker(options); + liveLocation.marker = map.addMarker(options); if (!UserObject.isUserSelf(liveLocation.user)) { - MarkerOptions dirOptions = new MarkerOptions().position(latLng).flat(true); - dirOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin_circle)); + IMapsProvider.IMarkerOptions dirOptions = ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(latLng).flat(true); + dirOptions.icon(R.drawable.map_pin_circle); dirOptions.anchor(0.5f, 0.5f); - liveLocation.directionMarker = googleMap.addMarker(dirOptions); + liveLocation.directionMarker = map.addMarker(dirOptions); } markers.add(liveLocation); @@ -1700,36 +1666,36 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } private void onMapInit() { - if (googleMap == null) { + if (map == null) { return; } if (chatLocation != null) { LiveLocation liveLocation = addUserMarker(chatLocation); - googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(liveLocation.marker.getPosition(), googleMap.getMaxZoomLevel() - 4)); + map.moveCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(liveLocation.marker.getPosition(), map.getMaxZoomLevel() - 4)); } else if (messageObject != null) { if (messageObject.isLiveLocation()) { LiveLocation liveLocation = addUserMarker(messageObject.messageOwner); if (!getRecentLocations()) { - googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(liveLocation.marker.getPosition(), googleMap.getMaxZoomLevel() - 4)); + map.moveCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(liveLocation.marker.getPosition(), map.getMaxZoomLevel() - 4)); } } else { - LatLng latLng = new LatLng(userLocation.getLatitude(), userLocation.getLongitude()); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(userLocation.getLatitude(), userLocation.getLongitude()); try { - googleMap.addMarker(new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin2))); + map.addMarker(ApplicationLoader.getMapsProvider().onCreateMarkerOptions().position(latLng).icon(R.drawable.map_pin2)); } catch (Exception e) { FileLog.e(e); } - CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 4); - googleMap.moveCamera(position); + IMapsProvider.ICameraUpdate position = ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(latLng, map.getMaxZoomLevel() - 4); + map.moveCamera(position); firstFocus = false; getRecentLocations(); } } else { userLocation = new Location("network"); if (initialLocation != null) { - LatLng latLng = new LatLng(initialLocation.geo_point.lat, initialLocation.geo_point._long); - googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 4)); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(initialLocation.geo_point.lat, initialLocation.geo_point._long); + map.moveCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(latLng, map.getMaxZoomLevel() - 4)); userLocation.setLatitude(initialLocation.geo_point.lat); userLocation.setLongitude(initialLocation.geo_point._long); adapter.setCustomLocation(userLocation); @@ -1740,15 +1706,15 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } try { - googleMap.setMyLocationEnabled(true); + map.setMyLocationEnabled(true); } catch (Exception e) { FileLog.e(e, false); } - googleMap.getUiSettings().setMyLocationButtonEnabled(false); - googleMap.getUiSettings().setZoomControlsEnabled(false); - googleMap.getUiSettings().setCompassEnabled(false); - googleMap.setOnCameraMoveStartedListener(reason -> { - if (reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE) { + map.getUiSettings().setMyLocationButtonEnabled(false); + map.getUiSettings().setZoomControlsEnabled(false); + map.getUiSettings().setCompassEnabled(false); + map.setOnCameraMoveStartedListener(reason -> { + if (reason == IMapsProvider.OnCameraMoveStartedListener.REASON_GESTURE) { showSearchPlacesButton(true); removeInfoView(); @@ -1760,8 +1726,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter int min = locationType == LOCATION_TYPE_SEND ? 0 : AndroidUtilities.dp(66); int top = view.getTop(); if (top < -min) { - CameraPosition cameraPosition = googleMap.getCameraPosition(); - forceUpdate = CameraUpdateFactory.newLatLngZoom(cameraPosition.target, cameraPosition.zoom); + IMapsProvider.CameraPosition cameraPosition = map.getCameraPosition(); + forceUpdate = ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(cameraPosition.target, cameraPosition.zoom); listView.smoothScrollBy(0, top + min); } } @@ -1769,12 +1735,12 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } }); - googleMap.setOnMyLocationChangeListener(location -> { + map.setOnMyLocationChangeListener(location -> { positionMarker(location); - getLocationController().setGoogleMapLocation(location, isFirstLocation); + getLocationController().setMapLocation(location, isFirstLocation); isFirstLocation = false; }); - googleMap.setOnMarkerClickListener(marker -> { + map.setOnMarkerClickListener(marker -> { if (!(marker.getTag() instanceof VenueLocation)) { return true; } @@ -1787,7 +1753,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter overlayView.addInfoView(marker); return true; }); - googleMap.setOnCameraMoveListener(() -> { + map.setOnCameraMoveListener(() -> { if (overlayView != null) { overlayView.updatePositions(); } @@ -1838,13 +1804,13 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } private void createCircle(int meters) { - if (googleMap == null) { + if (map == null) { return; } - List PATTERN_POLYGON_ALPHA = Arrays.asList(new Gap(20), new Dash(20)); + List PATTERN_POLYGON_ALPHA = Arrays.asList(new IMapsProvider.PatternItem.Gap(20), new IMapsProvider.PatternItem.Dash(20)); - CircleOptions circleOptions = new CircleOptions(); - circleOptions.center(new LatLng(myLocation.getLatitude(), myLocation.getLongitude())); + IMapsProvider.ICircleOptions circleOptions = ApplicationLoader.getMapsProvider().onCreateCircleOptions(); + circleOptions.center(new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude())); circleOptions.radius(meters); if (isActiveThemeDark()) { circleOptions.strokeColor(0x9666A3D7); @@ -1855,7 +1821,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } circleOptions.strokePattern(PATTERN_POLYGON_ALPHA); circleOptions.strokeWidth(2); - proximityCircle = googleMap.addCircle(circleOptions); + proximityCircle = map.addCircle(circleOptions); } private void removeInfoView() { @@ -1899,15 +1865,15 @@ public class LocationActivity extends BaseFragment implements NotificationCenter public void onTransitionAnimationEnd(boolean isOpen, boolean backward) { if (isOpen && !backward) { try { - if (mapView.getParent() instanceof ViewGroup) { - ViewGroup viewGroup = (ViewGroup) mapView.getParent(); - viewGroup.removeView(mapView); + if (mapView.getView().getParent() instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) mapView.getView().getParent(); + viewGroup.removeView(mapView.getView()); } } catch (Exception ignore) { } if (mapViewClip != null) { - mapViewClip.addView(mapView, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, overScrollHeight + AndroidUtilities.dp(10), Gravity.TOP | Gravity.LEFT)); + mapViewClip.addView(mapView.getView(), 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, overScrollHeight + AndroidUtilities.dp(10), Gravity.TOP | Gravity.LEFT)); if (overlayView != null) { try { if (overlayView.getParent() instanceof ViewGroup) { @@ -1922,7 +1888,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter updateClipView(false); maybeShowProximityHint(); } else if (fragmentView != null) { - ((FrameLayout) fragmentView).addView(mapView, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); + ((FrameLayout) fragmentView).addView(mapView.getView(), 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); } } } @@ -1974,16 +1940,16 @@ public class LocationActivity extends BaseFragment implements NotificationCenter FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mapViewClip.getLayoutParams(); if (layoutParams != null) { if (height <= 0) { - if (mapView.getVisibility() == View.VISIBLE) { - mapView.setVisibility(View.INVISIBLE); + if (mapView.getView().getVisibility() == View.VISIBLE) { + mapView.getView().setVisibility(View.INVISIBLE); mapViewClip.setVisibility(View.INVISIBLE); if (overlayView != null) { overlayView.setVisibility(View.INVISIBLE); } } } else { - if (mapView.getVisibility() == View.INVISIBLE) { - mapView.setVisibility(View.VISIBLE); + if (mapView.getView().getVisibility() == View.INVISIBLE) { + mapView.getView().setVisibility(View.VISIBLE); mapViewClip.setVisibility(View.VISIBLE); if (overlayView != null) { overlayView.setVisibility(View.VISIBLE); @@ -1992,7 +1958,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } mapViewClip.setTranslationY(Math.min(0, top)); - mapView.setTranslationY(Math.max(0, -top / 2)); + mapView.getView().setTranslationY(Math.max(0, -top / 2)); if (overlayView != null) { overlayView.setTranslationY(Math.max(0, -top / 2)); } @@ -2009,13 +1975,13 @@ public class LocationActivity extends BaseFragment implements NotificationCenter markerImageView.setTranslationY(markerTop = -top - AndroidUtilities.dp(markerImageView.getTag() == null ? 48 : 69) + height / 2); } if (!fromLayout) { - layoutParams = (FrameLayout.LayoutParams) mapView.getLayoutParams(); + layoutParams = (FrameLayout.LayoutParams) mapView.getView().getLayoutParams(); if (layoutParams != null && layoutParams.height != overScrollHeight + AndroidUtilities.dp(10)) { layoutParams.height = overScrollHeight + AndroidUtilities.dp(10); - if (googleMap != null) { - googleMap.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); + if (map != null) { + map.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); } - mapView.setLayoutParams(layoutParams); + mapView.getView().setLayoutParams(layoutParams); } if (overlayView != null) { layoutParams = (FrameLayout.LayoutParams) overlayView.getLayoutParams(); @@ -2057,13 +2023,13 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } adapter.setOverScrollHeight(overScrollHeight); - layoutParams = (FrameLayout.LayoutParams) mapView.getLayoutParams(); + layoutParams = (FrameLayout.LayoutParams) mapView.getView().getLayoutParams(); if (layoutParams != null) { layoutParams.height = overScrollHeight + AndroidUtilities.dp(10); - if (googleMap != null) { - googleMap.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); + if (map != null) { + map.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), AndroidUtilities.dp(10)); } - mapView.setLayoutParams(layoutParams); + mapView.getView().setLayoutParams(layoutParams); } if (overlayView != null) { layoutParams = (FrameLayout.LayoutParams) overlayView.getLayoutParams(); @@ -2095,6 +2061,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } + @SuppressLint("MissingPermission") private Location getLastLocation() { LocationManager lm = (LocationManager) ApplicationLoader.applicationContext.getSystemService(Context.LOCATION_SERVICE); List providers = lm.getProviders(true); @@ -2116,14 +2083,14 @@ public class LocationActivity extends BaseFragment implements NotificationCenter LiveLocation liveLocation = markersMap.get(getUserConfig().getClientUserId()); LocationController.SharingLocationInfo myInfo = getLocationController().getSharingLocationInfo(dialogId); if (liveLocation != null && myInfo != null && liveLocation.object.id == myInfo.mid) { - LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(location.getLatitude(), location.getLongitude()); liveLocation.marker.setPosition(latLng); if (liveLocation.directionMarker != null) { liveLocation.directionMarker.setPosition(latLng); } } - if (messageObject == null && chatLocation == null && googleMap != null) { - LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + if (messageObject == null && chatLocation == null && map != null) { + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(location.getLatitude(), location.getLongitude()); if (adapter != null) { if (!searchedForCustomLocations && locationType != LOCATION_TYPE_GROUP) { adapter.searchPlacesWithQuery(null, myLocation, true); @@ -2133,12 +2100,12 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (!userLocationMoved) { userLocation = new Location(location); if (firstWas) { - CameraUpdate position = CameraUpdateFactory.newLatLng(latLng); - googleMap.animateCamera(position); + IMapsProvider.ICameraUpdate position = ApplicationLoader.getMapsProvider().newCameraUpdateLatLng(latLng); + map.animateCamera(position); } else { firstWas = true; - CameraUpdate position = CameraUpdateFactory.newLatLngZoom(latLng, googleMap.getMaxZoomLevel() - 4); - googleMap.moveCamera(position); + IMapsProvider.ICameraUpdate position = ApplicationLoader.getMapsProvider().newCameraUpdateLatLngZoom(latLng, map.getMaxZoomLevel() - 4); + map.moveCamera(position); } } } else { @@ -2148,7 +2115,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter proximitySheet.updateText(true, true); } if (proximityCircle != null) { - proximityCircle.setCenter(new LatLng(myLocation.getLatitude(), myLocation.getLongitude())); + proximityCircle.setCenter(new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude())); } } @@ -2172,10 +2139,10 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private static final double EARTHRADIUS = 6366198; - private static LatLng move(LatLng startLL, double toNorth, double toEast) { + private static IMapsProvider.LatLng move(IMapsProvider.LatLng startLL, double toNorth, double toEast) { double lonDiff = meterToLongitude(toEast, startLL.latitude); double latDiff = meterToLatitude(toNorth); - return new LatLng(startLL.latitude + latDiff, startLL.longitude + lonDiff); + return new IMapsProvider.LatLng(startLL.latitude + latDiff, startLL.longitude + lonDiff); } private static double meterToLongitude(double meterToEast, double latitude) { @@ -2192,16 +2159,16 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } private void fetchRecentLocations(ArrayList messages) { - LatLngBounds.Builder builder = null; + IMapsProvider.ILatLngBoundsBuilder builder = null; if (firstFocus) { - builder = new LatLngBounds.Builder(); + builder = ApplicationLoader.getMapsProvider().onCreateLatLngBoundsBuilder(); } int date = getConnectionsManager().getCurrentTime(); for (int a = 0; a < messages.size(); a++) { TLRPC.Message message = messages.get(a); if (message.date + message.media.period > date) { if (builder != null) { - LatLng latLng = new LatLng(message.media.geo.lat, message.media.geo._long); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(message.media.geo.lat, message.media.geo._long); builder.include(latLng); } addUserMarker(message); @@ -2226,17 +2193,17 @@ public class LocationActivity extends BaseFragment implements NotificationCenter adapter.setLiveLocations(markers); if (messageObject.isLiveLocation()) { try { - LatLngBounds bounds = builder.build(); - LatLng center = bounds.getCenter(); - LatLng northEast = move(center, 100, 100); - LatLng southWest = move(center, -100, -100); + IMapsProvider.ILatLngBounds bounds = builder.build(); + IMapsProvider.LatLng center = bounds.getCenter(); + IMapsProvider.LatLng northEast = move(center, 100, 100); + IMapsProvider.LatLng southWest = move(center, -100, -100); builder.include(southWest); builder.include(northEast); bounds = builder.build(); if (messages.size() > 1) { try { - moveToBounds = CameraUpdateFactory.newLatLngBounds(bounds, AndroidUtilities.dp(80 + 33)); - googleMap.moveCamera(moveToBounds); + moveToBounds = ApplicationLoader.getMapsProvider().newCameraUpdateLatLngBounds(bounds, AndroidUtilities.dp(80 + 33)); + map.moveCamera(moveToBounds); moveToBounds = null; } catch (Exception e) { FileLog.e(e); @@ -2250,25 +2217,25 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } private void moveToBounds(int radius, boolean self, boolean animated) { - LatLngBounds.Builder builder = new LatLngBounds.Builder(); - builder.include(new LatLng(myLocation.getLatitude(), myLocation.getLongitude())); + IMapsProvider.ILatLngBoundsBuilder builder = ApplicationLoader.getMapsProvider().onCreateLatLngBoundsBuilder(); + builder.include(new IMapsProvider.LatLng(myLocation.getLatitude(), myLocation.getLongitude())); if (self) { try { radius = Math.max(radius, 250); - LatLngBounds bounds = builder.build(); - LatLng center = bounds.getCenter(); - LatLng northEast = move(center, radius, radius); - LatLng southWest = move(center, -radius, -radius); + IMapsProvider.ILatLngBounds bounds = builder.build(); + IMapsProvider.LatLng center = bounds.getCenter(); + IMapsProvider.LatLng northEast = move(center, radius, radius); + IMapsProvider.LatLng southWest = move(center, -radius, -radius); builder.include(southWest); builder.include(northEast); bounds = builder.build(); try { int height = (int) (proximitySheet.getCustomView().getMeasuredHeight() - AndroidUtilities.dp(40) + mapViewClip.getTranslationY()); - googleMap.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), height); + map.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), height); if (animated) { - googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0), 500, null); + map.animateCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngBounds(bounds, 0), 500, null); } else { - googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0)); + map.moveCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngBounds(bounds, 0)); } } catch (Exception e) { FileLog.e(e); @@ -2281,22 +2248,22 @@ public class LocationActivity extends BaseFragment implements NotificationCenter for (int a = 0, N = markers.size(); a < N; a++) { TLRPC.Message message = markers.get(a).object; if (message.date + message.media.period > date) { - LatLng latLng = new LatLng(message.media.geo.lat, message.media.geo._long); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(message.media.geo.lat, message.media.geo._long); builder.include(latLng); } } try { - LatLngBounds bounds = builder.build(); - LatLng center = bounds.getCenter(); - LatLng northEast = move(center, 100, 100); - LatLng southWest = move(center, -100, -100); + IMapsProvider.ILatLngBounds bounds = builder.build(); + IMapsProvider.LatLng center = bounds.getCenter(); + IMapsProvider.LatLng northEast = move(center, 100, 100); + IMapsProvider.LatLng southWest = move(center, -100, -100); builder.include(southWest); builder.include(northEast); bounds = builder.build(); try { int height = proximitySheet.getCustomView().getMeasuredHeight() - AndroidUtilities.dp(100); - googleMap.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), height); - googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0)); + map.setPadding(AndroidUtilities.dp(70), 0, AndroidUtilities.dp(70), height); + map.moveCamera(ApplicationLoader.getMapsProvider().newCameraUpdateLatLngBounds(bounds, 0)); } catch (Exception e) { FileLog.e(e); } @@ -2326,7 +2293,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter getConnectionsManager().sendRequest(req, (response, error) -> { if (response != null) { AndroidUtilities.runOnUIThread(() -> { - if (googleMap == null) { + if (map == null) { return; } TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; @@ -2359,7 +2326,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter return messages != null; } - private double bearingBetweenLocations(LatLng latLng1, LatLng latLng2) { + private double bearingBetweenLocations(IMapsProvider.LatLng latLng1, IMapsProvider.LatLng latLng2) { double lat1 = latLng1.latitude * Math.PI / 180; double long1 = latLng1.longitude * Math.PI / 180; double lat2 = latLng2.latitude * Math.PI / 180; @@ -2387,9 +2354,9 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (adapter != null) { adapter.setMyLocationDenied(locationDenied); } - if (googleMap != null) { + if (map != null) { try { - googleMap.setMyLocationEnabled(true); + map.setMyLocationEnabled(true); } catch (Exception e) { FileLog.e(e); } @@ -2449,21 +2416,21 @@ public class LocationActivity extends BaseFragment implements NotificationCenter LocationController.SharingLocationInfo myInfo = getLocationController().getSharingLocationInfo(did); if (myInfo == null || myInfo.mid != messageObject.getId()) { liveLocation.object = messageObject.messageOwner; - LatLng latLng = new LatLng(messageObject.messageOwner.media.geo.lat, messageObject.messageOwner.media.geo._long); + IMapsProvider.LatLng latLng = new IMapsProvider.LatLng(messageObject.messageOwner.media.geo.lat, messageObject.messageOwner.media.geo._long); liveLocation.marker.setPosition(latLng); if (liveLocation.directionMarker != null) { - LatLng oldLocation = liveLocation.directionMarker.getPosition(); + IMapsProvider.LatLng oldLocation = liveLocation.directionMarker.getPosition(); liveLocation.directionMarker.setPosition(latLng); if (messageObject.messageOwner.media.heading != 0) { liveLocation.directionMarker.setRotation(messageObject.messageOwner.media.heading); if (!liveLocation.hasRotation) { - liveLocation.directionMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin_cone2)); + liveLocation.directionMarker.setIcon(R.drawable.map_pin_cone2); liveLocation.hasRotation = true; } } else { if (liveLocation.hasRotation) { liveLocation.directionMarker.setRotation(0); - liveLocation.directionMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin_circle)); + liveLocation.directionMarker.setIcon(R.drawable.map_pin_circle); liveLocation.hasRotation = false; } } @@ -2526,9 +2493,9 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } onResumeCalled = true; - if (googleMap != null) { + if (map != null) { try { - googleMap.setMyLocationEnabled(true); + map.setMyLocationEnabled(true); } catch (Exception e) { FileLog.e(e); } @@ -2556,6 +2523,11 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } + @Override + public boolean hasForceLightStatusBar() { + return true; + } + @Override public void onLowMemory() { super.onLowMemory(); @@ -2591,12 +2563,12 @@ public class LocationActivity extends BaseFragment implements NotificationCenter shadowDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogBackground), PorterDuff.Mode.MULTIPLY)); shadow.invalidate(); - if (googleMap != null) { + if (map != null) { if (isActiveThemeDark()) { if (!currentMapStyleDark) { currentMapStyleDark = true; - MapStyleOptions style = MapStyleOptions.loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); - googleMap.setMapStyle(style); + IMapsProvider.IMapStyleOptions style = ApplicationLoader.getMapsProvider().loadRawResourceStyle(ApplicationLoader.applicationContext, R.raw.mapstyle_night); + map.setMapStyle(style); if (proximityCircle != null) { proximityCircle.setStrokeColor(0xffffffff); proximityCircle.setFillColor(0x20ffffff); @@ -2605,7 +2577,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } else { if (currentMapStyleDark) { currentMapStyleDark = false; - googleMap.setMapStyle(null); + map.setMapStyle(null); if (proximityCircle != null) { proximityCircle.setStrokeColor(0xff000000); proximityCircle.setFillColor(0x20000000); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 995cac92f..1b7b1e4e4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -95,6 +95,7 @@ import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.PushListenerController; import org.telegram.messenger.R; import org.telegram.messenger.SRPHelper; import org.telegram.messenger.SharedConfig; @@ -2453,7 +2454,7 @@ public class LoginActivity extends BaseFragment { TLRPC.TL_codeSettings settings = new TLRPC.TL_codeSettings(); settings.allow_flashcall = simcardAvailable && allowCall && allowCancelCall && allowReadCallLog; settings.allow_missed_call = simcardAvailable && allowCall; - settings.allow_app_hash = ApplicationLoader.hasPlayServices; + settings.allow_app_hash = PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices(); ArrayList tokens = MessagesController.getSavedLogOutTokens(); if (tokens != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java index 163e8dcd4..3576c8d38 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java @@ -68,7 +68,6 @@ import org.json.JSONObject; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.DownloadController; import org.telegram.messenger.FileLoader; @@ -79,6 +78,7 @@ import org.telegram.messenger.MediaController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MrzRecognizer; import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.PushListenerController; import org.telegram.messenger.R; import org.telegram.messenger.SRPHelper; import org.telegram.messenger.SecureDocument; @@ -6295,7 +6295,7 @@ public class PassportActivity extends BaseFragment implements NotificationCenter req.phone_number = phone; req.settings = new TLRPC.TL_codeSettings(); req.settings.allow_flashcall = simcardAvailable && allowCall; - req.settings.allow_app_hash = ApplicationLoader.hasPlayServices; + req.settings.allow_app_hash = PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices(); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); if (req.settings.allow_app_hash) { preferences.edit().putString("sms_hash", BuildVars.SMS_HASH).commit(); @@ -6891,7 +6891,7 @@ public class PassportActivity extends BaseFragment implements NotificationCenter File image = AndroidUtilities.generatePicturePath(); if (image != null) { if (Build.VERSION.SDK_INT >= 24) { - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", image)); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", image)); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java index 659e43e77..321a7b1ec 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java @@ -109,6 +109,7 @@ import org.telegram.tgnet.RequestDelegate; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarLayout; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.AlertDialog; @@ -269,12 +270,14 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen private boolean passwordOk; private String paymentJson; private String cardName; + private TLRPC.TL_paymentSavedCredentialsCard savedCredentialsCard; private boolean webviewLoading; private String countryName; private String totalPriceDecimal; private TLRPC.TL_payments_paymentForm paymentForm; private TLRPC.TL_payments_paymentReceipt paymentReceipt; private TLRPC.TL_payments_validatedRequestedInfo requestedInfo; + private TLRPC.TL_paymentFormMethod paymentFormMethod; private TLRPC.TL_shippingOption shippingOption; private Long tipAmount; private TLRPC.TL_payments_validateRequestedInfo validateRequest; @@ -299,6 +302,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen private Theme.ResourcesProvider resourcesProvider; private PaymentFormCallback paymentFormCallback; + private InvoiceStatus invoiceStatus; private boolean paymentStatusSent; private final static int done_button = 1; @@ -317,7 +321,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen } private interface PaymentFormActivityDelegate { - default boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsGooglePay googlePay) { + default boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsGooglePay googlePay, TLRPC.TL_paymentSavedCredentialsCard credentialsCard) { return false; } @@ -478,11 +482,12 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen if (saveCard || currentStep == STEP_CHECKOUT) { saveCardInfo = saveCard; } else { - saveCardInfo = paymentForm.saved_credentials != null; + saveCardInfo = !paymentForm.saved_credentials.isEmpty(); } if (card == null) { - if (form.saved_credentials != null) { - cardName = form.saved_credentials.title; + if (!paymentForm.saved_credentials.isEmpty()) { + savedCredentialsCard = paymentForm.saved_credentials.get(0); + cardName = savedCredentialsCard.title; } } else { cardName = card; @@ -1100,7 +1105,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen FileLog.e(e); } } - if (isWebView) { + if (isWebView || paymentFormMethod != null) { if (googlePayPublicKey != null || googlePayParameters != null) { initGooglePay(context); } @@ -1712,7 +1717,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen inputFields[a].setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI); switch (a) { case FIELD_SAVEDCARD: - inputFields[a].setText(paymentForm.saved_credentials.title); + inputFields[a].setText(savedCredentialsCard.title); break; case FIELD_SAVEDPASSWORD: inputFields[a].setHint(LocaleController.getString("LoginPassword", R.string.LoginPassword)); @@ -1733,7 +1738,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen }); if (a == FIELD_SAVEDPASSWORD) { bottomCell[0] = new TextInfoPrivacyCell(context, resourcesProvider); - bottomCell[0].setText(LocaleController.formatString("PaymentConfirmationMessage", R.string.PaymentConfirmationMessage, paymentForm.saved_credentials.title)); + bottomCell[0].setText(LocaleController.formatString("PaymentConfirmationMessage", R.string.PaymentConfirmationMessage, savedCredentialsCard.title)); bottomCell[0].setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); linearLayout2.addView(bottomCell[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); @@ -2086,28 +2091,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen if (getParentActivity() == null) { return; } - BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("PaymentCheckoutMethod", R.string.PaymentCheckoutMethod), true); - builder.setItems(new CharSequence[]{cardName, LocaleController.getString("PaymentCheckoutMethodNewCard", R.string.PaymentCheckoutMethodNewCard)}, - new int[]{R.drawable.msg_payment_card, R.drawable.msg_addbot}, (dialog, which) -> { - if (which == 1) { - PaymentFormActivity activity = new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, STEP_PAYMENT_INFO, requestedInfo, shippingOption, tipAmount, null, cardName, validateRequest, saveCardInfo, null, parentFragment); - activity.setDelegate(new PaymentFormActivityDelegate() { - @Override - public boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsGooglePay googlePay) { - paymentForm.saved_credentials = null; - paymentJson = tokenJson; - saveCardInfo = saveCard; - cardName = card; - googlePayCredentials = googlePay; - detailSettingsCell[0].setTextAndValue(cardName, LocaleController.getString("PaymentCheckoutMethod", R.string.PaymentCheckoutMethod), true); - return false; - } - }); - presentFragment(activity); - } - }); - showDialog(builder.create()); + showChoosePaymentMethod(); }); } @@ -2118,16 +2102,16 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen providerUser = user; } } - final String providerName; + detailSettingsCell[1] = new TextDetailSettingsCell(context); + detailSettingsCell[1].setBackground(Theme.getSelectorDrawable(true)); + String providerName; if (providerUser != null) { - detailSettingsCell[1] = new TextDetailSettingsCell(context); - detailSettingsCell[1].setBackgroundDrawable(Theme.getSelectorDrawable(true)); detailSettingsCell[1].setTextAndValueAndIcon(providerName = ContactsController.formatName(providerUser.first_name, providerUser.last_name), LocaleController.getString("PaymentCheckoutProvider", R.string.PaymentCheckoutProvider), R.drawable.msg_payment_provider, validateRequest != null && (validateRequest.info.shipping_address != null || shippingOption != null) || paymentForm.saved_info != null && (paymentForm.saved_info.shipping_address != null)); - detailSettingsCell[1].setVisibility(cardInfoVisibility); linearLayout2.addView(detailSettingsCell[1]); } else { providerName = ""; } + detailSettingsCell[1].setVisibility(providerUser != null ? cardInfoVisibility : View.GONE); if (validateRequest != null || isCheckoutPreview && paymentForm != null && paymentForm.saved_info != null) { TLRPC.TL_paymentRequestedInfo info = validateRequest != null ? validateRequest.info : paymentForm.saved_info; @@ -2261,21 +2245,24 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen return; } - if (isCheckoutPreview && (paymentForm.saved_info == null && (paymentForm.invoice.shipping_address_requested || paymentForm.invoice.email_requested || paymentForm.invoice.name_requested || paymentForm.invoice.phone_requested) || paymentForm.saved_credentials == null || shippingOption == null && paymentForm.invoice.flexible)) { + if (isCheckoutPreview && (paymentForm.saved_info == null && (paymentForm.invoice.shipping_address_requested || paymentForm.invoice.email_requested || paymentForm.invoice.name_requested || paymentForm.invoice.phone_requested) || savedCredentialsCard == null && paymentJson == null && googlePayCredentials == null || shippingOption == null && paymentForm.invoice.flexible)) { int step; if (paymentForm.saved_info == null && (paymentForm.invoice.shipping_address_requested || paymentForm.invoice.email_requested || paymentForm.invoice.name_requested || paymentForm.invoice.phone_requested)) { step = STEP_SHIPPING_INFORMATION; - } else if (paymentForm.saved_credentials == null) { + } else if (savedCredentialsCard == null && paymentJson == null && googlePayCredentials == null) { step = STEP_PAYMENT_INFO; } else { step = STEP_SHIPPING_METHODS; } - paymentStatusSent = true; - presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, step, requestedInfo, shippingOption, tipAmount, null, cardName, validateRequest, saveCardInfo, null, parentFragment)); + if (step == STEP_PAYMENT_INFO && !paymentForm.additional_methods.isEmpty()) { + showChoosePaymentMethod(v::callOnClick); + } else { + presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, step, requestedInfo, shippingOption, tipAmount, paymentJson, cardName, validateRequest, saveCardInfo, null, parentFragment)); + } return; } - if (!paymentForm.password_missing && paymentForm.saved_credentials != null) { + if (!paymentForm.password_missing && savedCredentialsCard != null) { if (UserConfig.getInstance(currentAccount).tmpPassword != null) { if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) { UserConfig.getInstance(currentAccount).tmpPassword = null; @@ -2350,20 +2337,6 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen webView.setWebViewClient(new WebViewClient() { - @Override - public void onLoadResource(WebView view, String url) { - try { - Uri uri = Uri.parse(url); - if ("t.me".equals(uri.getHost())) { - goToNextStep(); - return; - } - } catch (Exception ignore) { - - } - super.onLoadResource(view, url); - } - @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); @@ -2610,6 +2583,94 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen return fragmentView; } + private void showChoosePaymentMethod() { + showChoosePaymentMethod(null); + } + + private void showChoosePaymentMethod(Runnable callback) { + BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()) + .setTitle(LocaleController.getString("PaymentCheckoutMethod", R.string.PaymentCheckoutMethod), true); + List titles = new ArrayList<>(); + List icons = new ArrayList<>(); + if (savedCredentialsCard != null) { + titles.add(savedCredentialsCard.title); + icons.add(R.drawable.msg_payment_card); + } else if (cardName != null) { + titles.add(cardName); + icons.add(R.drawable.msg_payment_card); + } + List savedCredentialsCards = new ArrayList<>(); + for (TLRPC.TL_paymentSavedCredentialsCard credentialsCard : paymentForm.saved_credentials) { + if (savedCredentialsCard == null || !Objects.equals(credentialsCard.id, savedCredentialsCard.id)) { + titles.add(credentialsCard.title); + icons.add(R.drawable.msg_payment_card); + savedCredentialsCards.add(credentialsCard); + } + } + for (TLRPC.TL_paymentFormMethod method : paymentForm.additional_methods) { + titles.add(method.title); + icons.add(R.drawable.msg_payment_provider); + } + titles.add(LocaleController.getString(R.string.PaymentCheckoutMethodNewCard)); + icons.add(R.drawable.msg_addbot); + + int[] iconsIntArr = new int[icons.size()]; + for (int i = 0; i < icons.size(); i++) { + iconsIntArr[i] = icons.get(i); + } + builder.setItems(titles.toArray(new CharSequence[0]), iconsIntArr, (dialog, which) -> { + PaymentFormActivityDelegate delegate = new PaymentFormActivityDelegate() { + @Override + public boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsGooglePay googlePay, TLRPC.TL_paymentSavedCredentialsCard credentialsCard) { + savedCredentialsCard = credentialsCard; + paymentJson = tokenJson; + saveCardInfo = saveCard; + cardName = card; + googlePayCredentials = googlePay; + if (detailSettingsCell[0] != null) { + detailSettingsCell[0].setVisibility(View.VISIBLE); + detailSettingsCell[0].setTextAndValueAndIcon(cardName != null && cardName.length() > 1 ? cardName.substring(0, 1).toUpperCase() + cardName.substring(1) : cardName, LocaleController.getString("PaymentCheckoutMethod", R.string.PaymentCheckoutMethod), R.drawable.msg_payment_card, true); + + if (detailSettingsCell[1] != null) { + detailSettingsCell[1].setVisibility(View.VISIBLE); + } + } + if (callback != null) { + callback.run(); + } + return false; + } + }; + int offset = savedCredentialsCard != null || cardName != null ? 1 : 0; + if ((savedCredentialsCard != null || cardName != null) && which == 0) { + return; + } + if (which >= offset && which < offset + savedCredentialsCards.size()) { + savedCredentialsCard = savedCredentialsCards.get(which - offset); + delegate.didSelectNewCard(null, savedCredentialsCard.title, true, null, savedCredentialsCard); + return; + } + + if (which < titles.size() - 1) { + TLRPC.TL_paymentFormMethod method = paymentForm.additional_methods.get(which - savedCredentialsCards.size() - offset); + + PaymentFormActivity activity = new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, STEP_PAYMENT_INFO, requestedInfo, shippingOption, tipAmount, null, cardName, validateRequest, saveCardInfo, null, parentFragment); + activity.setPaymentMethod(method); + activity.setDelegate(delegate); + presentFragment(activity); + } else if (which == titles.size() - 1) { + PaymentFormActivity activity = new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, STEP_PAYMENT_INFO, requestedInfo, shippingOption, tipAmount, null, cardName, validateRequest, saveCardInfo, null, parentFragment); + activity.setDelegate(delegate); + presentFragment(activity); + } + }); + showDialog(builder.create()); + } + + private void setPaymentMethod(TLRPC.TL_paymentFormMethod method) { + paymentFormMethod = method; + } + private void setAddressFields(TLRPC.TL_paymentRequestedInfo info) { if (info.shipping_address != null) { String address = String.format("%s %s, %s, %s, %s, %s", info.shipping_address.street_line1, info.shipping_address.street_line2, info.shipping_address.city, info.shipping_address.state, info.shipping_address.country_iso2, info.shipping_address.post_code); @@ -2860,6 +2921,9 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen } private void showPayAlert(final String totalPrice) { + if (getParentActivity() == null) { + return; + } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("PaymentTransactionReview", R.string.PaymentTransactionReview)); builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("PaymentTransactionMessage2", R.string.PaymentTransactionMessage2, totalPrice, currentBotName, currentItemName))); @@ -2996,8 +3060,11 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen if (delegate != null) { delegate.onFragmentDestroyed(); } - if (!paymentStatusSent && paymentFormCallback != null && getOtherSameFragmentDiff() == 0) { - paymentFormCallback.onInvoiceStatusChanged(InvoiceStatus.CANCELLED); + if (!paymentStatusSent) { + invoiceStatus = InvoiceStatus.CANCELLED; + if (paymentFormCallback != null && getOtherSameFragmentDiff() == 0) { + paymentFormCallback.onInvoiceStatusChanged(invoiceStatus); + } } NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.twoStepPasswordChanged); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.didRemoveTwoStepPassword); @@ -3047,7 +3114,11 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen if (isOpen && !backward) { if (webView != null) { if (currentStep != STEP_CHECKOUT) { - webView.loadUrl(webViewUrl = paymentForm.url); + if (paymentFormMethod != null) { + webView.loadUrl(webViewUrl = paymentFormMethod.url); + } else { + webView.loadUrl(webViewUrl = paymentForm.url); + } } } else if (currentStep == STEP_PAYMENT_INFO) { AndroidUtilities.runOnUIThread(() -> { @@ -3119,7 +3190,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen Token t = TokenParser.parseToken(token); paymentJson = String.format(Locale.US, "{\"type\":\"%1$s\", \"id\":\"%2$s\"}", t.getType(), t.getId()); Card card = t.getCard(); - cardName = card.getType() + " *" + card.getLast4(); + cardName = card.getBrand() + " *" + card.getLast4(); } goToNextStep(); } catch (JSONException e) { @@ -3148,7 +3219,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen int nextStep; if (paymentForm.invoice.flexible) { nextStep = STEP_SHIPPING_METHODS; - } else if (paymentForm.saved_credentials != null) { + } else if (savedCredentialsCard != null || paymentJson != null) { if (UserConfig.getInstance(currentAccount).tmpPassword != null) { if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) { UserConfig.getInstance(currentAccount).tmpPassword = null; @@ -3163,12 +3234,18 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen } else { nextStep = STEP_PAYMENT_INFO; } - presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, nextStep, requestedInfo, null, null, null, cardName, validateRequest, saveCardInfo, googlePayCredentials, parentFragment), isWebView); + if (nextStep == STEP_PAYMENT_INFO && savedCredentialsCard == null && paymentJson == null && !paymentForm.additional_methods.isEmpty()) { + showChoosePaymentMethod(this::goToNextStep); + } else { + presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, nextStep, requestedInfo, null, null, paymentJson, cardName, validateRequest, saveCardInfo, googlePayCredentials, parentFragment), isWebView); + } } break; case STEP_SHIPPING_METHODS: { int nextStep; - if (paymentForm.saved_credentials != null) { + if (paymentJson != null || cardName != null) { + nextStep = STEP_CHECKOUT; + } else if (savedCredentialsCard != null) { if (UserConfig.getInstance(currentAccount).tmpPassword != null) { if (UserConfig.getInstance(currentAccount).tmpPassword.valid_until < ConnectionsManager.getInstance(currentAccount).getCurrentTime() + 60) { UserConfig.getInstance(currentAccount).tmpPassword = null; @@ -3183,7 +3260,11 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen } else { nextStep = STEP_PAYMENT_INFO; } - presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, nextStep, requestedInfo, shippingOption, tipAmount, null, cardName, validateRequest, saveCardInfo, googlePayCredentials, parentFragment), isWebView); + if (nextStep == STEP_PAYMENT_INFO && cardName == null && savedCredentialsCard == null && paymentJson == null && !paymentForm.additional_methods.isEmpty()) { + showChoosePaymentMethod(this::goToNextStep); + } else { + presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, nextStep, requestedInfo, shippingOption, tipAmount, paymentJson, cardName, validateRequest, saveCardInfo, googlePayCredentials, parentFragment), isWebView); + } break; } case STEP_PAYMENT_INFO: @@ -3192,9 +3273,9 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen passwordFragment.setCurrentPassword(currentPassword); passwordFragment.setDelegate(new PaymentFormActivityDelegate() { @Override - public boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsGooglePay googlePay) { + public boolean didSelectNewCard(String tokenJson, String card, boolean saveCard, TLRPC.TL_inputPaymentCredentialsGooglePay googlePay, TLRPC.TL_paymentSavedCredentialsCard credentialsCard) { if (delegate != null) { - delegate.didSelectNewCard(tokenJson, card, saveCard, googlePay); + delegate.didSelectNewCard(tokenJson, card, saveCard, googlePay, credentialsCard); } if (isWebView) { removeSelfFromStack(); @@ -3215,7 +3296,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen presentFragment(passwordFragment, isWebView); } else { if (delegate != null) { - delegate.didSelectNewCard(paymentJson, cardName, saveCardInfo, googlePayCredentials); + delegate.didSelectNewCard(paymentJson, cardName, saveCardInfo, googlePayCredentials, null); finishFragment(); } else { presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, STEP_CHECKOUT, requestedInfo, shippingOption, tipAmount, paymentJson, cardName, validateRequest, saveCardInfo, googlePayCredentials, parentFragment), isWebView); @@ -3233,27 +3314,30 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen break; } case STEP_CHECKOUT: + if (isCheckoutPreview) { + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.paymentFinished); + } NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.paymentFinished); - if (botUser.username != null && botUser.username.equalsIgnoreCase(getMessagesController().premiumBotUsername) || invoiceSlug != null && getMessagesController().premiumInvoiceSlug != null && Objects.equals(invoiceSlug, getMessagesController().premiumInvoiceSlug)) { - for (BaseFragment fragment : new ArrayList<>(getParentLayout().fragmentsStack)) { - if (fragment instanceof ChatActivity || fragment instanceof PremiumPreviewFragment) { - fragment.removeSelfFromStack(); - } - } - presentFragment(new PremiumPreviewFragment(null).setForcePremium(), true); - if (getParentActivity() instanceof LaunchActivity) { - try { - fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignored) {} - ((LaunchActivity) getParentActivity()).getFireworksOverlay().start(); + if (getMessagesController().newMessageCallback == null) { + if (!onCheckoutSuccess(getParentLayout(), getParentActivity()) && !isFinishing()) { + finishFragment(); } } else { - finishFragment(); + AndroidUtilities.runOnUIThread(()-> { + getMessagesController().newMessageCallback = null; + if (invoiceStatus == InvoiceStatus.PENDING && !isFinishing()) { + invoiceStatus = InvoiceStatus.FAILED; + if (paymentFormCallback != null) { + paymentFormCallback.onInvoiceStatusChanged(invoiceStatus); + } + finishFragment(); + } + }, 500); } break; case STEP_SET_PASSWORD_EMAIL: - if (!delegate.didSelectNewCard(paymentJson, cardName, saveCardInfo, googlePayCredentials)) { + if (!delegate.didSelectNewCard(paymentJson, cardName, saveCardInfo, googlePayCredentials, savedCredentialsCard)) { presentFragment(new PaymentFormActivity(paymentForm, messageObject, invoiceSlug, STEP_CHECKOUT, requestedInfo, shippingOption, tipAmount, paymentJson, cardName, validateRequest, saveCardInfo, googlePayCredentials, parentFragment), true); } else { finishFragment(); @@ -3262,6 +3346,29 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen } } + private boolean onCheckoutSuccess(ActionBarLayout parentLayout, Activity parentActivity) { + if (botUser.username != null && botUser.username.equalsIgnoreCase(getMessagesController().premiumBotUsername) && invoiceSlug == null || invoiceSlug != null && getMessagesController().premiumInvoiceSlug != null && Objects.equals(invoiceSlug, getMessagesController().premiumInvoiceSlug)) { + if (parentLayout != null) { + for (BaseFragment fragment : new ArrayList<>(parentLayout.fragmentsStack)) { + if (fragment instanceof ChatActivity || fragment instanceof PremiumPreviewFragment) { + fragment.removeSelfFromStack(); + } + } + + parentLayout.presentFragment(new PremiumPreviewFragment(null).setForcePremium(), !isFinishing()); + if (parentActivity instanceof LaunchActivity) { + try { + fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignored) { + } + ((LaunchActivity) parentActivity).getFireworksOverlay().start(); + } + return true; + } + } + return false; + } + private void updateSavePaymentField() { if (bottomCell[0] == null || sectionCell[2] == null) { return; @@ -3537,7 +3644,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen inputFields[FIELD_CARD_POSTCODE].getText().toString(), inputFields[FIELD_CARD_COUNTRY].getText().toString(), null); - cardName = card.getType() + " *" + card.getLast4(); + cardName = card.getBrand() + " *" + card.getLast4(); if (!card.validateNumber()) { shakeField(FIELD_CARD); return false; @@ -3831,9 +3938,9 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen req.invoice = inputInvoice; } req.form_id = paymentForm.form_id; - if (UserConfig.getInstance(currentAccount).tmpPassword != null && paymentForm.saved_credentials != null) { + if (UserConfig.getInstance(currentAccount).tmpPassword != null && savedCredentialsCard != null) { req.credentials = new TLRPC.TL_inputPaymentCredentialsSaved(); - req.credentials.id = paymentForm.saved_credentials.id; + req.credentials.id = savedCredentialsCard.id; req.credentials.tmp_password = UserConfig.getInstance(currentAccount).tmpPassword.tmp_password; } else if (googlePayCredentials != null) { req.credentials = googlePayCredentials; @@ -3873,19 +3980,19 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen getMessagesController().processUpdates(updates, false); AndroidUtilities.runOnUIThread(() -> { paymentStatusSent = true; + invoiceStatus = InvoiceStatus.PAID; if (paymentFormCallback != null) { - paymentFormCallback.onInvoiceStatusChanged(InvoiceStatus.PAID); + paymentFormCallback.onInvoiceStatusChanged(invoiceStatus); } goToNextStep(); if (parentFragment instanceof ChatActivity) { - CharSequence info = AndroidUtilities.replaceTags(LocaleController.formatString("PaymentInfoHint", R.string.PaymentInfoHint, totalPrice[0], currentItemName)); + CharSequence info = AndroidUtilities.replaceTags(LocaleController.formatString(R.string.PaymentInfoHint, totalPrice[0], currentItemName)); ((ChatActivity) parentFragment).getUndoView().showWithAction(0, UndoView.ACTION_PAYMENT_SUCCESS, info, message[0], null, null); } }); } else if (response instanceof TLRPC.TL_payments_paymentVerificationNeeded) { AndroidUtilities.runOnUIThread(() -> { - NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.paymentFinished); setDonePressed(false); webviewLoading = true; showEditDoneProgress(true, true); @@ -3896,14 +4003,39 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen doneItem.setEnabled(false); doneItem.getContentView().setVisibility(View.INVISIBLE); } + + ActionBarLayout parentLayout = getParentLayout(); + Activity parentActivity = getParentActivity(); + getMessagesController().newMessageCallback = message -> { + if (MessageObject.getPeerId(message.peer_id) == botUser.id && message.action instanceof TLRPC.TL_messageActionPaymentSent) { + AndroidUtilities.runOnUIThread(()->{ + paymentStatusSent = true; + invoiceStatus = InvoiceStatus.PAID; + if (paymentFormCallback != null) { + paymentFormCallback.onInvoiceStatusChanged(invoiceStatus); + } + + onCheckoutSuccess(parentLayout, parentActivity); + + if (parentFragment instanceof ChatActivity) { + CharSequence info = AndroidUtilities.replaceTags(LocaleController.formatString(R.string.PaymentInfoHint, totalPrice[0], currentItemName)); + ((ChatActivity) parentFragment).getUndoView().showWithAction(0, UndoView.ACTION_PAYMENT_SUCCESS, info, message, null, null); + } + }); + return true; + } + return false; + }; + if (webView != null) { webView.setVisibility(View.VISIBLE); webView.loadUrl(webViewUrl = ((TLRPC.TL_payments_paymentVerificationNeeded) response).url); } paymentStatusSent = true; + invoiceStatus = InvoiceStatus.PENDING; if (paymentFormCallback != null) { - paymentFormCallback.onInvoiceStatusChanged(InvoiceStatus.PENDING); + paymentFormCallback.onInvoiceStatusChanged(invoiceStatus); } }); } @@ -3914,8 +4046,9 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen showEditDoneProgress(false, false); paymentStatusSent = true; + invoiceStatus = InvoiceStatus.FAILED; if (paymentFormCallback != null) { - paymentFormCallback.onInvoiceStatusChanged(InvoiceStatus.FAILED); + paymentFormCallback.onInvoiceStatusChanged(invoiceStatus); } }); } @@ -4169,6 +4302,7 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen ((PaymentFormActivity) fragment).paymentFormCallback = paymentFormCallback; ((PaymentFormActivity) fragment).resourcesProvider = resourcesProvider; ((PaymentFormActivity) fragment).needPayAfterTransition = needPayAfterTransition; + ((PaymentFormActivity) fragment).savedCredentialsCard = savedCredentialsCard; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java index 3949eac00..a1d972077 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java @@ -366,7 +366,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati if (commentTextView != null) { commentTextView.onDestroy(); } - commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG); + commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG, false); InputFilter[] inputFilters = new InputFilter[1]; inputFilters[0] = new InputFilter.LengthFilter(MessagesController.getInstance(UserConfig.selectedAccount).maxCaptionLength); commentTextView.setFilters(inputFilters); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java index 1ffccb82c..a2cd7f3f0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java @@ -985,7 +985,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen if (commentTextView != null) { commentTextView.onDestroy(); } - commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG); + commentTextView = new EditTextEmoji(context, sizeNotifierFrameLayout, null, EditTextEmoji.STYLE_DIALOG, false); InputFilter[] inputFilters = new InputFilter[1]; inputFilters[0] = new InputFilter.LengthFilter(MessagesController.getInstance(UserConfig.selectedAccount).maxCaptionLength); commentTextView.setFilters(inputFilters); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 1a2ae5e0d..c80b2334d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -68,7 +68,6 @@ import android.transition.TransitionManager; import android.transition.TransitionSet; import android.transition.TransitionValues; import android.util.FloatProperty; -import android.util.Log; import android.util.Property; import android.util.Range; import android.util.SparseArray; @@ -136,7 +135,6 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.Bitmaps; import org.telegram.messenger.BringAppForegroundService; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; @@ -184,6 +182,8 @@ import org.telegram.ui.Adapters.MentionsAdapter; import org.telegram.ui.Cells.CheckBoxCell; import org.telegram.ui.Cells.PhotoPickerPhotoCell; import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AnimatedFileDrawable; import org.telegram.ui.Components.AnimationProperties; import org.telegram.ui.Components.BackupImageView; @@ -217,6 +217,7 @@ import org.telegram.ui.Components.PhotoViewerWebView; import org.telegram.ui.Components.PickerBottomLayoutViewer; import org.telegram.ui.Components.PipVideoOverlay; import org.telegram.ui.Components.PlayPauseDrawable; +import org.telegram.ui.Components.Premium.LimitReachedBottomSheet; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.RecyclerListView; @@ -2326,8 +2327,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat PhotoViewer.this.onDraw(canvas); if (isStatusBarVisible() && AndroidUtilities.statusBarHeight != 0 && actionBar != null) { - paint.setAlpha((int) (255 * actionBar.getAlpha() * 0.2f)); - canvas.drawRect(0, currentPanTranslationY, getMeasuredWidth(), currentPanTranslationY + AndroidUtilities.statusBarHeight, paint); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + paint.setAlpha((int) (255 * actionBar.getAlpha() * 0.2f)); + canvas.drawRect(0, currentPanTranslationY, getMeasuredWidth(), currentPanTranslationY + AndroidUtilities.statusBarHeight, paint); + } paint.setAlpha((int) (255 * actionBar.getAlpha() * 0.498f)); if (getPaddingRight() > 0) { canvas.drawRect(getMeasuredWidth() - getPaddingRight(), 0, getMeasuredWidth(), getMeasuredHeight(), paint); @@ -3536,7 +3539,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } if (Build.VERSION.SDK_INT >= 24) { try { - intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(parentActivity, BuildConfig.APPLICATION_ID + ".provider", f)); + intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(parentActivity, ApplicationLoader.getApplicationId() + ".provider", f)); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (Exception ignore) { intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); @@ -6119,7 +6122,25 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else if (object instanceof MediaDataController.KeywordResult) { String code = ((MediaDataController.KeywordResult) object).emoji; captionEditText.addEmojiToRecent(code); - captionEditText.replaceWithText(start, len, code, true); + if (code != null && code.startsWith("animated_")) { + try { + long documentId = Long.parseLong(code.substring(9)); + TLRPC.Document document = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); + SpannableString emoji = new SpannableString(MessageObject.findAnimatedEmojiEmoticon(document)); + AnimatedEmojiSpan span; + if (document != null) { + span = new AnimatedEmojiSpan(document, captionEditText.getMessageEditText().getPaint().getFontMetricsInt()); + } else { + span = new AnimatedEmojiSpan(documentId, captionEditText.getMessageEditText().getPaint().getFontMetricsInt()); + } + emoji.setSpan(span, 0, emoji.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + captionEditText.replaceWithText(start, len, emoji, false); + } catch (Exception ignore) { + captionEditText.replaceWithText(start, len, code, true); + } + } else { + captionEditText.replaceWithText(start, len, code, true); + } } }); @@ -6223,6 +6244,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } doneButtonPressed = true; + if (videoEditedInfo != null) { + long sizeToCheck = (long) (videoEditedInfo.estimatedSize * 0.9f); + if ((sizeToCheck > FileLoader.DEFAULT_MAX_FILE_SIZE && !UserConfig.getInstance(currentAccount).isPremium()) || sizeToCheck > FileLoader.DEFAULT_MAX_FILE_SIZE_PREMIUM) { + LimitReachedBottomSheet limitReachedBottomSheet = new LimitReachedBottomSheet(parentAlert.getBaseFragment(), parentAlert.getContainer().getContext(), LimitReachedBottomSheet.TYPE_LARGE_FILE, UserConfig.selectedAccount); + limitReachedBottomSheet.show(); + return; + } + } if (!replace) { placeProvider.sendButtonPressed(currentIndex, videoEditedInfo, notify, scheduleDate, forceDocument); } else { @@ -6431,6 +6460,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } + private Layout lastLayout; + @Override protected void onDraw(Canvas canvas) { canvas.save(); @@ -6440,6 +6471,34 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } canvas.restore(); super.onDraw(canvas); + if (lastLayout != getLayout()) { + animatedEmojiDrawables = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiDrawables, getLayout()); + lastLayout = getLayout(); + } + } + + private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiDrawables; + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + AnimatedEmojiSpan.release(this, animatedEmojiDrawables); + } + + @Override + protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { + super.onTextChanged(text, start, lengthBefore, lengthAfter); + animatedEmojiDrawables = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiDrawables, getLayout()); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + canvas.save(); + canvas.translate(getPaddingLeft(), getPaddingTop()); + canvas.clipRect(0, getScrollY(), getWidth() - getPaddingRight(), getHeight() + getScrollY() - getPaddingBottom() * .75f); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, getLayout(), animatedEmojiDrawables, 0, null, 0, 0, 0, 1f); + canvas.restore(); } }; ViewHelper.setPadding(textView, 16, 8, 16, 8); @@ -6877,7 +6936,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } private void onUserLeaveHint() { - if (pipItem.getAlpha() != 1.0f || !AndroidUtilities.checkInlinePermissions(parentActivity) || PipVideoOverlay.isVisible()) { + if (pipItem.getAlpha() != 1.0f || !AndroidUtilities.checkInlinePermissions(parentActivity) || PipVideoOverlay.isVisible() || !isPlaying) { return; } if (isEmbedVideo) { @@ -7066,6 +7125,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat selectedPhotosListView.setEnabled(false); photosCounterView.setRotationX(0.0f); isPhotosListViewVisible = false; + if (captionEditText.getMessageEditText() != null) { + captionEditText.getMessageEditText().invalidateEffects(); + captionEditText.getMessageEditText().setText(captionEditText.getMessageEditText().getText()); + } captionEditText.setTag(1); captionEditText.openKeyboard(); captionEditText.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); @@ -7251,7 +7314,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat Object object = imagesArrLocals.get(currentIndex); if (apply) { CharSequence caption = captionEditText.getFieldCharSequence(); - 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; @@ -7331,7 +7394,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (innerDuration < 20) { return; } - if (progress < 0.9f && (document.size * progress >= 5 * 1024 * 1024 || progress >= 0.5f && document.size >= 2 * 1024 * 1024) && Math.abs(SystemClock.elapsedRealtime() - startedPlayTime) >= 2000) { + boolean bigFile = document.size >= 2L * 1024 * 1024 * 1024; + boolean autoDownload = (DownloadController.getInstance(currentAccount).getAutodownloadMask() & DownloadController.AUTODOWNLOAD_TYPE_VIDEO) != 0; + if (autoDownload && progress < 0.9f && (document.size * progress >= 5 * 1024 * 1024 || progress >= 0.5f && document.size >= 2 * 1024 * 1024) && Math.abs(SystemClock.elapsedRealtime() - startedPlayTime) >= (bigFile ? 10000 : 3000)) { long duration = videoPlayer.getDuration(); if (duration == C.TIME_UNSET) { Toast toast = Toast.makeText(parentActivity, LocaleController.getString("VideoDoesNotSupportStreaming", R.string.VideoDoesNotSupportStreaming), Toast.LENGTH_LONG); @@ -11647,7 +11712,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat detectFaces(); } - private void setCurrentCaption(MessageObject messageObject, final CharSequence caption, boolean animated) { + private void setCurrentCaption(MessageObject messageObject, final CharSequence _caption, boolean animated) { + final CharSequence caption = AnimatedEmojiSpan.cloneSpans(_caption); if (needCaptionLayout) { if (captionTextViewSwitcher.getParent() != pickerView) { if (captionContainer != null) { @@ -16254,6 +16320,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } private int selectCompression() { + //1GB + if (originalSize > 1024L * 1024L * 1000L) { + return compressionsCount - 1; + } SharedPreferences preferences = MessagesController.getGlobalMainSettings(); int compressionsCount = this.compressionsCount; int maxCompression = 2; @@ -16460,7 +16530,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat final int index = ++gettingFrameIndex; Utilities.globalQueue.postRunnable(() -> { try { - final AnimatedFileDrawable drawable = new AnimatedFileDrawable(new File(uri.getPath()), true, 0, null, null, null, 0, UserConfig.selectedAccount, false, AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y); + final AnimatedFileDrawable drawable = new AnimatedFileDrawable(new File(uri.getPath()), true, 0, null, null, null, 0, UserConfig.selectedAccount, false, AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y, null); final Bitmap bitmap = drawable.getFrameAtTime(0); drawable.recycle(); AndroidUtilities.runOnUIThread(() -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java index 97dcbc7d0..5530a129e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java @@ -41,6 +41,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingFlowParams; import com.android.billingclient.api.ProductDetails; +import com.android.billingclient.api.Purchase; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; @@ -85,10 +86,8 @@ import org.telegram.ui.Components.URLSpanNoUnderline; import org.telegram.ui.Components.URLSpanReplacement; import org.telegram.ui.Components.URLSpanUserMention; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; -import java.util.Currency; import java.util.List; public class PremiumPreviewFragment extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -131,6 +130,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification public final static int PREMIUM_FEATURE_VOICE_TO_TEXT = 8; public final static int PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT = 9; public final static int PREMIUM_FEATURE_APPLICATION_ICONS = 10; + public final static int PREMIUM_FEATURE_ANIMATED_EMOJI = 11; private int statusBarHeight; private int firstViewHeight; private boolean isDialogVisible; @@ -150,7 +150,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification private boolean forcePremium; float progressToFull; - public static int severStringToFeatureType(String s) { + public static int serverStringToFeatureType(String s) { switch (s) { case "double_limits": return PREMIUM_FEATURE_LIMITS; @@ -174,6 +174,8 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification return PREMIUM_FEATURE_ANIMATED_AVATARS; case "app_icons": return PREMIUM_FEATURE_APPLICATION_ICONS; + case "animated_emoji": + return PREMIUM_FEATURE_ANIMATED_EMOJI; } return -1; } @@ -192,6 +194,8 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification return "no_ads"; case PREMIUM_FEATURE_REACTIONS: return "unique_reactions"; + case PREMIUM_FEATURE_ANIMATED_EMOJI: + return "animated_emoji"; case PREMIUM_FEATURE_STICKERS: return "premium_stickers"; case PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT: @@ -220,7 +224,18 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification @Override public View createView(Context context) { hasOwnBackground = true; - shader = new LinearGradient(0, 0, 0, 100, new int[]{0xffF38926, 0xffDB5C9D, 0xffA767FF, 0xff55A5FF}, new float[]{0f, 0.32f, 0.5f, 1f}, Shader.TileMode.CLAMP); + shader = new LinearGradient( + 0, 0, 0, 100, + new int[]{ + Theme.getColor(Theme.key_premiumGradient4), + Theme.getColor(Theme.key_premiumGradient3), + Theme.getColor(Theme.key_premiumGradient2), + Theme.getColor(Theme.key_premiumGradient1), + Theme.getColor(Theme.key_premiumGradient0) + }, + new float[]{0f, 0.32f, 0.5f, 0.7f, 1f}, + Shader.TileMode.CLAMP + ); shader.setLocalMatrix(matrix); gradientPaint.setShader(shader); @@ -513,6 +528,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_ADS, R.drawable.msg_premium_ads, LocaleController.getString("PremiumPreviewNoAds", R.string.PremiumPreviewNoAds), LocaleController.getString("PremiumPreviewNoAdsDescription", R.string.PremiumPreviewNoAdsDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_REACTIONS, R.drawable.msg_premium_reactions, LocaleController.getString("PremiumPreviewReactions", R.string.PremiumPreviewReactions), LocaleController.getString("PremiumPreviewReactionsDescription", R.string.PremiumPreviewReactionsDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_STICKERS, R.drawable.msg_premium_stickers, LocaleController.getString("PremiumPreviewStickers", R.string.PremiumPreviewStickers), LocaleController.getString("PremiumPreviewStickersDescription", R.string.PremiumPreviewStickersDescription))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_ANIMATED_EMOJI, R.drawable.msg_premium_emoji, LocaleController.getString("PremiumPreviewEmoji", R.string.PremiumPreviewEmoji), LocaleController.getString("PremiumPreviewEmojiDescription", R.string.PremiumPreviewEmojiDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT, R.drawable.msg_premium_tools, LocaleController.getString("PremiumPreviewAdvancedChatManagement", R.string.PremiumPreviewAdvancedChatManagement), LocaleController.getString("PremiumPreviewAdvancedChatManagementDescription", R.string.PremiumPreviewAdvancedChatManagementDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_PROFILE_BADGE, R.drawable.msg_premium_badge, LocaleController.getString("PremiumPreviewProfileBadge", R.string.PremiumPreviewProfileBadge), LocaleController.getString("PremiumPreviewProfileBadgeDescription", R.string.PremiumPreviewProfileBadgeDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_ANIMATED_AVATARS, R.drawable.msg_premium_avatar, LocaleController.getString("PremiumPreviewAnimatedProfiles", R.string.PremiumPreviewAnimatedProfiles), LocaleController.getString("PremiumPreviewAnimatedProfilesDescription", R.string.PremiumPreviewAnimatedProfilesDescription))); @@ -520,6 +536,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification if (messagesController.premiumFeaturesTypesToPosition.size() > 0) { for (int i = 0; i < premiumFeatures.size(); i++) { + messagesController.premiumFeaturesTypesToPosition.append(PREMIUM_FEATURE_ANIMATED_EMOJI, 6); if (messagesController.premiumFeaturesTypesToPosition.get(premiumFeatures.get(i).type, -1) == -1) { premiumFeatures.remove(i); i--; @@ -581,43 +598,74 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification return; } - BillingController.getInstance().addResultListener(BillingController.PREMIUM_PRODUCT_ID, billingResult -> { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - if (fragment instanceof PremiumPreviewFragment) { - PremiumPreviewFragment premiumPreviewFragment = (PremiumPreviewFragment) fragment; - premiumPreviewFragment.setForcePremium(); - premiumPreviewFragment.getMediaDataController().loadPremiumPromo(false); + BillingController.getInstance().queryPurchases(BillingClient.ProductType.SUBS, (billingResult1, list) -> AndroidUtilities.runOnUIThread(() -> { + if (billingResult1.getResponseCode() == BillingClient.BillingResponseCode.OK) { + Runnable onSuccess = () -> { + if (fragment instanceof PremiumPreviewFragment) { + PremiumPreviewFragment premiumPreviewFragment = (PremiumPreviewFragment) fragment; + premiumPreviewFragment.setForcePremium(); + premiumPreviewFragment.getMediaDataController().loadPremiumPromo(false); - premiumPreviewFragment.listView.smoothScrollToPosition(0); - } else { - fragment.presentFragment(new PremiumPreviewFragment(null).setForcePremium()); + premiumPreviewFragment.listView.smoothScrollToPosition(0); + } else { + fragment.presentFragment(new PremiumPreviewFragment(null).setForcePremium()); + } + if (fragment.getParentActivity() instanceof LaunchActivity) { + try { + fragment.getFragmentView().performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignored) { + } + ((LaunchActivity) fragment.getParentActivity()).getFireworksOverlay().start(); + } + }; + if (list != null && !list.isEmpty()) { + for (Purchase purchase : list) { + if (purchase.getProducts().contains(BillingController.PREMIUM_PRODUCT_ID)) { + TLRPC.TL_payments_assignPlayMarketTransaction req = new TLRPC.TL_payments_assignPlayMarketTransaction(); + req.receipt = new TLRPC.TL_dataJSON(); + req.receipt.data = purchase.getOriginalJson(); + TLRPC.TL_inputStorePaymentPremiumSubscription purpose = new TLRPC.TL_inputStorePaymentPremiumSubscription(); + purpose.restore = true; + req.purpose = purpose; + fragment.getConnectionsManager().sendRequest(req, (response, error) -> { + if (response instanceof TLRPC.Updates) { + fragment.getMessagesController().processUpdates((TLRPC.Updates) response, false); + + onSuccess.run(); + } else if (error != null) { + AndroidUtilities.runOnUIThread(() -> AlertsCreator.processError(fragment.getCurrentAccount(), error, fragment, req)); + } + }, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagInvokeAfter); + + return; + } + } } - if (fragment.getParentActivity() instanceof LaunchActivity) { - try { - fragment.getFragmentView().performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignored) {} - ((LaunchActivity) fragment.getParentActivity()).getFireworksOverlay().start(); - } - } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) { - sentPremiumBuyCanceled(); + + BillingController.getInstance().addResultListener(BillingController.PREMIUM_PRODUCT_ID, billingResult -> { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + onSuccess.run(); + } + }); + + TLRPC.TL_payments_canPurchasePremium req = new TLRPC.TL_payments_canPurchasePremium(); + req.purpose = new TLRPC.TL_inputStorePaymentPremiumSubscription(); + fragment.getConnectionsManager().sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_boolTrue) { + BillingController.getInstance().launchBillingFlow(fragment.getParentActivity(), fragment.getAccountInstance(), new TLRPC.TL_inputStorePaymentPremiumSubscription(), Collections.singletonList( + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(BillingController.PREMIUM_PRODUCT_DETAILS) + .setOfferToken(offerDetails.get(0).getOfferToken()) + .build() + )); + } else { + AlertsCreator.processError(fragment.getCurrentAccount(), error, fragment, req); + } + }); + }); } - }); - - TLRPC.TL_payments_canPurchasePremium req = new TLRPC.TL_payments_canPurchasePremium(); - fragment.getConnectionsManager().sendRequest(req, (response, error) -> { - AndroidUtilities.runOnUIThread(() -> { - if (response instanceof TLRPC.TL_boolTrue) { - BillingController.getInstance().launchBillingFlow(fragment.getParentActivity(), Collections.singletonList( - BillingFlowParams.ProductDetailsParams.newBuilder() - .setProductDetails(BillingController.PREMIUM_PRODUCT_DETAILS) - .setOfferToken(offerDetails.get(0).getOfferToken()) - .build() - )); - } else { - AlertsCreator.processError(fragment.getCurrentAccount(), error, fragment, req); - } - }); - }); + })); } public static String getPremiumButtonText(int currentAccount) { @@ -628,13 +676,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification if (BuildVars.useInvoiceBilling()) { TLRPC.TL_help_premiumPromo premiumPromo = MediaDataController.getInstance(currentAccount).getPremiumPromo(); if (premiumPromo != null) { - Currency currency = Currency.getInstance(premiumPromo.currency); - if (currency != null) { - NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); - numberFormat.setCurrency(currency); - - return LocaleController.formatString(R.string.SubscribeToPremium, numberFormat.format(premiumPromo.monthly_amount / Math.pow(10, BillingController.getInstance().getCurrencyExp(premiumPromo.currency)))); - } + return LocaleController.formatString(R.string.SubscribeToPremium, BillingController.getInstance().formatCurrency(premiumPromo.monthly_amount, premiumPromo.currency)); } return LocaleController.getString(R.string.SubscribeToPremiumNoPrice); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java index b77d8ed10..5a16098a4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java @@ -16,7 +16,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.os.Build; import android.os.Bundle; import android.text.SpannableString; import android.text.SpannableStringBuilder; @@ -59,7 +58,6 @@ import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Components.BackgroundGradientDrawable; -import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.HintView; @@ -121,6 +119,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification public final static int PRIVACY_RULES_TYPE_FORWARDS = 5; public final static int PRIVACY_RULES_TYPE_PHONE = 6; public final static int PRIVACY_RULES_TYPE_ADDED_BY_PHONE = 7; + public final static int PRIVACY_RULES_TYPE_VOICE_MESSAGES = 8; public final static int TYPE_EVERYBODY = 0; public final static int TYPE_NOBODY = 1; @@ -321,6 +320,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification actionBar.setTitle(LocaleController.getString("Calls", R.string.Calls)); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { actionBar.setTitle(LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels)); + } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { + actionBar.setTitle(LocaleController.getString("PrivacyVoiceMessages", R.string.PrivacyVoiceMessages)); } else { actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen)); } @@ -495,6 +496,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification req.key = new TLRPC.TL_inputPrivacyKeyPhoneCall(); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { req.key = new TLRPC.TL_inputPrivacyKeyChatInvite(); + } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { + req.key = new TLRPC.TL_inputPrivacyKeyVoiceMessages(); } else { req.key = new TLRPC.TL_inputPrivacyKeyStatusTimestamp(); } @@ -706,7 +709,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification sectionRow = rowCount++; everybodyRow = rowCount++; myContactsRow = rowCount++; - if (rulesType != PRIVACY_RULES_TYPE_LASTSEEN && rulesType != PRIVACY_RULES_TYPE_CALLS && rulesType != PRIVACY_RULES_TYPE_P2P && rulesType != PRIVACY_RULES_TYPE_FORWARDS && rulesType != PRIVACY_RULES_TYPE_PHONE) { + if (rulesType != PRIVACY_RULES_TYPE_LASTSEEN && rulesType != PRIVACY_RULES_TYPE_CALLS && rulesType != PRIVACY_RULES_TYPE_P2P && + rulesType != PRIVACY_RULES_TYPE_FORWARDS && rulesType != PRIVACY_RULES_TYPE_PHONE && rulesType != PRIVACY_RULES_TYPE_VOICE_MESSAGES) { nobodyRow = -1; } else { nobodyRow = rowCount++; @@ -906,7 +910,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification public boolean isEnabled(RecyclerView.ViewHolder holder) { int position = holder.getAdapterPosition(); return position == nobodyRow || position == everybodyRow || position == myContactsRow || position == neverShareRow || position == alwaysShareRow || - position == p2pRow && !ContactsController.getInstance(currentAccount).getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_P2P); + position == p2pRow && !ContactsController.getInstance(currentAccount).getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_P2P); } @Override @@ -996,7 +1000,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } } else if (position == p2pRow) { String value; - if (ContactsController.getInstance(currentAccount).getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_P2P)) { + if (ContactsController.getInstance(currentAccount).getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_P2P)) { value = LocaleController.getString("Loading", R.string.Loading); } else { value = PrivacySettingsActivity.formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_P2P); @@ -1043,6 +1047,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification privacyCell.setText(LocaleController.getString("WhoCanCallMeInfo", R.string.WhoCanCallMeInfo)); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { privacyCell.setText(LocaleController.getString("WhoCanAddMeInfo", R.string.WhoCanAddMeInfo)); + } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { + privacyCell.setText(LocaleController.getString("PrivacyVoiceMessagesInfo", R.string.PrivacyVoiceMessagesInfo)); } else { privacyCell.setText(LocaleController.getString("CustomHelp", R.string.CustomHelp)); } @@ -1060,6 +1066,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification privacyCell.setText(LocaleController.getString("CustomCallInfo", R.string.CustomCallInfo)); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { privacyCell.setText(LocaleController.getString("CustomShareInfo", R.string.CustomShareInfo)); + } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { + privacyCell.setText(LocaleController.getString("PrivacyVoiceMessagesInfo2", R.string.PrivacyVoiceMessagesInfo2)); } else { privacyCell.setText(LocaleController.getString("CustomShareSettingsHelp", R.string.CustomShareSettingsHelp)); } @@ -1093,6 +1101,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification headerCell.setText(LocaleController.getString("WhoCanCallMe", R.string.WhoCanCallMe)); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { headerCell.setText(LocaleController.getString("WhoCanAddMe", R.string.WhoCanAddMe)); + } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { + headerCell.setText(LocaleController.getString("PrivacyVoiceMessagesTitle", R.string.PrivacyVoiceMessagesTitle)); } else { headerCell.setText(LocaleController.getString("LastSeenTitle", R.string.LastSeenTitle)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java index 4f39cf67a..6fce35999 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java @@ -10,10 +10,14 @@ package org.telegram.ui; import android.content.Context; import android.content.DialogInterface; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.text.TextUtils; +import android.view.HapticFeedbackConstants; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; @@ -40,6 +44,7 @@ import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Cells.CheckBoxCell; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.RadioColorCell; +import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; @@ -67,6 +72,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int profilePhotoRow; private int forwardsRow; private int callsRow; + private int voicesRow; + private int privacyShadowRow; private int groupsRow; private int groupsDetailRow; private int securitySectionRow; @@ -297,6 +304,18 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_PHOTO)); } else if (position == forwardsRow) { presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_FORWARDS)); + } else if (position == voicesRow) { + if (!getUserConfig().isPremium()) { + try { + fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception e) { + FileLog.e(e); + } + BulletinFactory.of(this).createRestrictVoiceMessagesPremiumBulletin().show(); + return; + } + + presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_VOICE_MESSAGES)); } else if (position == passwordRow) { if (currentPassword == null) { return; @@ -517,7 +536,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio forwardsRow = rowCount++; callsRow = rowCount++; groupsRow = rowCount++; - groupsDetailRow = rowCount++; + groupsDetailRow = -1; + voicesRow = rowCount++; + privacyShadowRow = rowCount++; securitySectionRow = rowCount++; passcodeRow = rowCount++; passwordRow = rowCount++; @@ -582,7 +603,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio public static String formatRulesString(AccountInstance accountInstance, int rulesType) { ArrayList privacyRules = accountInstance.getContactsController().getPrivacyRules(rulesType); - if (privacyRules.size() == 0) { + if (privacyRules == null || privacyRules.size() == 0) { if (rulesType == 3) { return LocaleController.getString("P2PNobody", R.string.P2PNobody); } else { @@ -706,12 +727,13 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio public boolean isEnabled(RecyclerView.ViewHolder holder) { int position = holder.getAdapterPosition(); return position == passcodeRow || position == passwordRow || position == blockedRow || position == sessionsRow || position == secretWebpageRow || position == webSessionsRow || - position == groupsRow && !getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_INVITE) || - position == lastSeenRow && !getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_LASTSEEN) || - position == callsRow && !getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_CALLS) || - position == profilePhotoRow && !getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_PHOTO) || - position == forwardsRow && !getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_FORWARDS) || - position == phoneNumberRow && !getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_PHONE) || + position == groupsRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_INVITE) || + position == lastSeenRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_LASTSEEN) || + position == callsRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_CALLS) || + position == profilePhotoRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_PHOTO) || + 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) || position == deleteAccountRow && !getContactsController().getLoadingDeleteInfo() || position == newChatsRow && !getContactsController().getLoadingGlobalSettings() || position == paymentsClearRow || position == secretMapRow || position == contactsSyncRow || position == passportRow || position == contactsDeleteRow || position == contactsSuggestRow; @@ -737,6 +759,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio view = new HeaderCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; + case 4: + view = new ShadowSectionCell(mContext); + break; case 3: default: view = new TextCheckCell(mContext); @@ -782,7 +807,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } else if (position == passcodeRow) { textCell.setText(LocaleController.getString("Passcode", R.string.Passcode), true); } else if (position == phoneNumberRow) { - if (getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_PHONE)) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_PHONE)) { showLoading = true; loadingLen = 30; } else { @@ -790,7 +815,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } textCell.setTextAndValue(LocaleController.getString("PrivacyPhone", R.string.PrivacyPhone), value, true); } else if (position == lastSeenRow) { - if (getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_LASTSEEN)) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_LASTSEEN)) { showLoading = true; loadingLen = 30; } else { @@ -798,15 +823,15 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } textCell.setTextAndValue(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen), value, true); } else if (position == groupsRow) { - if (getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_INVITE)) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_INVITE)) { showLoading = true; loadingLen = 30; } else { value = formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_INVITE); } - textCell.setTextAndValue(LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels), value, false); + textCell.setTextAndValue(LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels), value, true); } else if (position == callsRow) { - if (getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_CALLS)) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_CALLS)) { showLoading = true; loadingLen = 30; } else { @@ -814,7 +839,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } textCell.setTextAndValue(LocaleController.getString("Calls", R.string.Calls), value, true); } else if (position == profilePhotoRow) { - if (getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_PHOTO)) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_PHOTO)) { showLoading = true; loadingLen = 30; } else { @@ -822,13 +847,31 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } textCell.setTextAndValue(LocaleController.getString("PrivacyProfilePhoto", R.string.PrivacyProfilePhoto), value, true); } else if (position == forwardsRow) { - if (getContactsController().getLoadingPrivicyInfo(ContactsController.PRIVACY_RULES_TYPE_FORWARDS)) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_FORWARDS)) { showLoading = true; loadingLen = 30; } else { value = formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_FORWARDS); } textCell.setTextAndValue(LocaleController.getString("PrivacyForwards", R.string.PrivacyForwards), value, true); + } else if (position == voicesRow) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_VOICE_MESSAGES)) { + showLoading = true; + loadingLen = 30; + } else if (!getUserConfig().isPremium()) { + value = LocaleController.getString(R.string.P2PEverybody); + } else { + value = formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_VOICE_MESSAGES); + } + textCell.setTextAndValue(LocaleController.getString(R.string.PrivacyVoiceMessages), value, false); + ImageView imageView = textCell.getValueImageView(); + if (!getUserConfig().isPremium()) { + imageView.setVisibility(View.VISIBLE); + imageView.setImageResource(R.drawable.msg_mini_premiumlock); + imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteValueText), PorterDuff.Mode.MULTIPLY)); + } else { + imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.MULTIPLY)); + } } else if (position == passportRow) { textCell.setText(LocaleController.getString("TelegramPassport", R.string.TelegramPassport), true); } else if (position == deleteAccountRow) { @@ -942,6 +985,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio return 2; } else if (position == secretWebpageRow || position == contactsSyncRow || position == contactsSuggestRow || position == newChatsRow) { return 3; + } else if (position == privacyShadowRow) { + return 4; } return 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index c221e71d6..2df8278bb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -52,6 +52,7 @@ import android.util.SparseIntArray; import android.util.TypedValue; import android.view.Display; import android.view.Gravity; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; @@ -88,7 +89,6 @@ import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ChatThemeController; @@ -161,6 +161,7 @@ import org.telegram.ui.Components.HintView; import org.telegram.ui.Components.IdenticonDrawable; import org.telegram.ui.Components.ImageUpdater; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet; import org.telegram.ui.Components.Premium.PremiumGradient; import org.telegram.ui.Components.Premium.PremiumPreviewBottomSheet; import org.telegram.ui.Components.Premium.ProfilePremiumCell; @@ -170,6 +171,7 @@ import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.ScamDrawable; +import org.telegram.ui.Components.ShareAlert; import org.telegram.ui.Components.SharedMediaLayout; import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.StickerEmptyView; @@ -386,6 +388,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private final static int delete_avatar = 35; private final static int add_photo = 36; private final static int qr_button = 37; + private final static int gift_premium = 38; private Rect rect = new Rect(); @@ -1841,6 +1844,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. presentFragment(fragment); } else if (id == view_discussion) { openDiscussion(); + } else if (id == gift_premium) { + showDialog(new GiftPremiumBottomSheet(ProfileActivity.this, getMessagesController().getUser(userId))); } else if (id == start_secret_chat) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), resourcesProvider); builder.setTitle(LocaleController.getString("AreYouSureSecretChatTitle", R.string.AreYouSureSecretChatTitle)); @@ -3303,6 +3308,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. timeItem.setScaleType(ImageView.ScaleType.CENTER); timeItem.setAlpha(0.0f); timeItem.setImageDrawable(timerDrawable = new TimerDrawable(context, null)); + timeItem.setTranslationY(-1); frameLayout.addView(timeItem, LayoutHelper.createFrame(34, 34, Gravity.TOP | Gravity.LEFT)); showAvatarProgress(false, false); @@ -4051,20 +4057,26 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else { return false; } - try { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - String text; - if (userId != 0) { - text = "@" + username; + if (userId == 0) { + String link = "https://" + MessagesController.getInstance(UserConfig.selectedAccount).linkPrefix + "/" + username; + showDialog(new ShareAlert(getParentActivity(), null, link, false, link, false) { + @Override + protected void onSend(LongSparseArray dids, int count) { + 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); + } + }); + } else { + try { + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + String text = "@" + username; BulletinFactory.of(this).createCopyBulletin(LocaleController.getString("UsernameCopied", R.string.UsernameCopied), resourcesProvider).show(); - } else { - text = "https://" + MessagesController.getInstance(UserConfig.selectedAccount).linkPrefix + "/" + username; - BulletinFactory.of(this).createCopyLinkBulletin(LocaleController.getString("LinkCopied", R.string.LinkCopied), resourcesProvider).show(); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", text); + clipboard.setPrimaryClip(clip); + } catch (Exception e) { + FileLog.e(e); } - android.content.ClipData clip = android.content.ClipData.newPlainText("label", text); - clipboard.setPrimaryClip(clip); - } catch (Exception e) { - FileLog.e(e); } return true; } else if (position == phoneRow || position == numberRow) { @@ -6620,6 +6632,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. otherItem.addSubItem(delete_contact, R.drawable.msg_delete, LocaleController.getString("DeleteContact", R.string.DeleteContact)); } if (!UserObject.isDeleted(user) && !isBot && currentEncryptedChat == null && !userBlocked && userId != 333000 && userId != 777000 && userId != 42777) { + if (!user.premium && !BuildVars.IS_BILLING_UNAVAILABLE && !user.self && userInfo != null && !getMessagesController().premiumLocked && !userInfo.premium_gifts.isEmpty()) { + otherItem.addSubItem(gift_premium, R.drawable.msg_gift_premium, LocaleController.getString(R.string.GiftPremium)); + } otherItem.addSubItem(start_secret_chat, R.drawable.msg_secret, LocaleController.getString("StartEncryptedChat", R.string.StartEncryptedChat)); } otherItem.addSubItem(add_shortcut, R.drawable.msg_home, LocaleController.getString("AddShortcut", R.string.AddShortcut)); @@ -7318,7 +7333,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (finished[0]) { Uri uri; if (Build.VERSION.SDK_INT >= 24) { - uri = FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", zipFile); + uri = FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", zipFile); } else { uri = Uri.fromFile(zipFile); } @@ -8112,6 +8127,18 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. 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(123, LocaleController.getString("PrivacyVoiceMessages", R.string.PrivacyVoiceMessages), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> { + if (!getUserConfig().isPremium()) { + try { + fragmentView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception e) { + FileLog.e(e); + } + BulletinFactory.of(ProfileActivity.this).createRestrictVoiceMessagesPremiumBulletin().show(); + return; + } + presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_VOICE_MESSAGES, true)); + }), new SearchResult(108, LocaleController.getString("Passcode", R.string.Passcode), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(PasscodeActivity.determineOpenFragment())), new SearchResult(109, LocaleController.getString("TwoStepVerification", R.string.TwoStepVerification), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new TwoStepVerificationActivity())), new SearchResult(110, LocaleController.getString("SessionsTitle", R.string.SessionsTitle), R.drawable.msg_secret, () -> presentFragment(new SessionsActivity(0))), diff --git a/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java index eb3da7d2a..84265699a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java @@ -2,8 +2,6 @@ package org.telegram.ui; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.ActivityNotFoundException; @@ -78,7 +76,6 @@ import org.telegram.ui.Cells.SettingsSearchCell; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.ChatThemeBottomSheet; -import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.Easings; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.HideViewAfterAnimation; @@ -626,7 +623,7 @@ public class QrActivity extends BaseFragment { animationSettings.afterStartDescriptionsAddedRunnable = () -> { resourcesProvider.initColors(currentTheme, isCurrentThemeDark); }; - parentLayout.animateThemedValues(animationSettings); + parentLayout.animateThemedValues(animationSettings, null); } private void performShare() { @@ -670,7 +667,12 @@ public class QrActivity extends BaseFragment { ex.printStackTrace(); } } - AndroidUtilities.runOnUIThread(() -> themesViewController.shareButton.setClickable(true), 500); + AndroidUtilities.runOnUIThread(() -> { + if (themesViewController == null) { + return; + } + themesViewController.shareButton.setClickable(true); + }, 500); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ReactionsDoubleTapManageActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ReactionsDoubleTapManageActivity.java index c99200ade..7dea4d5ab 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ReactionsDoubleTapManageActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ReactionsDoubleTapManageActivity.java @@ -25,6 +25,7 @@ import org.telegram.ui.Cells.AvailableReactionCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.ThemePreviewMessagesCell; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.SimpleThemeDescription; @@ -94,7 +95,7 @@ public class ReactionsDoubleTapManageActivity extends BaseFragment implements No break; default: case 1: { - view = new AvailableReactionCell(context, true); + view = new AvailableReactionCell(context, true, true); } break; } @@ -107,7 +108,7 @@ public class ReactionsDoubleTapManageActivity extends BaseFragment implements No case 1: AvailableReactionCell reactionCell = (AvailableReactionCell) holder.itemView; TLRPC.TL_availableReaction react = getAvailableReactions().get(position - reactionsStartRow); - reactionCell.bind(react, react.reaction.contains(MediaDataController.getInstance(currentAccount).getDoubleTapReaction())); + reactionCell.bind(react, react.reaction.contains(MediaDataController.getInstance(currentAccount).getDoubleTapReaction()), currentAccount); break; } } @@ -130,9 +131,13 @@ public class ReactionsDoubleTapManageActivity extends BaseFragment implements No }); listView.setOnItemClickListener((view, position) -> { if (view instanceof AvailableReactionCell) { - MediaDataController.getInstance(currentAccount).setDoubleTapReaction(((AvailableReactionCell) view).react.reaction); + AvailableReactionCell cell = (AvailableReactionCell) view; + if (cell.locked && !getUserConfig().isPremium()) { + showDialog(new PremiumFeatureBottomSheet(this, PremiumPreviewFragment.PREMIUM_FEATURE_REACTIONS, true)); + return; + } + MediaDataController.getInstance(currentAccount).setDoubleTapReaction(cell.react.reaction); listView.getAdapter().notifyItemRangeChanged(0, listView.getAdapter().getItemCount()); - //AndroidUtilities.updateVisibleRows(listView); } }); linaerLayout.addView(listView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java index 93fc9d02f..5bfee8131 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java @@ -284,7 +284,7 @@ public class SessionsActivity extends BaseFragment implements NotificationCenter } userConfig.registeredForPush = false; userConfig.saveConfig(false); - MessagesController.getInstance(a).registerForPush(SharedConfig.pushString); + MessagesController.getInstance(a).registerForPush(SharedConfig.pushType, SharedConfig.pushString); ConnectionsManager.getInstance(a).setUserId(userConfig.getClientUserId()); } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java index 2162df8ed..6bc98849f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/StickersActivity.java @@ -13,6 +13,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Canvas; +import android.graphics.drawable.Drawable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -40,11 +41,13 @@ import org.telegram.messenger.FileLog; 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.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.SvgHelper; +import org.telegram.messenger.UserConfig; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; @@ -66,8 +69,11 @@ import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.EmojiPacksAlert; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.NumberTextView; +import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.ReorderingBulletinLayout; import org.telegram.ui.Components.ReorderingHintDrawable; @@ -78,6 +84,8 @@ import org.telegram.ui.Components.TrendingStickersLayout; import org.telegram.ui.Components.URLSpanNoUnderline; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Locale; @@ -105,12 +113,15 @@ public class StickersActivity extends BaseFragment implements NotificationCenter private int currentType; private int suggestRow; + private int suggestAnimatedEmojiRow; + private int suggestAnimatedEmojiInfoRow; private int loopRow; private int loopInfoRow; private int largeEmojiRow; private int reactionsDoubleTapRow; private int stickersBotInfo; private int masksRow; + private int emojiPacksRow; private int masksInfoRow; private int archivedRow; private int archivedInfoRow; @@ -129,6 +140,23 @@ public class StickersActivity extends BaseFragment implements NotificationCenter private boolean isListeningForFeaturedUpdate; + private ArrayList emojiPacks; + private List getFeaturedSets() { + final MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + List featuredStickerSets; + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + featuredStickerSets = new ArrayList<>(mediaDataController.getFeaturedEmojiSets()); + for (int i = 0; i < featuredStickerSets.size(); ++i) { + if (featuredStickerSets.get(i) == null || mediaDataController.isStickerPackInstalled(featuredStickerSets.get(i).set.id, false)) { + featuredStickerSets.remove(i--); + } + } + } else { + featuredStickerSets = mediaDataController.getFeaturedStickerSets(); + } + return featuredStickerSets; + } + public class TouchHelperCallback extends ItemTouchHelper.Callback { @Override @@ -192,10 +220,15 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (currentType == MediaDataController.TYPE_IMAGE) { MediaDataController.getInstance(currentAccount).checkFeaturedStickers(); MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_MASK); + MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_EMOJIPACKS); + } else if (currentType == MediaDataController.TYPE_FEATURED_EMOJIPACKS) { + MediaDataController.getInstance(currentAccount).checkFeaturedEmoji(); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.featuredEmojiDidLoad); } NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.archivedStickersCountDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.featuredStickersDidLoad); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.currentUserPremiumStatusChanged); updateRows(); return true; } @@ -203,9 +236,13 @@ public class StickersActivity extends BaseFragment implements NotificationCenter @Override public void onFragmentDestroy() { super.onFragmentDestroy(); + if (currentType == MediaDataController.TYPE_FEATURED_EMOJIPACKS) { + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.featuredEmojiDidLoad); + } NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.archivedStickersCountDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.featuredStickersDidLoad); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.currentUserPremiumStatusChanged); } @SuppressLint("ClickableViewAccessibility") @@ -215,8 +252,10 @@ public class StickersActivity extends BaseFragment implements NotificationCenter actionBar.setAllowOverlayTitle(true); if (currentType == MediaDataController.TYPE_IMAGE) { actionBar.setTitle(LocaleController.getString("StickersName", R.string.StickersName)); - } else { + } else if (currentType == MediaDataController.TYPE_MASK) { actionBar.setTitle(LocaleController.getString("Masks", R.string.Masks)); + } else if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + actionBar.setTitle(LocaleController.getString("Emoji", R.string.Emoji)); } actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override @@ -247,10 +286,14 @@ public class StickersActivity extends BaseFragment implements NotificationCenter selectedCountTextView.setOnTouchListener((v, event) -> true); shareMenuItem = actionMode.addItemWithWidth(MENU_SHARE, R.drawable.msg_share, AndroidUtilities.dp(54)); - archiveMenuItem = actionMode.addItemWithWidth(MENU_ARCHIVE, R.drawable.msg_archive, AndroidUtilities.dp(54)); + if (currentType != MediaDataController.TYPE_EMOJIPACKS) { + archiveMenuItem = actionMode.addItemWithWidth(MENU_ARCHIVE, R.drawable.msg_archive, AndroidUtilities.dp(54)); + } deleteMenuItem = actionMode.addItemWithWidth(MENU_DELETE, R.drawable.msg_delete, AndroidUtilities.dp(54)); - listAdapter = new ListAdapter(context, MessagesController.getInstance(currentAccount).filterPremiumStickers(MediaDataController.getInstance(currentAccount).getStickerSets(currentType)), MediaDataController.getInstance(currentAccount).getFeaturedStickerSets()); + ArrayList sets = new ArrayList<>(MessagesController.getInstance(currentAccount).filterPremiumStickers(MediaDataController.getInstance(currentAccount).getStickerSets(currentType))); + List featured = getFeaturedSets(); + listAdapter = new ListAdapter(context, sets, featured); fragmentView = new FrameLayout(context); FrameLayout frameLayout = (FrameLayout) fragmentView; @@ -259,6 +302,10 @@ public class StickersActivity extends BaseFragment implements NotificationCenter listView = new RecyclerListView(context); listView.setFocusable(true); listView.setTag(7); + DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); + itemAnimator.setMoveDuration(350); + itemAnimator.setMoveInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + listView.setItemAnimator(itemAnimator); layoutManager = new LinearLayoutManager(context) { @Override public boolean supportsPredictiveItemAnimations() { @@ -285,21 +332,45 @@ public class StickersActivity extends BaseFragment implements NotificationCenter TLRPC.TL_inputStickerSetID inputStickerSetID = new TLRPC.TL_inputStickerSetID(); inputStickerSetID.id = setCovered.set.id; inputStickerSetID.access_hash = setCovered.set.access_hash; - showDialog(new StickersAlert(getParentActivity(), StickersActivity.this, inputStickerSetID, null, null)); + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + ArrayList inputStickerSets = new ArrayList<>(1); + inputStickerSets.add(inputStickerSetID); + showDialog(new EmojiPacksAlert(StickersActivity.this, getParentActivity(), getResourceProvider(), inputStickerSets)); + } else { + showDialog(new StickersAlert(getParentActivity(), StickersActivity.this, inputStickerSetID, null, null)); + } } else if (position == featuredStickersShowMoreRow) { - TrendingStickersLayout.Delegate trendingDelegate = new TrendingStickersLayout.Delegate() { - @Override - public void onStickerSetAdd(TLRPC.StickerSetCovered stickerSet, boolean primary) { - MediaDataController.getInstance(currentAccount).toggleStickerSet(getParentActivity(), stickerSet, 2, StickersActivity.this, false, false); + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + ArrayList inputStickerSets = new ArrayList<>(); + List featuredStickerSets = getFeaturedSets(); + if (featuredStickerSets != null) { + for (int i = 0; featuredStickerSets != null && i < featuredStickerSets.size(); ++i) { + TLRPC.StickerSetCovered set = featuredStickerSets.get(i); + if (set != null && set.set != null) { + TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID(); + inputStickerSet.id = set.set.id; + inputStickerSet.access_hash = set.set.access_hash; + inputStickerSets.add(inputStickerSet); + } + } } + MediaDataController.getInstance(currentAccount).markFeaturedStickersAsRead(true, true); + showDialog(new EmojiPacksAlert(StickersActivity.this, getParentActivity(), getResourceProvider(), inputStickerSets)); + } else { + TrendingStickersLayout.Delegate trendingDelegate = new TrendingStickersLayout.Delegate() { + @Override + public void onStickerSetAdd(TLRPC.StickerSetCovered stickerSet, boolean primary) { + MediaDataController.getInstance(currentAccount).toggleStickerSet(getParentActivity(), stickerSet, 2, StickersActivity.this, false, false); + } - @Override - public void onStickerSetRemove(TLRPC.StickerSetCovered stickerSet) { - MediaDataController.getInstance(currentAccount).toggleStickerSet(getParentActivity(), stickerSet, 0, StickersActivity.this, false, false); - } - }; - trendingStickersAlert = new TrendingStickersAlert(context, this, new TrendingStickersLayout(context, trendingDelegate), null); - trendingStickersAlert.show(); + @Override + public void onStickerSetRemove(TLRPC.StickerSetCovered stickerSet) { + MediaDataController.getInstance(currentAccount).toggleStickerSet(getParentActivity(), stickerSet, 0, StickersActivity.this, false, false); + } + }; + trendingStickersAlert = new TrendingStickersAlert(context, this, new TrendingStickersLayout(context, trendingDelegate), null); + trendingStickersAlert.show(); + } } else if (position >= stickersStartRow && position < stickersEndRow && getParentActivity() != null) { if (!listAdapter.hasSelected()) { TLRPC.TL_messages_stickerSet stickerSet = listAdapter.stickerSets.get(position - stickersStartRow); @@ -307,7 +378,16 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (stickers == null || stickers.isEmpty()) { return; } - showDialog(new StickersAlert(getParentActivity(), StickersActivity.this, null, stickerSet, null)); + if (stickerSet.set != null && stickerSet.set.emojis) { + ArrayList inputs = new ArrayList<>(); + TLRPC.TL_inputStickerSetID inputId = new TLRPC.TL_inputStickerSetID(); + inputId.id = stickerSet.set.id; + inputId.access_hash = stickerSet.set.access_hash; + inputs.add(inputId); + showDialog(new EmojiPacksAlert(StickersActivity.this, getParentActivity(), getResourceProvider(), inputs)); + } else { + showDialog(new StickersAlert(getParentActivity(), StickersActivity.this, null, stickerSet, null)); + } } else { listAdapter.toggleSelected(position); } @@ -315,6 +395,8 @@ public class StickersActivity extends BaseFragment implements NotificationCenter presentFragment(new ArchivedStickersActivity(currentType)); } else if (position == masksRow) { presentFragment(new StickersActivity(MediaDataController.TYPE_MASK)); + } else if (position == emojiPacksRow) { + presentFragment(new StickersActivity(MediaDataController.TYPE_EMOJIPACKS)); } else if (position == suggestRow) { if (getParentActivity() == null) { return; @@ -352,6 +434,9 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } else if (position == largeEmojiRow) { SharedConfig.toggleBigEmoji(); ((TextCheckCell) view).setChecked(SharedConfig.allowBigEmoji); + } else if (position == suggestAnimatedEmojiRow) { + SharedConfig.toggleSuggestAnimatedEmoji(); + ((TextCheckCell) view).setChecked(SharedConfig.suggestAnimatedEmoji); } else if (position == reactionsDoubleTapRow) { presentFragment(new ReactionsDoubleTapManageActivity()); } @@ -388,12 +473,14 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } else if (currentType == MediaDataController.TYPE_IMAGE && type == MediaDataController.TYPE_MASK) { listAdapter.notifyItemChanged(masksRow); } - } else if (id == NotificationCenter.featuredStickersDidLoad) { + } else if (id == NotificationCenter.featuredStickersDidLoad || id == NotificationCenter.featuredEmojiDidLoad) { updateRows(); } else if (id == NotificationCenter.archivedStickersCountDidLoad) { if ((Integer) args[0] == currentType) { updateRows(); } + } else if (id == NotificationCenter.currentUserPremiumStatusChanged) { + } } @@ -406,6 +493,7 @@ public class StickersActivity extends BaseFragment implements NotificationCenter activeReorderingRequests++; TLRPC.TL_messages_reorderStickerSets req = new TLRPC.TL_messages_reorderStickerSets(); req.masks = currentType == MediaDataController.TYPE_MASK; + req.emojis = currentType == MediaDataController.TYPE_EMOJIPACKS; for (int a = 0; a < listAdapter.stickerSets.size(); a++) { req.order.add(listAdapter.stickerSets.get(a).set.id); } @@ -415,19 +503,41 @@ public class StickersActivity extends BaseFragment implements NotificationCenter private void updateRows() { MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); - List newList = MessagesController.getInstance(currentAccount).filterPremiumStickers(mediaDataController.getStickerSets(currentType)); + List newList = new ArrayList<>(MessagesController.getInstance(currentAccount).filterPremiumStickers(mediaDataController.getStickerSets(currentType))); boolean truncatedFeaturedStickers = false; - List featuredStickerSets = mediaDataController.getFeaturedStickerSets(); + List featuredStickerSets = getFeaturedSets(); if (featuredStickerSets.size() > 3) { featuredStickerSets = featuredStickerSets.subList(0, 3); truncatedFeaturedStickers = true; } - List featuredStickersList = featuredStickerSets; - + List featuredStickersList = new ArrayList<>(featuredStickerSets); DiffUtil.DiffResult diffResult = null; DiffUtil.DiffResult featuredDiffResult = null; + boolean hasUsefulPacks = false; + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + if (UserConfig.getInstance(currentAccount).isPremium()) { + hasUsefulPacks = true; + } + if (!hasUsefulPacks) { + for (int i = 0; i < newList.size(); ++i) { + if (!MessageObject.isPremiumEmojiPack(newList.get(i))) { + hasUsefulPacks = true; + break; + } + } + } + if (!hasUsefulPacks) { + for (int i = 0; i < featuredStickerSets.size(); ++i) { + if (!MessageObject.isPremiumEmojiPack(featuredStickerSets.get(i))) { + hasUsefulPacks = true; + break; + } + } + } + } + if (listAdapter != null) { if (!isPaused) { diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() { @@ -500,13 +610,23 @@ public class StickersActivity extends BaseFragment implements NotificationCenter loopInfoRow = -1; } - if (currentType == MediaDataController.TYPE_IMAGE) { - masksRow = rowCount++; + if (currentType == MediaDataController.TYPE_EMOJIPACKS && hasUsefulPacks) { + suggestAnimatedEmojiRow = rowCount++; + suggestAnimatedEmojiInfoRow = rowCount++; } else { - masksRow = -1; + suggestAnimatedEmojiRow = -1; + suggestAnimatedEmojiInfoRow = -1; } - if (mediaDataController.getArchivedStickersCount(currentType) != 0) { + if (currentType == MediaDataController.TYPE_IMAGE) { + masksRow = rowCount++; + emojiPacksRow = rowCount++; + } else { + masksRow = -1; + emojiPacksRow = -1; + } + + if (mediaDataController.getArchivedStickersCount(currentType) != 0 && currentType != MediaDataController.TYPE_EMOJIPACKS) { boolean inserted = archivedRow == -1; archivedRow = rowCount++; @@ -529,13 +649,21 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (currentType == MediaDataController.TYPE_IMAGE) { reactionsDoubleTapRow = rowCount++; - stickersBotInfo = rowCount++; } else { reactionsDoubleTapRow = -1; - stickersBotInfo = -1; } - if (!featuredStickersList.isEmpty() && currentType == MediaDataController.TYPE_IMAGE) { + stickersBotInfo = -1; + if (currentType == MediaDataController.TYPE_IMAGE) { + stickersBotInfo = rowCount++; + } + + featuredStickersHeaderRow = -1; + featuredStickersStartRow = -1; + featuredStickersEndRow = -1; + featuredStickersShowMoreRow = -1; + featuredStickersShadowRow = -1; + if (!featuredStickersList.isEmpty() && (currentType == MediaDataController.TYPE_IMAGE)) { featuredStickersHeaderRow = rowCount++; featuredStickersStartRow = rowCount; rowCount += featuredStickersList.size(); @@ -543,21 +671,13 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (truncatedFeaturedStickers) { featuredStickersShowMoreRow = rowCount++; - } else { - featuredStickersShowMoreRow = -1; } featuredStickersShadowRow = rowCount++; - } else { - featuredStickersHeaderRow = -1; - featuredStickersStartRow = -1; - featuredStickersEndRow = -1; - featuredStickersShowMoreRow = -1; - featuredStickersShadowRow = -1; } int stickerSetsCount = newList.size(); if (stickerSetsCount > 0) { - if (featuredStickersHeaderRow != -1) { + if (currentType == MediaDataController.TYPE_EMOJIPACKS || !featuredStickersList.isEmpty() && currentType == MediaDataController.TYPE_IMAGE) { stickersHeaderRow = rowCount++; } else { stickersHeaderRow = -1; @@ -567,12 +687,15 @@ public class StickersActivity extends BaseFragment implements NotificationCenter rowCount += stickerSetsCount; stickersEndRow = rowCount; - if (currentType != MediaDataController.TYPE_MASK) { + if (currentType != MediaDataController.TYPE_MASK && currentType != MediaDataController.TYPE_EMOJIPACKS) { stickersShadowRow = rowCount++; masksInfoRow = -1; - } else { + } else if (currentType == MediaDataController.TYPE_MASK) { masksInfoRow = rowCount++; stickersShadowRow = -1; + } else { + stickersShadowRow = -1; + masksInfoRow = -1; } } else { stickersHeaderRow = -1; @@ -582,6 +705,25 @@ public class StickersActivity extends BaseFragment implements NotificationCenter masksInfoRow = -1; } + if (!featuredStickersList.isEmpty() && (currentType == MediaDataController.TYPE_EMOJIPACKS)) { + if (stickerSetsCount > 0) { + featuredStickersShadowRow = rowCount++; + } + + featuredStickersHeaderRow = rowCount++; + featuredStickersStartRow = rowCount; + rowCount += featuredStickersList.size(); + featuredStickersEndRow = rowCount; + + if (truncatedFeaturedStickers) { + featuredStickersShowMoreRow = rowCount++; + } + } + + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + stickersBotInfo = rowCount++; + } + if (listAdapter != null) { if (diffResult != null) { int startRow = stickersStartRow >= 0 ? stickersStartRow : rowCount; @@ -599,6 +741,9 @@ public class StickersActivity extends BaseFragment implements NotificationCenter @Override public void onMoved(int fromPosition, int toPosition) { + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + listAdapter.notifyItemMoved(startRow + fromPosition, startRow + toPosition); + } } @Override @@ -811,8 +956,9 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } } else if (which == 3) { try { + String link = String.format(Locale.US, "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/" + (stickerSet.set.emojis ? "addemoji" : "addstickers") + "/%s", stickerSet.set.short_name); android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", String.format(Locale.US, "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addstickers/%s", stickerSet.set.short_name)); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", link); clipboard.setPrimaryClip(clip); BulletinFactory.createCopyLinkBulletin(StickersActivity.this).show(); } catch (Exception e) { @@ -832,9 +978,9 @@ public class StickersActivity extends BaseFragment implements NotificationCenter case TYPE_HEADER: HeaderCell headerCell = (HeaderCell) holder.itemView; if (position == featuredStickersHeaderRow) { - headerCell.setText(LocaleController.getString(R.string.FeaturedStickers)); + headerCell.setText(LocaleController.getString(currentType == MediaDataController.TYPE_EMOJIPACKS ? R.string.FeaturedEmojiPacks : R.string.FeaturedStickers)); } else if (position == stickersHeaderRow) { - headerCell.setText(LocaleController.getString(R.string.ChooseStickerMyStickerSets)); + headerCell.setText(LocaleController.getString(currentType == MediaDataController.TYPE_EMOJIPACKS ? R.string.ChooseStickerMyEmojiPacks : R.string.ChooseStickerMyStickerSets)); } break; case TYPE_FEATURED_STICKER_SET: { @@ -868,14 +1014,44 @@ public class StickersActivity extends BaseFragment implements NotificationCenter case TYPE_STICKER_SET: StickerSetCell stickerSetCell = (StickerSetCell) holder.itemView; int row = position - stickersStartRow; - stickerSetCell.setStickersSet(stickerSets.get(row), row != stickerSets.size() - 1); + TLRPC.TL_messages_stickerSet set = stickerSets.get(row); + boolean sameSet = (stickerSetCell.getStickersSet() == null && set == null) || (stickerSetCell.getStickersSet() != null && set != null && stickerSetCell.getStickersSet().set.id == set.set.id); + stickerSetCell.setStickersSet(set, row != stickerSets.size() - 1); stickerSetCell.setChecked(selectedItems.get(getItemId(position), false), false); stickerSetCell.setReorderable(hasSelected(), false); + if (set != null && set.set != null && set.set.emojis) { + boolean installed = getMediaDataController().isStickerPackInstalled(set.set.id); + boolean unlock = !UserConfig.getInstance(currentAccount).isPremium(); + if (unlock) { + boolean premium = false; + for (int i = 0; i < set.documents.size(); ++i) { + if (!MessageObject.isFreeEmoji(set.documents.get(i))) { + premium = true; + break; + } + } + if (!premium) { + unlock = false; + } + } + stickerSetCell.updateButtonState( + unlock ? ( + installed && !set.set.official ? StickerSetCell.BUTTON_STATE_LOCKED_RESTORE : StickerSetCell.BUTTON_STATE_LOCKED + ) : ( + installed ? StickerSetCell.BUTTON_STATE_REMOVE : StickerSetCell.BUTTON_STATE_ADD + ), + sameSet + ); + } break; case TYPE_INFO: TextInfoPrivacyCell infoPrivacyCell = (TextInfoPrivacyCell) holder.itemView; if (position == stickersBotInfo) { - infoPrivacyCell.setText(addStickersBotSpan(LocaleController.getString("StickersBotInfo", R.string.StickersBotInfo))); + infoPrivacyCell.setText(addStickersBotSpan( + currentType == MediaDataController.TYPE_EMOJIPACKS ? + LocaleController.getString("EmojiBotInfo", R.string.EmojiBotInfo) : + LocaleController.getString("StickersBotInfo", R.string.StickersBotInfo) + )); } else if (position == archivedInfoRow) { if (currentType == MediaDataController.TYPE_IMAGE) { infoPrivacyCell.setText(LocaleController.getString("ArchivedStickersInfo", R.string.ArchivedStickersInfo)); @@ -884,6 +1060,8 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } } else if (position == loopInfoRow) { infoPrivacyCell.setText(LocaleController.getString("LoopAnimatedStickersInfo", R.string.LoopAnimatedStickersInfo)); + } else if (position == suggestAnimatedEmojiInfoRow) { + infoPrivacyCell.setText(LocaleController.getString("SuggestAnimatedEmojiInfo", R.string.SuggestAnimatedEmojiInfo)); } else if (position == masksInfoRow) { infoPrivacyCell.setText(LocaleController.getString("MasksInfo", R.string.MasksInfo)); } @@ -892,14 +1070,21 @@ public class StickersActivity extends BaseFragment implements NotificationCenter TextCell settingsCell = (TextCell) holder.itemView; if (position == featuredStickersShowMoreRow) { settingsCell.setColors(Theme.key_windowBackgroundWhiteBlueText4, Theme.key_windowBackgroundWhiteBlueText4); - settingsCell.setTextAndIcon(LocaleController.getString(R.string.ShowMoreStickers), R.drawable.msg_trending, false); + if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + settingsCell.setTextAndIcon(LocaleController.getString(R.string.ShowMoreEmojiPacks), R.drawable.msg_trending, false); + } else { + settingsCell.setTextAndIcon(LocaleController.getString(R.string.ShowMoreStickers), R.drawable.msg_trending, false); + } } else { + settingsCell.imageView.setTranslationX(0); settingsCell.setColors(Theme.key_windowBackgroundWhiteGrayIcon, Theme.key_windowBackgroundWhiteBlackText); if (position == archivedRow) { int count = MediaDataController.getInstance(currentAccount).getArchivedStickersCount(currentType); String value = count > 0 ? Integer.toString(count) : ""; if (currentType == MediaDataController.TYPE_IMAGE) { settingsCell.setTextAndValueAndIcon(LocaleController.getString(R.string.ArchivedStickers), value, R.drawable.msg_archived_stickers, true); + } else if (currentType == MediaDataController.TYPE_EMOJIPACKS) { + settingsCell.setTextAndValue(LocaleController.getString("ArchivedEmojiPacks", R.string.ArchivedEmojiPacks), value, true); } else { settingsCell.setTextAndValue(LocaleController.getString("ArchivedMasks", R.string.ArchivedMasks), value, true); } @@ -908,6 +1093,12 @@ public class StickersActivity extends BaseFragment implements NotificationCenter MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); int count = MessagesController.getInstance(currentAccount).filterPremiumStickers(mediaDataController.getStickerSets(type)).size() + mediaDataController.getArchivedStickersCount(type); settingsCell.setTextAndValueAndIcon(LocaleController.getString("Masks", R.string.Masks), count > 0 ? Integer.toString(count) : "", R.drawable.msg_mask, true); + } else if (position == emojiPacksRow) { + int type = MediaDataController.TYPE_EMOJIPACKS; + MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + int count = mediaDataController.getStickerSets(type).size(); + settingsCell.imageView.setTranslationX(-AndroidUtilities.dp(2)); + settingsCell.setTextAndValueAndIcon(LocaleController.getString("Emoji", R.string.Emoji), count > 0 ? Integer.toString(count) : "", R.drawable.input_smile, true); } else if (position == suggestRow) { String value; switch (SharedConfig.suggestStickers) { @@ -935,14 +1126,16 @@ public class StickersActivity extends BaseFragment implements NotificationCenter case TYPE_SWITCH: TextCheckCell cell = (TextCheckCell) holder.itemView; if (position == loopRow) { - cell.setTextAndCheck(LocaleController.getString(R.string.LoopAnimatedStickers), SharedConfig.loopStickers, true); + cell.setTextAndCheck(LocaleController.getString("LoopAnimatedStickers", R.string.LoopAnimatedStickers), SharedConfig.loopStickers, true); } else if (position == largeEmojiRow) { - cell.setTextAndCheck(LocaleController.getString(R.string.LargeEmoji), SharedConfig.allowBigEmoji, true); + cell.setTextAndCheck(LocaleController.getString("LargeEmoji", R.string.LargeEmoji), SharedConfig.allowBigEmoji, true); + } else if (position == suggestAnimatedEmojiRow) { + cell.setTextAndCheck(LocaleController.getString("SuggestAnimatedEmoji", R.string.SuggestAnimatedEmoji), SharedConfig.suggestAnimatedEmoji, false); } break; case TYPE_DOUBLE_TAP_REACTIONS: { TextSettingsCell settingsCell = (TextSettingsCell) holder.itemView; - settingsCell.setText(LocaleController.getString(R.string.DoubleTapSetting), false); + settingsCell.setText(LocaleController.getString("DoubleTapSetting", R.string.DoubleTapSetting), false); settingsCell.setIcon(R.drawable.msg_reactions2); String reaction = MediaDataController.getInstance(currentAccount).getDoubleTapReaction(); if (reaction != null) { @@ -1004,12 +1197,52 @@ public class StickersActivity extends BaseFragment implements NotificationCenter View view; switch (viewType) { case TYPE_FEATURED_STICKER_SET: - view = new FeaturedStickerSetCell2(mContext, getResourceProvider()); + view = new FeaturedStickerSetCell2(mContext, getResourceProvider()) { + @Override + protected void onPremiumButtonClick() { + showDialog(new PremiumFeatureBottomSheet(StickersActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false)); + } + }; view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); ((FeaturedStickerSetCell2) view).getTextView().setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); break; case TYPE_STICKER_SET: - view = new StickerSetCell(mContext, 1); + view = new StickerSetCell(mContext, 1) { + @Override + protected void onPremiumButtonClick() { + showDialog(new PremiumFeatureBottomSheet(StickersActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_EMOJI, false)); + } + + @Override + protected void onAddButtonClick() { + TLRPC.TL_messages_stickerSet set = getStickersSet(); + if (set == null || set.set == null) { + return; + } + ArrayList featured = getMediaDataController().getFeaturedEmojiSets(); + TLRPC.StickerSetCovered covered = null; + for (int i = 0; i < featured.size(); ++i) { + if (set.set.id == featured.get(i).set.id) { + covered = featured.get(i); + break; + } + } + if (covered != null) { + if (loadingFeaturedStickerSets.contains(covered.set.id)) { + return; + } + loadingFeaturedStickerSets.add(covered.set.id); + } +// updateButtonState(BUTTON_STATE_REMOVE, true); + MediaDataController.getInstance(currentAccount).toggleStickerSet(getParentActivity(), covered == null ? set : covered, 2, StickersActivity.this, false, false); + } + + @Override + protected void onRemoveButtonClick() { +// updateButtonState(BUTTON_STATE_ADD, true); + MediaDataController.getInstance(currentAccount).toggleStickerSet(getParentActivity(), getStickersSet(), 0, StickersActivity.this, false, true); + } + }; view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); StickerSetCell stickerSetCell = (StickerSetCell) view; stickerSetCell.setOnReorderButtonTouchListener((v, event) -> { @@ -1095,13 +1328,13 @@ public class StickersActivity extends BaseFragment implements NotificationCenter return TYPE_FEATURED_STICKER_SET; } else if (i >= stickersStartRow && i < stickersEndRow) { return TYPE_STICKER_SET; - } else if (i == stickersBotInfo || i == archivedInfoRow || i == loopInfoRow || i == masksInfoRow) { + } else if (i == stickersBotInfo || i == archivedInfoRow || i == loopInfoRow || i == suggestAnimatedEmojiInfoRow || i == masksInfoRow) { return TYPE_INFO; - } else if (i == archivedRow || i == masksRow || i == suggestRow || i == featuredStickersShowMoreRow) { + } else if (i == archivedRow || i == masksRow || i == emojiPacksRow || i == suggestRow || i == featuredStickersShowMoreRow) { return TYPE_TEXT_AND_VALUE; } else if (i == stickersShadowRow || i == featuredStickersShadowRow) { return TYPE_SHADOW; - } else if (i == loopRow || i == largeEmojiRow) { + } else if (i == loopRow || i == largeEmojiRow || i == suggestAnimatedEmojiRow) { return TYPE_SWITCH; } else if (i == reactionsDoubleTapRow) { return TYPE_DOUBLE_TAP_REACTIONS; @@ -1174,7 +1407,7 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (!actionModeShowed) { actionBar.showActionMode(); notifyStickersItemsChanged(UPDATE_REORDERABLE); - if (!SharedConfig.stickersReorderingHintUsed) { + if (!SharedConfig.stickersReorderingHintUsed && currentType != MediaDataController.TYPE_EMOJIPACKS) { SharedConfig.setStickersReorderingHintUsed(true); String stickersReorderHint = LocaleController.getString("StickersReorderHint", R.string.StickersReorderHint); Bulletin.make(parentLayout, new ReorderingBulletinLayout(mContext, stickersReorderHint, null), ReorderingHintDrawable.DURATION * 2 + 250).show(); @@ -1190,11 +1423,9 @@ public class StickersActivity extends BaseFragment implements NotificationCenter if (hasSelected()) { boolean canDelete = true; for (int i = 0, size = stickerSets.size(); i < size; i++) { - if (selectedItems.get(stickerSets.get(i).set.id, false)) { - if (stickerSets.get(i).set.official) { - canDelete = false; - break; - } + if (selectedItems.get(stickerSets.get(i).set.id, false) && stickerSets.get(i).set.official && !stickerSets.get(i).set.emojis) { + canDelete = false; + break; } } int visibility = canDelete ? View.VISIBLE : View.GONE; @@ -1232,8 +1463,63 @@ public class StickersActivity extends BaseFragment implements NotificationCenter } } + private void checkPack(TLRPC.TL_messages_stickerSet set) { + if (set == null) { + return; + } + if (emojiPacks == null) { + emojiPacks = new ArrayList<>(); + emojiPacks.add(set); + return; + } + boolean found = false; + for (int i = 0; i < emojiPacks.size(); ++i) { + if (emojiPacks.get(i).set.id == set.set.id) { + found = true; + break; + } + } + if (!found) { + emojiPacks.add(set); + } + } + private void checkPack(TLRPC.StickerSetCovered covered) { + if (covered == null) { + return; + } + if (emojiPacks == null) { + emojiPacks = new ArrayList<>(); + emojiPacks.add(convertFeatured(covered)); + return; + } + boolean found = false; + for (int i = 0; i < emojiPacks.size(); ++i) { + if (emojiPacks.get(i).set.id == covered.set.id) { + found = true; + break; + } + } + if (!found) { + emojiPacks.add(convertFeatured(covered)); + } + } + private TLRPC.TL_messages_stickerSet convertFeatured(TLRPC.StickerSetCovered covered) { + if (covered == null) { + return null; + } + TLRPC.TL_messages_stickerSet stickerSet = new TLRPC.TL_messages_stickerSet(); + stickerSet.set = covered.set; + if (covered instanceof TLRPC.TL_stickerSetFullCovered) { + stickerSet.documents = ((TLRPC.TL_stickerSetFullCovered) covered).documents; + stickerSet.packs = ((TLRPC.TL_stickerSetFullCovered) covered).packs; + } else { + stickerSet.documents = covered.covers; + } + return stickerSet; + } + private String getLinkForSet(TLRPC.TL_messages_stickerSet stickerSet) { - return String.format(Locale.US, "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/addstickers/%s", stickerSet.set.short_name); + return String.format(Locale.US, "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/" + (stickerSet.set.emojis ? "addemoji" : "addstickers") + "/%s", stickerSet.set.short_name); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java b/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java index 443c19f78..2a97ac817 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TextMessageEnterTransition.java @@ -37,6 +37,7 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.ChatMessageCell; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.ChatActivityEnterView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EmptyStubSpan; @@ -111,7 +112,7 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain public TextMessageEnterTransition(ChatMessageCell messageView, ChatActivity chatActivity, RecyclerListView listView, MessageEnterTransitionContainer container, Theme.ResourcesProvider resourcesProvider) { this.resourcesProvider = resourcesProvider; currentAccount = UserConfig.selectedAccount; - if (messageView.getMessageObject().textLayoutBlocks.size() > 1 || messageView.getMessageObject().textLayoutBlocks.isEmpty() || messageView.getMessageObject().textLayoutBlocks.get(0).textLayout.getLineCount() > 10) { + if (messageView.getMessageObject().textLayoutBlocks == null || messageView.getMessageObject().textLayoutBlocks.size() > 1 || messageView.getMessageObject().textLayoutBlocks.isEmpty() || messageView.getMessageObject().textLayoutBlocks.get(0).textLayout.getLineCount() > 10) { return; } this.messageView = messageView; @@ -144,15 +145,33 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain TextPaint textPaint = Theme.chat_msgTextPaint; int emojiSize = AndroidUtilities.dp(20); if (messageView.getMessageObject().getEmojiOnlyCount() != 0) { - if (messageView.getMessageObject().getEmojiOnlyCount() == 1) { - textPaint = Theme.chat_msgTextPaintOneEmoji; - emojiSize = AndroidUtilities.dp(32); - } else if (messageView.getMessageObject().getEmojiOnlyCount() == 2) { - textPaint = Theme.chat_msgTextPaintTwoEmoji; - emojiSize = AndroidUtilities.dp(28); - } else if (messageView.getMessageObject().getEmojiOnlyCount() == 3) { - textPaint = Theme.chat_msgTextPaintThreeEmoji; - emojiSize = AndroidUtilities.dp(24); + switch (messageView.getMessageObject().getEmojiOnlyCount()) { + case 0: + case 1: + case 2: + textPaint = Theme.chat_msgTextPaintEmoji[0]; + break; + case 3: + textPaint = Theme.chat_msgTextPaintEmoji[1]; + break; + case 4: + textPaint = Theme.chat_msgTextPaintEmoji[2]; + break; + case 5: + textPaint = Theme.chat_msgTextPaintEmoji[3]; + break; + case 6: + textPaint = Theme.chat_msgTextPaintEmoji[4]; + break; + case 7: + case 8: + case 9: + default: + textPaint = Theme.chat_msgTextPaintEmoji[5]; + break; + } + if (textPaint != null) { + emojiSize = (int) (textPaint.getTextSize() + AndroidUtilities.dp(4)); } } boolean containsSpans = false; @@ -168,14 +187,13 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain } if (editText.length() != text.length() || containsSpans) { crossfade = true; - String str = editText.toString(); - String trimmedStr = str.trim(); - int i = str.indexOf(trimmedStr); - if (i > 0) { - linesOffset = chatActivityEnterView.getEditField().getLayout().getLineTop(chatActivityEnterView.getEditField().getLayout().getLineForOffset(i)); - layoutH = chatActivityEnterView.getEditField().getLayout().getLineBottom(chatActivityEnterView.getEditField().getLayout().getLineForOffset(i + trimmedStr.length())) - linesOffset; + int[] newStart = new int[1]; + CharSequence trimmedStr = AndroidUtilities.trim(editText, newStart); + if (newStart[0] > 0) { + linesOffset = chatActivityEnterView.getEditField().getLayout().getLineTop(chatActivityEnterView.getEditField().getLayout().getLineForOffset(newStart[0])); + layoutH = chatActivityEnterView.getEditField().getLayout().getLineBottom(chatActivityEnterView.getEditField().getLayout().getLineForOffset(newStart[0] + trimmedStr.length())) - linesOffset; } - text = Emoji.replaceEmoji(trimmedStr, textPaint.getFontMetricsInt(), emojiSize, false); + text = Emoji.replaceEmoji(editText, textPaint.getFontMetricsInt(), emojiSize, false); } @@ -397,7 +415,11 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain initBitmaps = true; Canvas bitmapCanvas = new Canvas(crossfadeTextBitmap); bitmapCanvas.translate(0, crossfadeTextOffset); + if (messageView.animatedEmojiStack != null) { + messageView.animatedEmojiStack.clearPositions(); + } messageView.drawMessageText(bitmapCanvas, messageView.getMessageObject().textLayoutBlocks, true, 1f, true); + messageView.drawAnimatedEmojis(bitmapCanvas, 1f); } float listViewBottom = listView.getY() - container.getY() + listView.getMeasuredHeight(); @@ -446,7 +468,11 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain float drawableH = messageView.getBackgroundDrawableBottom() - messageView.getBackgroundDrawableTop(); float drawableBottom = (drawableFromBottom - container.getY()) * (1f - progress) + (drawableToTop + drawableH) * progress; int drawableRight = (int) (messageViewX + messageView.getBackgroundDrawableRight() + AndroidUtilities.dp(4) * (1f - progressX)); - Theme.MessageDrawable drawable = messageView.getCurrentBackgroundDrawable(true); + Theme.MessageDrawable drawable = null; + if (!currentMessageObject.isAnimatedEmojiStickers()) { + drawable = messageView.getCurrentBackgroundDrawable(true); + } + if (drawable != null) { messageView.setBackgroundTopY(container.getTop() - listView.getTop()); @@ -474,16 +500,18 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain canvas.restore(); canvas.save(); - if (currentMessageObject.isOutOwner()) { - canvas.clipRect( - drawableX + AndroidUtilities.dp(4), drawableTop + AndroidUtilities.dp(4), - drawableRight - AndroidUtilities.dp(10), drawableBottom - AndroidUtilities.dp(4) - ); - } else { - canvas.clipRect( - drawableX + AndroidUtilities.dp(4), drawableTop + AndroidUtilities.dp(4), - drawableRight - AndroidUtilities.dp(4), drawableBottom - AndroidUtilities.dp(4) - ); + if (drawable != null) { + if (currentMessageObject.isOutOwner()) { + canvas.clipRect( + drawableX + AndroidUtilities.dp(4), drawableTop + AndroidUtilities.dp(4), + drawableRight - AndroidUtilities.dp(10), drawableBottom - AndroidUtilities.dp(4) + ); + } else { + canvas.clipRect( + drawableX + AndroidUtilities.dp(4), drawableTop + AndroidUtilities.dp(4), + drawableRight - AndroidUtilities.dp(4), drawableBottom - AndroidUtilities.dp(4) + ); + } } canvas.translate(messageView.getLeft() + listView.getX() - container.getX(), messageViewY + (fromY - toY) * (1f - progress)); messageView.drawTime(canvas, alphaProgress, false); @@ -563,6 +591,7 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain canvas.save(); SpoilerEffect.clipOutCanvas(canvas, messageView.replySpoilers); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageView.replyTextLayout, messageView.animatedEmojiReplyStack, 0, messageView.replySpoilers, 0, 0, 0, 1f); messageView.replyTextLayout.draw(canvas); canvas.restore(); @@ -598,7 +627,7 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain bitmapPaint.setAlpha((int) (255 * (1f - alphaProgress))); } canvas.drawBitmap(textLayoutBitmap, 0, 0, bitmapPaint); - } else { + } else if (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_EMOJIS) { if (crossfade && changeColor) { int oldColor = layout.getPaint().getColor(); int oldAlpha = Color.alpha(oldColor); @@ -657,6 +686,7 @@ public class TextMessageEnterTransition implements MessageEnterTransitionContain int oldColor = Theme.chat_msgTextPaint.getColor(); Theme.chat_msgTextPaint.setColor(toColor); messageView.drawMessageText(canvas, messageView.getMessageObject().textLayoutBlocks, false, alphaProgress, true); + messageView.drawAnimatedEmojis(canvas, alphaProgress); if (Theme.chat_msgTextPaint.getColor() != oldColor) { Theme.chat_msgTextPaint.setColor(oldColor); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java index 3dfb80bcc..da63fc25f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java @@ -48,7 +48,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.BuildConfig; +import org.telegram.messenger.BuildVars; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; @@ -1712,7 +1712,7 @@ public class ThemeActivity extends BaseFragment implements NotificationCenter.No intent.setType("text/xml"); if (Build.VERSION.SDK_INT >= 24) { try { - intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", finalFile)); + intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), ApplicationLoader.getApplicationId() + ".provider", finalFile)); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (Exception ignore) { intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(finalFile)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VoiceMessageEnterTransition.java b/TMessagesProj/src/main/java/org/telegram/ui/VoiceMessageEnterTransition.java index f8802c7b6..55329f38a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VoiceMessageEnterTransition.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VoiceMessageEnterTransition.java @@ -131,10 +131,11 @@ public class VoiceMessageEnterTransition implements MessageEnterTransitionContai int clipBottom = 0; if (container.getMeasuredHeight() > 0) { clipBottom = (int) (container.getMeasuredHeight() * (1f - progress) + listViewBottom * progress); - canvas.saveLayerAlpha(0, container.getMeasuredHeight() - AndroidUtilities.dp(400), container.getMeasuredWidth(), container.getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG); - } else { - canvas.save(); } +// canvas.saveLayerAlpha(0, container.getMeasuredHeight() - AndroidUtilities.dp(400), container.getMeasuredWidth(), container.getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG); +// } else { +// canvas.save(); +// } circlePaint.setColor(ColorUtils.blendARGB(getThemedColor(Theme.key_chat_messagePanelVoiceBackground), getThemedColor(messageView.getRadialProgress().getCircleColorKey()), progress)); @@ -158,11 +159,11 @@ public class VoiceMessageEnterTransition implements MessageEnterTransitionContai if (container.getMeasuredHeight() > 0) { gradientMatrix.setTranslate(0, clipBottom); gradientShader.setLocalMatrix(gradientMatrix); - canvas.drawRect(0, clipBottom, container.getMeasuredWidth(), container.getMeasuredHeight(), gradientPaint); +// canvas.drawRect(0, clipBottom, container.getMeasuredWidth(), container.getMeasuredHeight(), gradientPaint); } //restore clipRect - canvas.restore(); +// canvas.restore(); recordCircle.drawIcon(canvas, (int) fromCx, (int) fromCy, 1f - moveProgress); } diff --git a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_faves.png b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_faves.png index 7ff44f700..ad0473042 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_faves.png and b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_faves.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new1.png b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new1.png index 5fece5fe5..2351d3c95 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new1.png and b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new1.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new2.png b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new2.png index f9d795ca4..ae7e1a1b8 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new2.png and b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new2.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new3.png b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new3.png index 92da677dd..ea2dede32 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new3.png and b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_new3.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_premium.png b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_premium.png index 8aa3f1c3d..14ad2f2d3 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_premium.png and b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_recent.png b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_recent.png index 0447e14eb..a7cadd8af 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_recent.png and b/TMessagesProj/src/main/res/drawable-hdpi/emoji_tabs_recent.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_back.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_back.png index fe424468e..486f9c1a0 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_back.png and b/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_back.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_done.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_done.png index 8c81c1525..bff32c9fd 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_done.png and b/TMessagesProj/src/main/res/drawable-hdpi/ic_ab_done.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_close_white.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_close_white.png index a32831e3c..a9ee77fbd 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/ic_close_white.png and b/TMessagesProj/src/main/res/drawable-hdpi/ic_close_white.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_gift_premium.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_gift_premium.png new file mode 100644 index 000000000..bcfaf6ccb Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_gift_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_addemoji.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_addemoji.png new file mode 100644 index 000000000..b94a87135 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_addemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_lock2.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_lock2.png new file mode 100644 index 000000000..7779e7c66 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_lock2.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_lockedemoji.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_lockedemoji.png new file mode 100644 index 000000000..41eda9491 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_lockedemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_premium_emoji.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_premium_emoji.png new file mode 100644 index 000000000..9542895fb Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_premium_emoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/stickers_gifs_trending.png b/TMessagesProj/src/main/res/drawable-hdpi/stickers_gifs_trending.png index 28a05f077..d2351c1e5 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/stickers_gifs_trending.png and b/TMessagesProj/src/main/res/drawable-hdpi/stickers_gifs_trending.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_faves.png b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_faves.png index 177fcc62c..8ad401049 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_faves.png and b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_faves.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new1.png b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new1.png index 63ea2d397..4b150192a 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new1.png and b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new1.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new2.png b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new2.png index 01fb7cf11..62da1aeb4 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new2.png and b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new2.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new3.png b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new3.png index 8c8c95828..98c9d2aa1 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new3.png and b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_new3.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_premium.png b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_premium.png index 87d1b2f27..07f4a676e 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_premium.png and b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_recent.png b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_recent.png index 4aff9f827..d94c6a7f2 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_recent.png and b/TMessagesProj/src/main/res/drawable-mdpi/emoji_tabs_recent.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_back.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_back.png index 09040008e..afe6c4a90 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_back.png and b/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_back.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_done.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_done.png index a48c82663..a610f99b7 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_done.png and b/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_done.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_close_white.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_close_white.png index f60c6a09d..822896172 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/ic_close_white.png and b/TMessagesProj/src/main/res/drawable-mdpi/ic_close_white.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_gift_premium.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_gift_premium.png new file mode 100644 index 000000000..2a8a55403 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_gift_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_addemoji.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_addemoji.png new file mode 100644 index 000000000..95e1fddc9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_addemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_lock2.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_lock2.png new file mode 100644 index 000000000..029a8f805 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_lock2.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_lockedemoji.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_lockedemoji.png new file mode 100644 index 000000000..42bbc9d84 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_lockedemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_premium_emoji.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_premium_emoji.png new file mode 100644 index 000000000..f255eac51 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_premium_emoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/stickers_gifs_trending.png b/TMessagesProj/src/main/res/drawable-mdpi/stickers_gifs_trending.png index cbab2c29a..a8b5e0d85 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/stickers_gifs_trending.png and b/TMessagesProj/src/main/res/drawable-mdpi/stickers_gifs_trending.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_faves.png b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_faves.png index 47fdcb12f..bf480ecaa 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_faves.png and b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_faves.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new1.png b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new1.png index b7503d7b8..a87c46524 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new1.png and b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new1.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new2.png b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new2.png index e2fd9790a..e9f4acad4 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new2.png and b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new3.png b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new3.png index 9ec61fb92..e3b6b9bca 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new3.png and b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_new3.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_premium.png b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_premium.png index 039f764dc..9f5a35b44 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_premium.png and b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_recent.png b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_recent.png index 724058619..8b8c2de77 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_recent.png and b/TMessagesProj/src/main/res/drawable-xhdpi/emoji_tabs_recent.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_back.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_back.png index c8d4f06c4..c10c032fc 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_back.png and b/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_back.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_done.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_done.png index ae90ffdad..2e93a6b31 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_done.png and b/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_done.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_close_white.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_close_white.png index ae5541db1..f8fc317e1 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/ic_close_white.png and b/TMessagesProj/src/main/res/drawable-xhdpi/ic_close_white.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_gift_premium.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_gift_premium.png new file mode 100644 index 000000000..1bad6b991 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_gift_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_addemoji.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_addemoji.png new file mode 100644 index 000000000..85aabbd21 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_addemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_lock2.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_lock2.png new file mode 100644 index 000000000..78a9ddc21 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_lock2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_lockedemoji.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_lockedemoji.png new file mode 100644 index 000000000..c49dd6c63 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_lockedemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_premium_emoji.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_premium_emoji.png new file mode 100644 index 000000000..1faf03582 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_premium_emoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/stickers_gifs_trending.png b/TMessagesProj/src/main/res/drawable-xhdpi/stickers_gifs_trending.png index af10a20c4..ede4403c8 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/stickers_gifs_trending.png and b/TMessagesProj/src/main/res/drawable-xhdpi/stickers_gifs_trending.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_faves.png b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_faves.png index e0e5a1e82..4b56853df 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_faves.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_faves.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new1.png b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new1.png index 89caa4eb7..506f56bc1 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new1.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new1.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new2.png index a50fe92f0..cc1c8249c 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new2.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new3.png b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new3.png index 8d8e056f3..d4361f1e9 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new3.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_new3.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_premium.png b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_premium.png index 3f2acbf87..d089a85c3 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_premium.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_recent.png b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_recent.png index 7319fdfc0..d73fe846e 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_recent.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/emoji_tabs_recent.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_back.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_back.png index 298a4e7d0..d1b8a443e 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_back.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_back.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_done.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_done.png index a9bf7033d..06a606c1e 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_done.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_done.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_close_white.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_close_white.png index e970d1507..31189dec3 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_close_white.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_close_white.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_gift_premium.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_gift_premium.png new file mode 100644 index 000000000..0c9b0e4b2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_gift_premium.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_addemoji.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_addemoji.png new file mode 100644 index 000000000..5c7249770 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_addemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_lock2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_lock2.png new file mode 100644 index 000000000..4ba33bf24 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_lock2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_lockedemoji.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_lockedemoji.png new file mode 100644 index 000000000..b2f100933 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_lockedemoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_premium_emoji.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_premium_emoji.png new file mode 100644 index 000000000..46904ae18 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_premium_emoji.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/stickers_gifs_trending.png b/TMessagesProj/src/main/res/drawable-xxhdpi/stickers_gifs_trending.png index 1c6f1c65e..a0e3e946e 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/stickers_gifs_trending.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/stickers_gifs_trending.png differ diff --git a/TMessagesProj/src/main/res/raw/gif_to_keyboard.json b/TMessagesProj/src/main/res/raw/gif_to_keyboard.json new file mode 100644 index 000000000..ee0dff739 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/gif_to_keyboard.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"gif_to_keyboard","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"gif","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":6,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"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":[10,10,100]},{"t":10,"s":[5,5,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]],"o":[[0,0],[0,0]],"v":[[535,435],[615,435]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.523,0],[0,0]],"o":[[0,0],[0,-5.523],[0,0],[0,0]],"v":[[-50,95],[-50,-85],[-40,-95],[50,-95]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[585,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[445,335],[445,525]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-11.046],[0,0],[16.568,0],[0,0],[0,38.66],[0,0],[-35.438,0],[0,0],[-11.046,-14.109]],"o":[[0,0],[11.046,0],[0,0],[0,16.569],[0,0],[-38.66,0],[0,0],[0,-35.438],[0,0],[17.919,0],[0,0]],"v":[[23.333,5.588],[50,5.588],[70,25.588],[70,65],[40,95],[0,95],[-70,25],[-70,-30.833],[-5.833,-95],[18.278,-95],[64.167,-72.647]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[285,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 5","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-46.667,0],[-16.667,0]],"o":[[16.667,0],[46.667,0],[0,0]],"v":[[-80,7.5],[15,7.5],[110,7.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-15,117.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5],[-5,0]],"o":[[5,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5],[5,0]],"v":[[200,-60],[210,-70],[210,-110],[200,-120],[160,-120],[150,-110],[150,-70],[160,-60]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5,0],[-6.128,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5]],"o":[[5,0],[6.129,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5]],"v":[[-200,-60],[-160,-60],[-150,-70],[-150,-110],[-160,-120],[-200,-120],[-210,-110],[-210,-70]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,450],"to":[0,0],"ti":[0,5.333]},{"t":10,"s":[420,419.5]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[50,50]},{"t":10,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":12,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.2,0],[0,0],[0,-102.2],[0,0],[102.2,0],[0,0],[0,102.2],[0,0]],"o":[[0,0],[102.2,0],[0,0],[0,102.2],[0,0],[-102.2,0],[0,0],[0,-102.2]],"v":[[-170,-295],[170,-295],[355,-110],[355,110],[170,295],[-170,295],[-355,110],[-355,-110]],"c":true}]},{"t":10,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[-230,-245],[230,-245],[325,-150],[325,150],[230,245],[-230,245],[-325,150],[-325,-150]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/gif_to_smile.json b/TMessagesProj/src/main/res/raw/gif_to_smile.json new file mode 100644 index 000000000..e626ed453 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/gif_to_smile.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"gif_to_smile","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"gif","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":6,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[420,420,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"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]},{"t":10,"s":[50,50,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]],"o":[[0,0],[0,0]],"v":[[535,435],[615,435]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.523,0],[0,0]],"o":[[0,0],[0,-5.523],[0,0],[0,0]],"v":[[-50,95],[-50,-85],[-40,-95],[50,-95]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[585,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[445,335],[445,525]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-11.046],[0,0],[16.568,0],[0,0],[0,38.66],[0,0],[-35.438,0],[0,0],[-11.046,-14.109]],"o":[[0,0],[11.046,0],[0,0],[0,16.569],[0,0],[-38.66,0],[0,0],[0,-35.438],[0,0],[17.919,0],[0,0]],"v":[[23.333,5.588],[50,5.588],[70,25.588],[70,65],[40,95],[0,95],[-70,25],[-70,-30.833],[-5.833,-95],[18.278,-95],[64.167,-72.647]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[285,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 5","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 4","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":0.4},"o":{"x":0.6,"y":0.6},"t":0,"s":[420,420,0],"to":[0,0,0],"ti":[0,0,0]},{"t":10,"s":[420,420,0]}],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"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":[50,50,100]},{"t":10,"s":[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],[-53.333,0],[-33.333,46.667]],"o":[[33.333,46.667],[53.333,0],[0,0]],"v":[[-115,-37.5],[15,32.5],[145,-37.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[106.089,-10],[137.204,-30.002],[144.978,-60],[137.221,-89.97],[106.089,-110],[74.971,-89.994],[67.2,-60],[74.999,-29.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-106.111,-10],[-74.997,-30],[-67.222,-60],[-74.995,-89.997],[-106.111,-110],[-137.248,-89.961],[-145,-60],[-137.216,-29.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.2,0],[0,0],[0,-102.2],[0,0],[102.2,0],[0,0],[0,102.2],[0,0]],"o":[[0,0],[102.2,0],[0,0],[0,102.2],[0,0],[-102.2,0],[0,0],[0,-102.2]],"v":[[-170,-295],[170,-295],[355,-110],[355,110],[170,295],[-170,295],[-355,110],[-355,-110]],"c":true}]},{"t":10,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[-0.1,-315],[0.1,-315],[315,-0.1],[315,0.1],[0.1,315],[-0.1,315],[-315,0.1],[-315,-0.1]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/keyboard_to_gif.json b/TMessagesProj/src/main/res/raw/keyboard_to_gif.json new file mode 100644 index 000000000..8ba5505b6 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/keyboard_to_gif.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"keyboard_to_gif","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"gif","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"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":[5,5,100]},{"t":10,"s":[10,10,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]],"o":[[0,0],[0,0]],"v":[[535,435],[615,435]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.523,0],[0,0]],"o":[[0,0],[0,-5.523],[0,0],[0,0]],"v":[[-50,95],[-50,-85],[-40,-95],[50,-95]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[585,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[445,335],[445,525]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-11.046],[0,0],[16.568,0],[0,0],[0,38.66],[0,0],[-35.438,0],[0,0],[-11.046,-14.109]],"o":[[0,0],[11.046,0],[0,0],[0,16.569],[0,0],[-38.66,0],[0,0],[0,-35.438],[0,0],[17.919,0],[0,0]],"v":[[23.333,5.588],[50,5.588],[70,25.588],[70,65],[40,95],[0,95],[-70,25],[-70,-30.833],[-5.833,-95],[18.278,-95],[64.167,-72.647]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[285,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 5","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-46.667,0],[-16.667,0]],"o":[[16.667,0],[46.667,0],[0,0]],"v":[[-80,7.5],[15,7.5],[110,7.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-15,117.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5],[-5,0]],"o":[[5,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5],[5,0]],"v":[[200,-60],[210,-70],[210,-110],[200,-120],[160,-120],[150,-110],[150,-70],[160,-60]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5,0],[-6.128,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5]],"o":[[5,0],[6.129,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5]],"v":[[-200,-60],[-160,-60],[-150,-70],[-150,-110],[-160,-120],[-200,-120],[-210,-110],[-210,-70]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,419.5],"to":[0,-5.333],"ti":[0,0]},{"t":10,"s":[420,450]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[100,100]},{"t":10,"s":[50,50]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":6,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":12,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[-230,-245],[230,-245],[325,-150],[325,150],[230,245],[-230,245],[-325,150],[-325,-150]],"c":true}]},{"t":10,"s":[{"i":[[-102.2,0],[0,0],[0,-102.2],[0,0],[102.2,0],[0,0],[0,102.2],[0,0]],"o":[[0,0],[102.2,0],[0,0],[0,102.2],[0,0],[-102.2,0],[0,0],[0,-102.2]],"v":[[-170,-295],[170,-295],[355,-110],[355,110],[170,295],[-170,295],[-355,110],[-355,-110]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/keyboard_to_smile.json b/TMessagesProj/src/main/res/raw/keyboard_to_smile.json new file mode 100644 index 000000000..27fcb67e2 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/keyboard_to_smile.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"keyboard_to_smile","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,419.5],"to":[0,-5.333],"ti":[0,0]},{"t":10,"s":[420,450]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[100,100]},{"t":10,"s":[50,50]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":6,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[-230,-245],[230,-245],[325,-150],[325,150],[230,245],[-230,245],[-325,150],[-325,-150]],"c":true}]},{"t":10,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[-0.1,-315],[0.1,-315],[315,-0.1],[315,0.1],[0.1,315],[-0.1,315],[-315,0.1],[-315,-0.1]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-46.667,0],[-16.667,0]],"o":[[16.667,0],[46.667,0],[0,0]],"v":[[-80,7.5],[15,7.5],[110,7.5]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[-53.333,0],[-33.333,46.667]],"o":[[33.333,46.667],[53.333,0],[0,0]],"v":[[-115,-37.5],[15,32.5],[145,-37.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-5,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5],[-5,0]],"o":[[5,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5],[5,0]],"v":[[200,-60],[210,-70],[210,-110],[200,-120],[160,-120],[150,-110],[150,-70],[160,-60]],"c":true}]},{"t":10,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[106.089,-10],[137.204,-30.002],[144.978,-60],[137.221,-89.97],[106.089,-110],[74.971,-89.994],[67.2,-60],[74.999,-29.958]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-5,0],[-6.128,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5]],"o":[[5,0],[6.129,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5]],"v":[[-200,-60],[-160,-60],[-150,-70],[-150,-110],[-160,-120],[-200,-120],[-210,-110],[-210,-70]],"c":true}]},{"t":10,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-106.111,-10],[-74.997,-30],[-67.222,-60],[-74.995,-89.997],[-106.111,-110],[-137.248,-89.961],[-145,-60],[-137.216,-29.984]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/keyboard_to_sticker.json b/TMessagesProj/src/main/res/raw/keyboard_to_sticker.json new file mode 100644 index 000000000..48e6d1021 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/keyboard_to_sticker.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"keyboard_to_sticker","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,419.5],"to":[0,-5.333],"ti":[0,0]},{"t":10,"s":[420,450]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[100,100]},{"t":10,"s":[50,50]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":6,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[190.5,175.5],[650.5,175.5],[745.5,270.5],[745.5,570.5],[650.5,665.5],[190.5,665.5],[95.5,570.5],[95.5,270.5]],"c":true}]},{"t":10,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[290.5,105.5],[550.5,105.5],[735.5,290.5],[735.5,420.5],[420.5,735.5],[290.5,735.5],[105.5,550.5],[105.5,290.5]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[51.1,317.676],[71.1,317.676],[141.1,247.676],[141.1,197.676],[261.1,77.676],[311.1,77.676],[381.099,7.676],[381.099,-42.324]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[-165,180],[-145,180],[-75,110],[-75,60],[45,-60],[95,-60],[165,-130],[165,-180]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[570,555],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"c","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[-230,-245],[230,-245],[325,-150],[325,150],[230,245],[-230,245],[-325,150],[-325,-150]],"c":true}]},{"t":10,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[-130,-315],[130,-315],[315,-130],[315,0],[0,315],[-130,315],[-315,130],[-315,-130]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-46.667,0],[-16.667,0]],"o":[[16.667,0],[46.667,0],[0,0]],"v":[[-80,7.5],[15,7.5],[110,7.5]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[-46.667,0],[-20,20]],"o":[[40,43.333],[46.667,0],[0,0]],"v":[[-115,-32.5],[15,32.5],[115,2.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-5,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5],[-5,0]],"o":[[5,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5],[5,0]],"v":[[200,-60],[210,-70],[210,-110],[200,-120],[160,-120],[150,-110],[150,-70],[160,-60]],"c":true}]},{"t":10,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[108.889,-10],[140.004,-30.002],[147.778,-60],[140.021,-89.97],[108.889,-110],[77.771,-89.994],[70,-60],[77.799,-29.958]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-5,0],[-6.128,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5]],"o":[[5,0],[6.129,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5]],"v":[[-200,-60],[-160,-60],[-150,-70],[-150,-110],[-160,-120],[-200,-120],[-210,-110],[-210,-70]],"c":true}]},{"t":10,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-111.111,-10],[-79.997,-30],[-72.222,-60],[-79.995,-89.997],[-111.111,-110],[-142.248,-89.961],[-150,-60],[-142.216,-29.984]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_activities b/TMessagesProj/src/main/res/raw/msg_emoji_activities new file mode 100644 index 000000000..7616eb1d8 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_activities @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"activities","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Ellipse 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[36]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[36]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[36]},{"t":30,"s":[36]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[44.833]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[31]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[38.667]},{"t":30,"s":[36]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[6.667,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[16.667,13.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[16.667,16.667,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[16.667,15,100]},{"t":30,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"msg_emoji_activities Outlines","parent":1,"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":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,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,96.429],[96.277,41.267]],"o":[[76.047,-47.761],[0,-111.382],[0,0]],"v":[[-44.738,238.546],[81.86,9.733],[-81.86,-238.546]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":14,"ix":1},"e":{"a":0,"k":81,"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":"tr","p":{"a":0,"k":[168.14,350.267],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-103.904],[-85.72,-45.245]],"o":[[-86.039,45.143],[0,103.668],[0,0]],"v":[[72.365,-239.089],[-72.365,0.154],[71.78,239.089]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":14,"ix":1},"e":{"a":0,"k":84,"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":"tr","p":{"a":0,"k":[542.365,359.846],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-143.594,0],[0,143.594],[143.594,0],[0,-143.594]],"o":[[143.594,0],[0,-143.594],[-143.594,0],[0,143.594]],"v":[[0,260],[260,0],[0,-260],[-260,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[360,360],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_cat b/TMessagesProj/src/main/res/raw/msg_emoji_cat new file mode 100644 index 000000000..e504b1391 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_cat @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"cat","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"msg_emoji_cat Outlines","parent":2,"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":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[10.409,6.366],[16.603,3.752]],"o":[[-4.73,-7.775],[-10.409,-6.366],[0,0]],"v":[[31.612,18.194],[8.904,-3.017],[-31.612,-18.194]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[578.227,519.561],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-9.231,5.475],[-14.805,2.019]],"o":[[6.754,-10.768],[9.231,-5.475],[0,0]],"v":[[-30.016,17.802],[-6.038,-6.562],[30.016,-17.802]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[143.12,514.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[17.642,4.74],[24.854,0.058]],"o":[[-15.282,-10.725],[-17.642,-4.74],[0,0]],"v":[[56.566,15.197],[7.179,-8],[-56.566,-15.197]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[623.434,439.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-17.642,4.74],[-24.854,0.058]],"o":[[15.282,-10.725],[17.642,-4.74],[0,0]],"v":[[-56.566,15.197],[-7.179,-8],[56.566,-15.197]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[96.566,439.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[-18.186,0],[0,22.552],[18.186,0],[0,-22.552]],"o":[[18.186,0],[0,-22.552],[-18.186,0],[0,22.552]],"v":[[0,40.833],[32.929,0],[0,-40.833],[-32.929,0]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":10,"s":[{"i":[[-18.186,0],[0,6.3],[18.186,0],[0,-6.3]],"o":[[18.186,0],[0,-6.3],[-18.186,0],[0,6.3]],"v":[[0,5.611],[32.929,-5.797],[0,-17.204],[-32.929,-5.797]],"c":true}]},{"t":15,"s":[{"i":[[-18.186,0],[0,22.552],[18.186,0],[0,-22.552]],"o":[[18.186,0],[0,-22.552],[-18.186,0],[0,22.552]],"v":[[0,40.833],[32.929,0],[0,-40.833],[-32.929,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[457.2,388.611],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-23.642,0],[0,12.366],[23.642,0],[0,-12.366]],"o":[[23.642,0],[0,-12.366],[-23.642,0],[0,12.366]],"v":[[0,27.222],[42.808,-4.832],[0,-27.222],[-42.808,-4.832]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":15,"s":[{"i":[[-23.642,0],[0,12.366],[23.642,0],[0,-12.366]],"o":[[23.642,0],[0,-12.366],[-23.642,0],[0,12.366]],"v":[[0,47.222],[42.808,15.168],[0,-7.222],[-42.808,15.168]],"c":true}]},{"t":30,"s":[{"i":[[-23.642,0],[0,12.366],[23.642,0],[0,-12.366]],"o":[[23.642,0],[0,-12.366],[-23.642,0],[0,12.366]],"v":[[0,27.222],[42.808,-4.832],[0,-27.222],[-42.808,-4.832]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[361.705,467.083],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[-18.186,0],[0,22.552],[18.186,0],[0,-22.552]],"o":[[18.186,0],[0,-22.552],[-18.186,0],[0,22.552]],"v":[[0,40.833],[32.929,0],[0,-40.833],[-32.929,0]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":10,"s":[{"i":[[-18.186,0],[0,6.3],[18.186,0],[0,-6.3]],"o":[[18.186,0],[0,-6.3],[-18.186,0],[0,6.3]],"v":[[0,5.611],[32.929,-5.797],[0,-17.204],[-32.929,-5.797]],"c":true}]},{"t":15,"s":[{"i":[[-18.186,0],[0,22.552],[18.186,0],[0,-22.552]],"o":[[18.186,0],[0,-22.552],[-18.186,0],[0,22.552]],"v":[[0,40.833],[32.929,0],[0,-40.833],[-32.929,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[259.624,388.611],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.034,-1.072],[-22.702,-46.303],[-3.372,1.006],[-15.321,0],[-24.219,-6.759],[-1.51,2.562],[-33.993,6.503],[-5.236,-6.021],[-4.27,-21.499],[16.691,-50.293],[0,-40.968],[136.811,0],[0,114.78],[0,0],[-17.876,27.032],[-4.551,20.244],[-15.456,20.611]],"o":[[29.561,5.254],[1.497,3.053],[23.911,-7.135],[14.912,0],[4.172,1.164],[17.182,-29.145],[6.542,-1.251],[19.118,21.983],[4.66,23.464],[20.952,28.131],[0,114.78],[-136.811,0],[0,0],[0.12,-38.711],[-11.168,-55.308],[4.257,-18.937],[4.24,-5.653]],"v":[[-171.616,-242.734],[-78.528,-177.949],[-58.721,-172.194],[0.126,-182.895],[58.823,-172.757],[80.46,-176.455],[166.019,-239.746],[203.704,-237.491],[238.787,-172.269],[220.741,-61.633],[247.718,36.108],[0,243.936],[-247.718,36.108],[-247.709,28.944],[-228.157,-65.641],[-238.085,-178.963],[-208.515,-238.284]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[360.822,366.064],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Ellipse 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[36,36,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[8.333,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[17.533,17.533,100]},{"t":20,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_flags b/TMessagesProj/src/main/res/raw/msg_emoji_flags new file mode 100644 index 000000000..c121b0909 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_flags @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"flags","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Vector 76","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[5]},{"t":20,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[20.9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[21.3]},{"t":20,"s":[21.2]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30.333]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[38.833]},{"t":20,"s":[38]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[8.333,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[18.333,18.333,100]},{"t":20,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"msg_emoji_flags Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.798,-12,0],"ix":2,"l":2},"a":{"a":0,"k":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-37.052,1.586],[-76.139,5.677],[-14.927,0.527],[-0.574,-16.559],[0,-0.337],[0,0],[7.18,0.007],[1.789,0.867],[33,-1.428],[45.62,0.054],[28.207,12.423]],"o":[[30.986,29.359],[26.981,-1.155],[24.661,-1.839],[16.559,-0.575],[0.012,0.337],[0,0],[-0.007,7.18],[-1.988,-0.002],[-20.755,-10.167],[-66.035,2.858],[-30.413,-0.039],[0,0]],"v":[[-170.597,-138.603],[-68.54,-96.944],[80.175,-130.377],[139.557,-133.926],[170.579,-104.984],[170.597,-103.973],[170.597,107.975],[157.584,120.962],[151.847,119.636],[71.215,106.528],[-82.667,138.549],[-170.597,119.856]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":15,"s":[{"i":[[0,0],[-57.205,-1.435],[-76.139,5.677],[-14.927,0.527],[-0.574,-16.559],[0,-0.337],[0,0],[5.931,-2.745],[3.533,-0.984],[33,-1.428],[56.857,2.88],[34.852,-13.236]],"o":[[34.852,-19.776],[42.812,1.074],[24.661,-1.839],[16.559,-0.575],[0.012,0.337],[0,0],[-0.007,7.18],[-1.711,0.792],[-20.834,5.806],[-66.035,2.858],[-38.078,-1.929],[0,0]],"v":[[-170.597,-88.603],[-58.54,-126.944],[90.175,-100.377],[139.557,-113.926],[170.579,-84.984],[170.597,-83.973],[169.254,106.621],[159.254,118.321],[146.76,123.094],[71.215,136.528],[-72.667,108.549],[-170.597,139.856]],"c":false}]},{"t":30,"s":[{"i":[[0,0],[-37.052,1.586],[-76.139,5.677],[-14.927,0.527],[-0.574,-16.559],[0,-0.337],[0,0],[7.18,0.007],[1.789,0.867],[33,-1.428],[45.62,0.054],[28.207,12.423]],"o":[[30.986,29.359],[26.981,-1.155],[24.661,-1.839],[16.559,-0.575],[0.012,0.337],[0,0],[-0.007,7.18],[-1.988,-0.002],[-20.755,-10.167],[-66.035,2.858],[-30.413,-0.039],[0,0]],"v":[[-170.597,-138.603],[-68.54,-96.944],[80.175,-130.377],[139.557,-133.926],[170.579,-104.984],[170.597,-103.973],[170.597,107.975],[157.584,120.962],[151.847,119.636],[71.215,106.528],[-82.667,138.549],[-170.597,119.856]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[380.745,263.379],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[210.149,602.158],[210.149,124.776]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":15,"s":[90]},{"t":30,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_food b/TMessagesProj/src/main/res/raw/msg_emoji_food new file mode 100644 index 000000000..048d11f23 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_food @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"food","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[36,36,0],"ix":2,"l":2},"a":{"a":0,"k":[-9.332,14.34,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[8.333,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[18.333,18.333,100]},{"t":20,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"msg_emoji_food Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-9.332,14.34,0],"ix":2,"l":2},"a":{"a":0,"k":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[46.829,7.164],[-21.68,19.513],[-40.048,1.556],[0,0],[-0.297,-7.273],[0.01,-0.315],[22.169,-19.953]],"o":[[4.527,-46.138],[19.507,-17.557],[0,0],[7.273,-0.297],[0.013,0.315],[-1.305,40.781],[-24.602,22.142]],"v":[[-71.183,60.139],[-31.872,-38.338],[57.461,-67.007],[57.461,-67.006],[71.169,-54.374],[71.173,-53.429],[35.962,37.672]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":10,"s":[{"i":[[52.631,-5.132],[-18.086,27.073],[-42.896,12.7],[0,0],[-2.322,-7.787],[-0.076,-0.344],[18.494,-27.684]],"o":[[-7.794,-51.159],[16.274,-24.36],[0,0],[7.787,-2.322],[0.101,0.337],[9.807,44.477],[-20.524,30.721]],"v":[[-67.372,68.019],[-51.934,-49.328],[36.821,-104.917],[36.821,-104.916],[55.125,-95.022],[55.39,-94],[42.359,14.24]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[46.144,10.724],[-23.109,17.797],[-40.049,-1.511],[0,0],[0.26,-7.275],[0.034,-0.313],[23.63,-18.199]],"o":[[8.042,-45.657],[20.793,-16.014],[0,0],[7.275,0.26],[-0.011,0.315],[-4.42,40.562],[-26.223,20.196]],"v":[[-73.574,57.519],[-26.847,-37.663],[64.417,-59.416],[64.417,-59.415],[77.119,-45.772],[77.051,-44.829],[34.976,43.312]],"c":true}]},{"t":30,"s":[{"i":[[46.829,7.164],[-21.68,19.513],[-40.048,1.556],[0,0],[-0.297,-7.273],[0.01,-0.315],[22.169,-19.953]],"o":[[4.527,-46.138],[19.507,-17.557],[0,0],[7.273,-0.297],[0.013,0.315],[-1.305,40.781],[-24.602,22.142]],"v":[[-71.183,60.139],[-31.872,-38.338],[57.461,-67.007],[57.461,-67.006],[71.169,-54.374],[71.173,-53.429],[35.962,37.672]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[455.676,161.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[365,234.827],[365,97.348]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-28.105,-8.845],[0,0],[-19.539,28.161],[-9.057,47.117],[12.761,43.613],[49.071,-14.358],[2.148,-0.806],[0,0],[24.87,10.515],[0,0],[22.662,-53.645],[0.328,-0.83],[-7.061,-45.215],[-62.276,-66.245],[-28.561,10.736],[0,0]],"o":[[0,0],[32.695,10.289],[54.067,-77.925],[6.527,-33.955],[-14.358,-49.071],[-2.202,0.644],[0,0],[-25.28,9.486],[0,0],[-53.64,-22.674],[-0.347,0.822],[-14.936,38.041],[11.136,71.313],[20.899,22.231],[0,0],[27.58,-10.367]],"v":[[43.903,207.049],[54.404,210.354],[142.224,180.307],[236.911,-7.256],[227.56,-123.608],[112.711,-186.462],[106.183,-184.286],[61.77,-167.62],[-16.337,-169.222],[-85.389,-198.416],[-223.551,-142.328],[-224.563,-139.85],[-236.377,-14.966],[-126.259,191.371],[-44.583,210.354],[-42.039,209.398]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[359.776,402.69],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_objects b/TMessagesProj/src/main/res/raw/msg_emoji_objects new file mode 100644 index 000000000..2384802e0 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_objects @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"objects","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Ellipse 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[-5]},{"t":30,"s":[0]}],"ix":10},"p":{"a":0,"k":[36,35.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[8.333,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[17.5,17.5,100]},{"t":20,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"msg_emoji_objects Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,3,0],"ix":2,"l":2},"a":{"a":0,"k":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,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]],"o":[[0,0],[0,0]],"v":[[293.519,507.496],[425.008,507.496]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"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":[100,100],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[360,339.727],[360,407.42]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[293.519,289.098],[360,339.727],[421.818,289.098]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":15,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[449.191,289.098],[358.612,339.727],[274.387,289.098]],"c":false}]},{"t":30,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[293.519,289.098],[360,339.727],[421.818,289.098]],"c":false}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.527,0],[-27.455,35.305],[0,80.192],[107.695,0],[0,-105.624],[-51.58,-66.066]],"o":[[118.527,0],[53.19,-68.398],[0,-105.624],[-107.696,0],[0,78.196],[28.087,35.975]],"v":[[0,255],[83.106,113.27],[195,-63.75],[0,-255],[-195,-63.75],[-90.867,109.685]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[360,360],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_other b/TMessagesProj/src/main/res/raw/msg_emoji_other new file mode 100644 index 000000000..34270ee4b --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_other @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"other","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-90]},{"t":10,"s":[0]}],"ix":10},"p":{"a":0,"k":[36,36,0],"ix":2,"l":2},"a":{"a":0,"k":[-9.332,14.34,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[8.333,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[18.333,18.333,100]},{"t":20,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"msg_emoji_other Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-9.332,14.34,0],"ix":2,"l":2},"a":{"a":0,"k":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,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]],"o":[[0,0],[0,0]],"v":[[52.748,48.654],[-52.748,-48.654]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[260.711,465.338],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":20,"s":[110,110]},{"t":30,"s":[100,100]}],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-52.748,48.654],[52.748,-48.654]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[260.711,465.338],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":20,"s":[110,110]},{"t":30,"s":[100,100]}],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[409.793,499.451],[520.391,499.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[409.793,429.451],[520.391,429.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[409.793,259.451],[530.391,259.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":15,"s":[-51.429,-28.571],"to":[0,0],"ti":[0,0]},{"t":25,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":15,"s":[110,110]},{"t":25,"s":[100,100]}],"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":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[199.793,259.451],[320.391,259.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[260.72,199.368],[260.72,323.653]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-55.228,0],[0,0],[0,-55.228],[0,0],[55.228,0],[0,0],[0,55.229],[0,0]],"o":[[0,0],[55.228,0],[0,0],[0,55.229],[0,0],[-55.228,0],[0,0],[0,-55.228]],"v":[[-150,-250],[150,-250],[250,-150],[250,150],[150,250],[-150,250],[-250,150],[-250,-150]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[360,360],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_smiles b/TMessagesProj/src/main/res/raw/msg_emoji_smiles new file mode 100644 index 000000000..dd2a6d352 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_smiles @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"smile","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"msg_emoji_smiles Outlines","parent":2,"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":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[59.999,59.999,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],[-40.13,0],[-24.229,31.801],[0,0]],"o":[[0,0],[25.25,31.191],[39.979,0],[0,0],[0,0]],"v":[[-104.498,-26.124],[-102.12,-23.188],[1.244,26.124],[103.139,-24.342],[104.498,-26.124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[360,460.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[-20.435,0],[0,22.92],[20.435,0],[0,-22.92]],"o":[[20.435,0],[0,-22.92],[-20.435,0],[0,22.92]],"v":[[0,41.5],[37,0],[0,-41.5],[-37,0]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":10,"s":[{"i":[[-20.435,0],[0,5.24],[20.435,0],[0,-5.24]],"o":[[20.435,0],[0,-5.24],[-20.435,0],[0,5.24]],"v":[[0,5.441],[37,-4.048],[0,-13.536],[-37,-4.048]],"c":true}]},{"t":15,"s":[{"i":[[-20.435,0],[0,22.92],[20.435,0],[0,-22.92]],"o":[[20.435,0],[0,-22.92],[-20.435,0],[0,22.92]],"v":[[0,41.5],[37,0],[0,-41.5],[-37,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[447,319.443],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[-20.434,0],[0,22.92],[20.435,0],[0,-22.92]],"o":[[20.435,0],[0,-22.92],[-20.434,0],[0,22.92]],"v":[[0,41.5],[37,0],[0,-41.5],[-37,0]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":10,"s":[{"i":[[-20.435,0],[0,5.24],[20.434,0],[0,-5.24]],"o":[[20.435,0],[0,-5.24],[-20.434,0],[0,5.24]],"v":[[0,5.441],[37,-4.048],[0,-13.536],[-37,-4.048]],"c":true}]},{"t":15,"s":[{"i":[[-20.434,0],[0,22.92],[20.435,0],[0,-22.92]],"o":[[20.435,0],[0,-22.92],[-20.434,0],[0,22.92]],"v":[[0,41.5],[37,0],[0,-41.5],[-37,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[273,319.443],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-143.594,0],[0,143.594],[143.594,0],[0,-143.594]],"o":[[143.594,0],[0,-143.594],[-143.594,0],[0,143.594]],"v":[[0,260],[260,0],[0,-260],[-260,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[360,360],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Ellipse 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[36,36,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[8.333,8.333,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[17.533,17.533,100]},{"t":20,"s":[16.667,16.667,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_emoji_travel b/TMessagesProj/src/main/res/raw/msg_emoji_travel new file mode 100644 index 000000000..2ccddf8ef --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_emoji_travel @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":60,"w":72,"h":72,"nm":"travel","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Rectangle 153","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[36,42.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[4.167,4.167,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[9.166,9.166,100]},{"t":20,"s":[8.333,8.333,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"msg_emoji_travel Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-78.003,0],"ix":2,"l":2},"a":{"a":0,"k":[360,360,0],"ix":1,"l":2},"s":{"a":0,"k":[120.005,120.005,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]],"o":[[0,0],[0,0]],"v":[[103.373,320],[621.631,320]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"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":[100,100],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-27.614,0],[0,22.091],[27.614,0],[0,-22.091]],"o":[[27.614,0],[0,-22.091],[-27.614,0],[0,22.091]],"v":[[0,40],[50,0],[0,-40],[-50,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90,300],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-27.614,0],[0,22.091],[27.614,0],[0,-22.091]],"o":[[27.614,0],[0,-22.091],[-27.614,0],[0,22.091]],"v":[[0,40],[50,0],[0,-40],[-50,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[630,300],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-22.091,0],[0,24.853],[22.091,0],[0,-24.853]],"o":[[22.091,0],[0,-24.853],[-22.091,0],[0,24.853]],"v":[[0,45],[40,0],[0,-45],[-40,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-22.091,0],[0,24.853],[22.091,0],[0,-24.853]],"o":[[22.091,0],[0,-24.853],[-22.091,0],[0,24.853]],"v":[[340,45],[380,0],[340,-45],[300,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[356.182,434.08],"ix":2},"a":{"a":0,"k":[166.182,-0.92],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":15,"s":[110,110]},{"t":25,"s":[100,100]}],"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":"Group 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.575,0],[0,0],[-9.238,-14.108],[0,0],[-13.491,0],[0,0],[0,26.917],[0,0],[21.014,36.452],[0,0],[21.45,0],[0,0],[10.238,-20.118],[0,0],[0,-37.833],[0,0],[-28.695,0],[0,0],[-7.123,12.46],[0,0]],"o":[[0,0],[16.864,0],[0,0],[7.391,11.286],[0,0],[26.917,0],[0,0],[0,-42.076],[0,0],[-10.713,-18.583],[0,0],[-22.573,0],[0,0],[-17.159,33.719],[0,0],[0,28.695],[0,0],[14.352,0],[0,0],[7.73,-13.522]],"v":[[-126.593,181.887],[121.195,181.887],[163.025,204.496],[171.376,217.249],[204.84,235.336],[231.957,235.336],[280.695,186.599],[280.695,44.585],[248.619,-75.279],[173.664,-205.302],[121.683,-235.336],[-129.235,-235.336],[-182.709,-202.549],[-254.592,-61.295],[-280.695,47.555],[-280.695,173.662],[-228.737,225.62],[-199.988,225.62],[-165.262,205.471],[-164.28,203.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":42,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[361.78,369.639],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 6","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/premium_gift.json b/TMessagesProj/src/main/res/raw/premium_gift.json new file mode 100644 index 000000000..5f1d8ca9a --- /dev/null +++ b/TMessagesProj/src/main/res/raw/premium_gift.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"new","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":109,"s":[100]},{"t":115,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[36]},{"t":115,"s":[-7]}]},"p":{"a":1,"k":[{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"t":88,"s":[255.662,272.67,0],"to":[-55.25,-74.417,0],"ti":[82,24.417,0]},{"t":115,"s":[50.662,127.17,0]}]},"a":{"a":0,"k":[417.662,105.67,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":100,"s":[-100,100,100]},{"t":115,"s":[-42,42,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[1.38,-7.261],[-5.77,-2.323],[-0.271,-3.407],[-0.52,2.702],[6.731,2.705]],"o":[[0,0],[5.678,2.286],[0.151,1.895],[0.569,-2.954],[-6.202,-2.492]],"v":[[-18.744,-6.537],[-7.461,-9.706],[0.973,2.663],[6.076,-0.757],[-3.036,-14.599]],"c":true}]},{"t":115,"s":[{"i":[[6.553,-6.657],[-8.252,0.189],[0.844,-1.51],[-1.191,1.746],[14.969,-2.298]],"o":[[0,0],[15.759,-0.361],[-1.057,1.891],[1.853,-2.715],[-10.295,1.581]],"v":[[-26.384,3.245],[-2.46,-9.787],[9.964,-0.595],[11.689,0.193],[-2.737,-10.981]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.290196078431,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654901960784,0.513725490196,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[392.76,119.999]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[3.708,-3.243],[-4.729,-4.3],[0.604,-4.438],[-1.144,2.736],[7.04,3.885]],"o":[[0,0],[4.818,4.381],[-0.274,2.013],[1.251,-2.991],[-5.565,-3.071]],"v":[[-18.482,-9.272],[-6.695,-7.341],[-1.889,7.973],[4.475,5.411],[-2.693,-10.99]],"c":true}]},{"t":115,"s":[{"i":[[3.493,-2.192],[-5.807,-3.206],[10.446,-3.607],[-2.791,3.036],[7.625,3.98]],"o":[[0,0],[7.501,4.142],[-2.407,0.831],[3.052,-3.319],[-4.58,-2.39]],"v":[[-2.904,-9.577],[16.77,-10.903],[16.356,4.161],[22.928,1.41],[17.189,-11.97]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.290196078431,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654901960784,0.513725490196,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[408.544,108.058]},"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.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[5.87,-1.993],[-5.191,-6.206],[1.277,-4.426],[-1.601,2.621],[6.857,4.928]],"o":[[0,0],[4.347,5.197],[-0.579,2.008],[1.75,-2.866],[-5.42,-3.895]],"v":[[-19.28,-7.613],[-7.126,-2.861],[-4.275,13.372],[2.802,11.653],[-2.381,-6.013]],"c":true}]},{"t":115,"s":[{"i":[[9.245,-2.3],[-6.248,-5.662],[4.827,-4.263],[-2.307,1.3],[5.555,4.195]],"o":[[0,0],[4.354,3.946],[-1.421,1.255],[4.193,-2.363],[-7.247,-5.473]],"v":[[6.334,-7.678],[25.766,-6.695],[24.596,5.882],[25.967,5.6],[26.986,-7.152]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.290196078431,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654901960784,0.513725490196,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[427.065,98.568]},"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.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[6.675,-0.61],[-3.668,-4.952],[1.455,-4.268],[-1.862,2.228],[5.064,5.504]],"o":[[0,0],[3.283,4.432],[-0.644,1.889],[2.036,-2.436],[-4.033,-4.383]],"v":[[-18.884,-4.426],[-10.029,1.424],[-6.925,17.04],[0,16.345],[-3.6,-0.129]],"c":true}]},{"t":115,"s":[{"i":[[7.082,-0.043],[-3.457,-4.112],[2.172,-3.108],[-1.464,1.617],[2.193,2.341]],"o":[[0,0],[1.627,1.936],[-0.961,1.376],[1.996,-2.205],[-2.193,-2.341]],"v":[[16.492,-7.725],[27.03,-4.019],[26.926,4.448],[28.499,4.662],[27.401,-4.916]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.290196078431,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654901960784,0.513725490196,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[444.84,91.844]},"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.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[-2.364,1.25],[-0.426,-5.7],[-4.403,-0.166],[3.639,0.84],[-2.144,7.043]],"o":[[0,0],[0.411,5.504],[2.509,0.094],[-4.024,-0.928],[1.581,-5.192]],"v":[[-5.331,-18.58],[-8.486,-8.34],[0.245,3.913],[-4.954,6.743],[-13.598,-9.464]],"c":true}]},{"t":115,"s":[{"i":[[-4.785,2.721],[1.893,-5.948],[-5.522,-2.893],[4.06,2.799],[-2.249,6.435]],"o":[[0,0],[-1.911,6.004],[2.508,1.314],[-2.909,-2.005],[1.378,-3.944]],"v":[[10.246,-18.885],[0.346,-8.342],[7.811,1.736],[5.435,2.143],[-0.609,-8.978]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784313725,0.105882360421,0.937254961799,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529441684,0.247058838489,0.968627510819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[395.393,117.366]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[-3.652,0.957],[0.417,-6.744],[-4.835,-1.066],[3.849,1.62],[-4.828,7.602]],"o":[[0,0],[-0.367,5.943],[2.755,0.607],[-4.255,-1.791],[1.975,-3.109]],"v":[[-1.572,-14.603],[-7.385,-5.247],[-0.305,9.406],[-7.255,11.454],[-12.889,-7.922]],"c":true}]},{"t":115,"s":[{"i":[[-4.37,0.734],[5.061,-9.405],[-10.634,0.7],[5.118,1.667],[-3.691,4.112]],"o":[[0,0],[-1.63,3.03],[3.966,-0.261],[-5.659,-1.843],[3.847,-4.286]],"v":[[24.186,-14.56],[6.213,-3.222],[15.263,5.886],[9.577,7.048],[7.197,-5.6]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784313725,0.105882360421,0.937254961799,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529441684,0.247058838489,0.968627510819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[409.357,105.558]},"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 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[-4.602,-0.825],[3.842,-6.806],[-4.541,-1.921],[3.821,2.182],[-5.984,7.228]],"o":[[0,0],[-2.935,5.2],[2.767,1.171],[-4.225,-2.412],[3.121,-3.77]],"v":[[1.1,-8.947],[-7.996,-1.234],[-2.653,14.643],[-10.273,15.758],[-13.41,-4.718]],"c":true}]},{"t":115,"s":[{"i":[[-4.49,-0.865],[7.263,-8.85],[-9.067,1.064],[3.897,-0.22],[-9.632,8.101]],"o":[[0,0],[-5.98,7.287],[2.978,-0.349],[-5.509,0.311],[3.441,-2.894]],"v":[[36.455,-12.356],[15.709,-4.632],[22.859,8.242],[18.12,9.55],[16.094,-6.764]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784313725,0.105882360421,0.937254961799,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529441684,0.247058838489,0.968627510819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[428.124,96.545]},"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 7","bm":0,"hd":false}],"ip":88,"op":176,"st":-4,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":108,"s":[100]},{"t":114,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":87,"s":[-50]},{"t":114,"s":[-2]}]},"p":{"a":1,"k":[{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.167},"t":87,"s":[287.662,255.17,0],"to":[26.75,-55.417,0],"ti":[-104.25,40.417,0]},{"t":114,"s":[457.162,102.67,0]}]},"a":{"a":0,"k":[417.662,105.67,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.388]},"t":99,"s":[100,100,100]},{"t":114,"s":[42,42,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[7.852,-11.76],[0.47,-18.613],[-0.325,2.448]],"o":[[0,0],[-0.055,2.011],[2.511,-15.725]],"v":[[-19.319,-5.113],[3.452,1.364],[7.118,-0.267]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.949019610882,0.156862750649,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.40000000596,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[392.76,119.999]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12.236,-6.967],[6.82,-16.335],[-0.74,3.377]],"o":[[0,0],[-0.912,2.03],[2.805,-12.295]],"v":[[-11.857,-9.401],[5.869,6.352],[11.573,3.666]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.949019610882,0.156862750649,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.40000000596,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[408.544,108.058]},"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":[[15.533,-5.383],[7.463,-14.077],[-1.911,2.163]],"o":[[0,0],[-0.946,1.77],[6.303,-7.47]],"v":[[-8.387,-7.641],[7.87,10.437],[12.521,9.33]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.949019610882,0.156862750649,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.40000000596,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[427.065,98.568]},"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":0,"k":{"i":[[12.083,-1.964],[3.802,-13.726],[-0.956,2.407]],"o":[[0,0],[-0.477,1.784],[3.572,-9.457]],"v":[[-3.712,-5.61],[7.471,11.685],[12.12,11.377]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.949019610882,0.156862750649,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.40000000596,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[444.84,91.844]},"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":0,"k":{"i":[[-14.392,5.85],[-14.745,-8.063],[4.031,1.266]],"o":[[0,0],[2.325,1.239],[-10.01,-3.16]],"v":[[1.293,-18.709],[1.963,2.9],[-2.234,5.299]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.768627464771,0.058823529631,0.023529412225,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847058832645,0.070588238537,0.070588238537,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[395.393,117.366]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-15.44,3.718],[-14.634,-10.948],[3.31,1.838]],"o":[[0,0],[2.381,1.786],[-7.474,-5.182]],"v":[[9.381,-14.585],[6.42,8.127],[0.639,9.458]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.768627464771,0.058823529631,0.023529412225,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847058832645,0.070588238537,0.070588238537,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[409.357,105.558]},"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 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-18.559,-1.877],[-14.919,-13.894],[3.344,2.521]],"o":[[0,0],[2.196,2.047],[-8.43,-6.287]],"v":[[15.466,-10.201],[8.196,11.921],[2.431,12.802]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.768627464771,0.058823529631,0.023529412225,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.326},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847058832645,0.070588238537,0.070588238537,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[428.124,96.545]},"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 7","bm":0,"hd":false}],"ip":87,"op":175,"st":-5,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"STAR","sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":68,"s":[-19]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":79,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":90,"s":[-17]},{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":109,"s":[10]},{"t":144,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[256.515,242.312,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":73,"s":[256.515,82.812,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":82,"s":[256.515,266.312,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"t":97,"s":[256.515,179.812,0],"to":[0,0,0],"ti":[0,0,0]},{"t":125,"s":[256.515,212.312,0]}]},"a":{"a":0,"k":[257.015,171.312,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,1.131]},"t":68,"s":[16,16,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":77,"s":[112,112,100]},{"i":{"x":[0.455,0.455,0.25],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":91,"s":[92,92,100]},{"i":{"x":[0.18,0.18,0.18],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":111,"s":[103,103,100]},{"t":137,"s":[100,100,100]}]}},"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.333,"y":0},"t":68,"s":[{"i":[[-0.121,0.692],[0,0],[-7.277,2.323],[0,0],[0.011,-0.205],[1.149,-0.559],[0,0],[1.427,-6.2],[0,0],[-2.323,-1.137]],"o":[[0,0],[1.449,-6.297],[0,0],[2.092,-0.662],[-0.065,1.175],[0,0],[-8.338,3.39],[0,0],[-0.598,2.012],[-0.036,-0.281]],"v":[[-22.548,6.018],[-19.82,-3.92],[-4.094,-23.514],[43.376,-36.433],[42.696,-42.244],[41.017,-40.472],[-7.4,-26.953],[-23.414,-7.201],[-26.1,3.001],[-22.716,7.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":72,"s":[{"i":[[-0.424,2.554],[0,0],[-9.811,5.172],[0,0],[0.002,-0.259],[1.237,-0.761],[0,0],[1.774,-11.054],[0,0],[-2.889,-2.533]],"o":[[0,0],[1.802,-11.228],[0,0],[1.257,-0.773],[-0.01,1.488],[0,0],[-9.66,5.092],[0,0],[-0.744,4.482],[-0.918,-2.066]],"v":[[-35.425,36.86],[-32.033,15.731],[-13.567,-10.345],[36.494,-36.734],[34.454,-43.188],[32.382,-39.583],[-16.904,-13.602],[-35.085,12.071],[-38.425,32.873],[-34.564,43.874]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[-1.705,4.387],[0,0],[-15.378,4.877],[0,0],[0.001,-0.139],[1.246,-0.456],[0,0],[7.938,-15.278],[0,0],[-3.36,-2.289]],"o":[[0,0],[11.486,-21.791],[0,0],[0.79,-0.416],[-0.006,0.8],[0,0],[-17.931,4.676],[0,0],[-1.24,3.615],[-0.998,-1.767]],"v":[[-58.453,16.428],[-50.602,0.068],[-19.027,-28.871],[35.518,-44.394],[35.036,-47.332],[33.683,-45.166],[-21.538,-29.685],[-51.823,-0.437],[-60.29,16.274],[-57.443,26.65]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[-0.416,2.402],[0,0],[-9.617,4.863],[0,0],[1.652,0.465],[1.213,-0.716],[0,0],[1.739,-10.393],[0,0],[-2.832,-2.381]],"o":[[0,0],[1.767,-10.557],[0,0],[2.966,-1.583],[0.054,1.398],[0,0],[-9.468,4.788],[0,0],[-0.729,4.214],[-0.9,-1.943]],"v":[[-33.148,34.791],[-29.824,14.924],[-11.722,-9.594],[37.347,-34.405],[35.348,-40.474],[33.317,-37.084],[-14.994,-12.656],[-32.815,11.483],[-36.089,31.042],[-32.304,41.385]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[-0.121,0.692],[0,0],[-7.277,2.323],[0,0],[0.011,-0.205],[1.149,-0.559],[0,0],[1.427,-6.2],[0,0],[-2.323,-1.137]],"o":[[0,0],[1.449,-6.297],[0,0],[2.092,-0.662],[-0.065,1.175],[0,0],[-8.338,3.39],[0,0],[-0.598,2.012],[-0.036,-0.281]],"v":[[-22.548,6.018],[-19.82,-3.92],[-4.094,-23.514],[38.08,-35.941],[37.4,-41.752],[35.721,-39.98],[-7.4,-26.953],[-23.414,-7.201],[-26.1,3.001],[-22.716,7.912]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":105,"s":[{"i":[[-0.416,2.402],[0,0],[-9.617,4.863],[0,0],[0.504,-0.896],[1.213,-0.716],[0,0],[1.739,-10.393],[0,0],[-2.832,-2.381]],"o":[[0,0],[1.767,-10.557],[0,0],[3.098,-2.089],[-0.567,1.007],[0,0],[-9.468,4.788],[0,0],[-0.729,4.214],[-0.9,-1.943]],"v":[[-33.148,34.791],[-29.824,14.924],[-11.722,-9.594],[37.347,-34.405],[35.879,-39.724],[33.317,-37.084],[-14.994,-12.656],[-32.815,11.483],[-36.089,31.042],[-32.304,41.385]],"c":true}]},{"i":{"x":0.18,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[-0.888,3.719],[0,0],[-11.73,5.181],[0,0],[0.078,-0.206],[1.237,-0.665],[0,0],[3.92,-12.891],[0,0],[-3.037,-2.088]],"o":[[0,0],[5.176,-15.442],[0,0],[3.071,-1.16],[-0.404,1.066],[0,0],[-12.522,5.054],[0,0],[-1.263,5.531],[-1.039,-1.881]],"v":[[-42.037,27.057],[-37.801,12.025],[-14.806,-15.726],[36.653,-37.919],[36.335,-43.017],[33.346,-40.057],[-17.847,-18.143],[-40.208,9.461],[-44.624,24.413],[-41.476,36.392]],"c":true}]},{"t":142,"s":[{"i":[[-0.416,2.402],[0,0],[-9.617,4.863],[0,0],[0.504,-0.896],[1.213,-0.716],[0,0],[1.739,-10.393],[0,0],[-2.832,-2.381]],"o":[[0,0],[1.767,-10.557],[0,0],[3.098,-2.089],[-0.567,1.007],[0,0],[-9.468,4.788],[0,0],[-0.729,4.214],[-0.9,-1.943]],"v":[[-33.148,34.791],[-29.824,14.924],[-11.722,-9.594],[37.347,-34.405],[35.879,-39.724],[33.317,-37.084],[-14.994,-12.656],[-32.815,11.483],[-36.089,31.042],[-32.304,41.385]],"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":[232.461,219.088]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[-9.288,0.984],[0,0],[-1.553,1.953],[0,0],[-8.473,-3.871],[5.641,-6.727],[0,0],[4.797,-0.215],[0,0],[-7.025,-5.836]],"o":[[-7.135,-5.928],[0,0],[5.246,-0.687],[0,0],[3.784,-5.38],[-6.576,-7.889],[0,0],[-2.145,1.343],[0,0],[-9.144,0.969],[0,0]],"v":[[-34.676,44.412],[-31.169,30.549],[6.253,26.605],[17.293,23.128],[34.445,-3.802],[58.978,-6.148],[30.746,-6.975],[13.336,20.656],[2.247,23.146],[-34.385,27.075],[-41.512,40.037]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":72,"s":[{"i":[[0,0],[-9.972,1.481],[0,0],[-1.771,3.668],[0,0],[-4.781,-0.558],[3.157,-6.539],[0,0],[3.898,-0.579],[0,0],[-7.104,-7.079]],"o":[[-7.215,-7.19],[0,0],[3.96,-0.588],[0,0],[2.472,-5.122],[-5.567,-2.865],[0,0],[-1.743,3.611],[0,0],[-9.817,1.458],[0,0]],"v":[[-44.62,43.041],[-37.882,21.842],[8.573,14.941],[17.726,8.143],[38.501,-34.891],[50.816,-41.732],[34.647,-36.22],[14.193,6.148],[5.181,12.842],[-40.555,19.636],[-47.189,40.507]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0,0],[-9.744,1.032],[0,0],[-1.771,2.553],[0,0],[-3.839,-2.318],[4.199,-5.193],[0,0],[3.899,-0.403],[0,0],[-6.083,-4.5]],"o":[[-9.181,-6.683],[0,0],[3.96,-0.409],[0,0],[2.325,-2.676],[-4.411,-3.157],[0,0],[-1.743,2.513],[0,0],[-9.394,0.786],[0,0]],"v":[[-43.136,37.639],[-38.427,25.349],[7.851,20.646],[16.599,14.338],[37.425,-8.442],[50.003,-9.808],[35.481,-7.429],[14.976,15.019],[5.733,20.392],[-39.826,25.021],[-45.705,35.876]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[-9.636,1.431],[0,0],[-1.711,3.545],[0,0],[-4.62,-0.539],[3.74,-7.773],[0,0],[3.767,-0.56],[0,0],[-8.744,-8.39]],"o":[[-8.055,-8.232],[0,0],[3.826,-0.568],[0,0],[2.389,-4.949],[-4.231,-2.92],[0,0],[-1.685,3.49],[0,0],[-9.487,1.409],[0,0]],"v":[[-41.407,41.672],[-36.407,21.451],[9.995,14.519],[18.84,7.949],[38.916,-33.637],[50.439,-40.197],[35.191,-34.921],[15.426,6.022],[6.717,12.49],[-38.991,19.32],[-43.889,39.224]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0,0],[-9.288,0.984],[0,0],[-1.553,1.953],[0,0],[-8.473,-3.871],[5.641,-6.727],[0,0],[4.797,-0.215],[0,0],[-7.025,-5.836]],"o":[[-7.135,-5.928],[0,0],[5.246,-0.687],[0,0],[3.784,-5.38],[-6.576,-7.889],[0,0],[-2.145,1.343],[0,0],[-9.144,0.969],[0,0]],"v":[[-34.676,44.412],[-31.169,30.549],[6.253,26.605],[17.293,23.128],[34.445,-3.802],[58.978,-6.148],[30.746,-6.975],[13.336,20.656],[2.247,23.146],[-34.385,27.075],[-41.512,40.037]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":105,"s":[{"i":[[0,0],[-9.636,1.431],[0,0],[-1.711,3.545],[0,0],[-4.62,-0.539],[3.74,-7.773],[0,0],[3.767,-0.56],[0,0],[-8.744,-8.39]],"o":[[-8.055,-8.232],[0,0],[3.826,-0.568],[0,0],[2.389,-4.949],[-4.231,-2.92],[0,0],[-1.685,3.49],[0,0],[-9.487,1.409],[0,0]],"v":[[-41.407,41.672],[-36.407,21.451],[9.995,14.519],[18.84,7.949],[38.916,-33.637],[50.439,-40.197],[35.191,-34.921],[15.426,6.022],[6.717,12.49],[-38.991,19.32],[-43.889,39.224]],"c":true}]},{"i":{"x":0.18,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[0,0],[-9.675,1.295],[0,0],[-1.732,3.205],[0,0],[-4.553,-1.187],[4.435,-6.975],[0,0],[3.813,-0.506],[0,0],[-7.619,-6.209]],"o":[[-7.777,-6.927],[0,0],[3.873,-0.514],[0,0],[2.535,-5.04],[-5.447,-3.011],[0,0],[-1.905,3.102],[0,0],[-7.695,0.767],[0,0]],"v":[[-43.319,39.073],[-39.071,23.452],[9.061,17.186],[16.993,10.721],[37.523,-24.319],[49.795,-29.807],[35.264,-25.076],[14.497,9.499],[6.108,15.155],[-41.439,21.636],[-45.832,36.859]],"c":true}]},{"t":142,"s":[{"i":[[0,0],[-9.636,1.431],[0,0],[-1.711,3.545],[0,0],[-4.62,-0.539],[3.74,-7.773],[0,0],[3.767,-0.56],[0,0],[-8.744,-8.39]],"o":[[-8.055,-8.232],[0,0],[3.826,-0.568],[0,0],[2.389,-4.949],[-4.231,-2.92],[0,0],[-1.685,3.49],[0,0],[-9.487,1.409],[0,0]],"v":[[-41.407,41.672],[-36.407,21.451],[9.995,14.519],[18.84,7.949],[38.916,-33.637],[50.439,-40.197],[35.191,-34.921],[15.426,6.022],[6.717,12.49],[-38.991,19.32],[-43.889,39.224]],"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":[212.467,122.732]},"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":"tr","p":{"a":0,"k":[212.467,122.732]},"a":{"a":0,"k":[212.467,122.732]},"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.667,"y":1},"o":{"x":0.333,"y":0},"t":72,"s":[{"i":[[8.844,6.312],[5.601,-0.358],[2.435,-11.231],[-3.653,-1.912],[-1.365,-7.2],[-2.07,-2.151],[0.731,4.182],[-1.705,4.421],[3.136,1.448]],"o":[[-1.339,-0.956],[-2.888,0.185],[-0.857,3.954],[3.653,1.912],[0.974,5.138],[2.07,2.151],[-0.731,-4.182],[1.705,-4.421],[-14.49,-6.691]],"v":[[222.743,133.942],[215.559,135.854],[163.808,148.997],[216.289,178.747],[265.97,176.119],[242.225,191.532],[316.137,228.332],[313.458,195.236],[320.886,185.916]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[17.25,7.964],[5.158,-3.922],[0.458,-1.018],[-3.849,-1.801],[-1.545,-2.842],[0.89,-1.537],[0.75,4.375],[-2.301,3.746],[3.306,1.315]],"o":[[-2.362,-1.09],[-5.158,3.922],[-0.458,1.018],[2.13,0.997],[1.545,2.842],[3.893,3.086],[-0.75,-4.375],[2.301,-3.746],[-21.828,-8.682]],"v":[[234.823,129.477],[225.408,139.066],[196.745,144.109],[247.485,168.68],[264.965,168.317],[260.806,174.021],[327.13,203.29],[320.017,180.37],[329.688,172.547]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[8.844,6.312],[5.601,-0.358],[2.435,-11.231],[-3.653,-1.912],[-1.365,-7.2],[-2.07,-2.151],[0.731,4.182],[-1.705,4.421],[3.136,1.448]],"o":[[-1.339,-0.956],[-2.888,0.185],[-0.857,3.954],[3.653,1.912],[0.974,5.138],[2.07,2.151],[-0.731,-4.182],[1.705,-4.421],[-14.49,-6.691]],"v":[[222.743,133.942],[215.559,135.854],[163.808,148.997],[216.289,178.747],[265.97,176.119],[242.225,191.532],[316.137,228.332],[313.458,195.236],[320.886,185.916]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":103,"s":[{"i":[[8.844,6.312],[5.601,-0.358],[2.435,-11.231],[-3.653,-1.912],[-1.365,-7.2],[-2.07,-2.151],[0.731,4.182],[-1.705,4.421],[3.136,1.448]],"o":[[-1.339,-0.956],[-2.888,0.185],[-0.857,3.954],[3.653,1.912],[0.974,5.138],[2.07,2.151],[-0.731,-4.182],[1.705,-4.421],[-14.49,-6.691]],"v":[[222.743,133.942],[215.559,135.854],[163.808,148.997],[216.289,178.747],[265.97,176.119],[242.225,191.532],[316.137,228.332],[313.458,195.236],[320.886,185.916]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[17.25,7.964],[6.447,-4.054],[2.345,-2.47],[-3.75,-2],[-1.545,-2.842],[-2.637,-1.62],[0.75,4.375],[-2.301,3.746],[3.306,1.315]],"o":[[-2.362,-1.09],[-11.537,7.255],[-2.912,3.068],[3.75,2],[1.545,2.842],[4.234,2.6],[-0.75,-4.375],[2.301,-3.746],[-21.828,-8.682]],"v":[[230.817,127.103],[222.746,135.224],[194.133,141.679],[251.038,171.564],[265.494,171.748],[267.123,177.911],[313.987,197.781],[315.654,188.56],[331.278,172.798]],"c":true}]},{"t":142,"s":[{"i":[[9.079,6.603],[5.75,-0.375],[2.5,-11.75],[-3.75,-2],[-1.401,-7.533],[-2.125,-2.25],[0.75,4.375],[-1.75,4.625],[3.219,1.515]],"o":[[-1.375,-1],[-2.965,0.193],[-0.88,4.137],[3.75,2],[1,5.375],[2.125,2.25],[-0.75,-4.375],[1.75,-4.625],[-14.875,-7]],"v":[[221.875,131.75],[214.5,133.75],[161.375,147.5],[215.25,178.625],[266.25,175.875],[241.875,192],[317.75,230.5],[315,195.875],[322.625,186.125]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.43790845684,0.918441712623,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 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":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":74,"s":[32]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83,"s":[32]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":109,"s":[32]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[25]},{"t":145,"s":[0]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","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.333,"y":0},"t":68,"s":[{"i":[[-5.078,-7.414],[0,0],[-4.826,-0.212],[0,0],[8.666,-5.868],[0,0],[-0.539,-2.191],[0,0],[7.104,2.085],[0,0],[4.552,-2.316],[0,0],[-1.305,4.248],[0,0],[-8.111,3.47],[0,0],[-0.064,0.646],[0.341,0.232],[1.488,-0.069],[0,0],[12.482,8.111],[0,0],[-9.2,0.953],[0,0],[-2.158,1.322],[0,0]],"o":[[0,0],[2.158,1.322],[0,0],[9.2,0.953],[0,0],[-2.124,1.552],[0,0],[1.357,4.417],[0,0],[-4.353,-2.483],[0,0],[-6.833,2.006],[0,0],[1.444,-6.072],[0,0],[1.162,-0.306],[0.03,-0.302],[-0.874,-0.594],[0,0],[-15.622,1.894],[0,0],[-7.058,-5.734],[0,0],[4.826,-0.212],[0,0],[5.051,-7.47]],"v":[[15.054,-56.208],[33.027,-28.627],[44.183,-26.177],[80.864,-22.965],[86.633,-8.591],[47.889,19.043],[45.323,25.244],[51.643,49.741],[37.593,55.44],[6.46,40.926],[-6.24,40.926],[-38.273,55.634],[-51.788,50.152],[-49.07,40.034],[-32.781,20.576],[15.953,7.363],[17.986,5.839],[17.55,5.105],[13.701,4.277],[-44.883,8.313],[-75.232,0.675],[-87.172,-9.026],[-80.194,-22.965],[-43.625,-26.211],[-32.469,-28.662],[-15.054,-56.208]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":72,"s":[{"i":[[-4.417,-8.95],[0,0],[-3.922,-0.57],[0,0],[7.147,-6.967],[0,0],[-0.67,-3.906],[0,0],[8.834,4.644],[0,0],[3.508,-1.844],[0,0],[-1.623,9.462],[0,0],[-9.776,4.987],[0,0],[-0.01,1.457],[0.398,0.505],[1.634,-0.228],[0,0],[6.911,6.737],[0,0],[-9.877,1.435],[0,0],[-1.754,3.554],[0,0]],"o":[[0,0],[1.754,3.554],[0,0],[9.877,1.435],[0,0],[-2.838,2.766],[0,0],[1.687,9.837],[0,0],[-3.508,-1.844],[0,0],[-8.498,4.467],[0,0],[1.796,-10.826],[0,0],[1.252,-0.746],[0.005,-0.683],[-1.021,-1.297],[0,0],[-9.559,1.334],[0,0],[-7.147,-6.967],[0,0],[3.922,-0.57],[0,0],[4.417,-8.95]],"v":[[10.798,-86.111],[31.376,-44.415],[40.443,-37.828],[86.457,-31.142],[93.131,-10.602],[59.835,21.854],[56.372,32.512],[64.232,78.34],[46.76,91.035],[5.604,69.398],[-5.604,69.398],[-47.583,91.467],[-64.389,79.257],[-61.01,58.883],[-42.61,33.738],[7.269,8.292],[9.366,4.761],[8.815,3.13],[4.493,1.451],[-54.932,9.747],[-81.04,1.184],[-93.131,-10.602],[-86.457,-31.142],[-40.443,-37.828],[-31.376,-44.415],[-10.798,-86.111]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[-5.405,-6.703],[0,0],[-3.922,-0.397],[0,0],[6.747,-6.183],[0,0],[-0.807,-3.012],[0,0],[10.645,4.087],[0,0],[11.25,-4.134],[0,0],[-2.662,8.128],[0,0],[-15.722,4.18],[0,0],[-0.01,0.931],[0.398,0.323],[1.634,-0.146],[0,0],[6.911,4.688],[0,0],[-9.877,0.999],[0,0],[-1.754,2.473],[0,0]],"o":[[0,0],[1.754,2.473],[0,0],[9.877,0.999],[0,0],[-2.219,2.407],[0,0],[2.033,8.656],[0,0],[-9.98,-4.134],[0,0],[-13.101,3.997],[0,0],[7.689,-17.845],[0,0],[1.252,-0.476],[0.005,-0.436],[-1.021,-0.828],[0,0],[-9.559,0.852],[0,0],[-7.147,-4.848],[0,0],[3.922,-0.397],[0,0],[5.425,-6.754]],"v":[[10.861,-57.64],[31.376,-35.099],[40.443,-30.515],[86.457,-25.862],[93.131,-11.568],[65.106,6.27],[62.079,14.934],[86.321,66.439],[65.268,77.609],[15.774,54.241],[-15.808,54.241],[-68.981,78.517],[-87.096,64.726],[-78.66,47.278],[-48.406,16.831],[7.269,0.673],[9.366,-1.583],[8.815,-2.624],[4.493,-3.697],[-54.932,1.602],[-81.04,-3.367],[-93.131,-11.568],[-86.457,-25.862],[-40.443,-30.515],[-31.376,-35.099],[-10.736,-57.64]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[-4.417,-8.95],[0,0],[-3.922,-0.57],[0,0],[7.147,-6.967],[0,0],[-0.67,-3.906],[0,0],[8.834,4.644],[0,0],[3.508,-1.844],[0,0],[-1.623,9.462],[0,0],[-9.776,4.987],[0,0],[-0.01,1.457],[0.398,0.505],[1.634,-0.228],[0,0],[6.911,6.737],[0,0],[-9.877,1.435],[0,0],[-1.754,3.554],[0,0]],"o":[[0,0],[1.754,3.554],[0,0],[9.877,1.435],[0,0],[-2.838,2.766],[0,0],[1.687,9.837],[0,0],[-3.508,-1.844],[0,0],[-8.498,4.467],[0,0],[1.796,-10.826],[0,0],[1.252,-0.746],[0.005,-0.683],[-1.021,-1.297],[0,0],[-9.559,1.334],[0,0],[-7.147,-6.967],[0,0],[3.922,-0.57],[0,0],[4.417,-8.95]],"v":[[10.798,-86.111],[31.376,-44.415],[40.443,-37.828],[86.457,-31.142],[93.131,-10.602],[59.835,21.854],[56.372,32.512],[64.232,78.34],[46.76,91.035],[5.604,69.398],[-5.604,69.398],[-47.583,91.467],[-64.389,79.257],[-61.01,58.883],[-42.61,33.738],[7.269,8.292],[9.366,4.761],[8.815,3.13],[4.493,1.451],[-54.932,9.747],[-81.04,1.184],[-93.131,-10.602],[-86.457,-31.142],[-40.443,-37.828],[-31.376,-44.415],[-10.798,-86.111]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[-5.078,-7.414],[0,0],[-4.826,-0.212],[0,0],[8.666,-5.868],[0,0],[-0.539,-2.191],[0,0],[7.104,2.085],[0,0],[4.552,-2.316],[0,0],[-1.305,4.248],[0,0],[-8.111,3.47],[0,0],[-0.064,0.646],[0.341,0.232],[1.488,-0.069],[0,0],[12.482,8.111],[0,0],[-9.2,0.953],[0,0],[-2.158,1.322],[0,0]],"o":[[0,0],[2.158,1.322],[0,0],[9.2,0.953],[0,0],[-2.124,1.552],[0,0],[1.357,4.417],[0,0],[-4.353,-2.483],[0,0],[-6.833,2.006],[0,0],[1.444,-6.072],[0,0],[1.162,-0.306],[0.03,-0.302],[-0.874,-0.594],[0,0],[-15.622,1.894],[0,0],[-7.058,-5.734],[0,0],[4.826,-0.212],[0,0],[5.051,-7.47]],"v":[[15.054,-56.208],[33.027,-28.627],[44.183,-26.177],[80.864,-22.965],[86.633,-8.591],[47.889,19.043],[45.323,25.244],[51.643,49.741],[37.593,55.44],[6.46,40.926],[-6.24,40.926],[-38.273,55.634],[-51.788,50.152],[-49.07,40.034],[-32.781,20.576],[10.658,7.855],[12.691,6.331],[12.254,5.598],[8.405,4.77],[-44.883,8.313],[-75.232,0.675],[-87.172,-9.026],[-80.194,-22.965],[-43.625,-26.211],[-32.469,-28.662],[-15.054,-56.208]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":105,"s":[{"i":[[-4.417,-8.95],[0,0],[-3.922,-0.57],[0,0],[7.147,-6.967],[0,0],[-0.67,-3.906],[0,0],[8.834,4.644],[0,0],[3.508,-1.844],[0,0],[-1.623,9.462],[0,0],[-9.776,4.987],[0,0],[-0.01,1.457],[0.398,0.505],[1.634,-0.228],[0,0],[6.911,6.737],[0,0],[-9.877,1.435],[0,0],[-1.754,3.554],[0,0]],"o":[[0,0],[1.754,3.554],[0,0],[9.877,1.435],[0,0],[-2.838,2.766],[0,0],[1.687,9.837],[0,0],[-3.508,-1.844],[0,0],[-8.498,4.467],[0,0],[1.796,-10.826],[0,0],[1.252,-0.746],[0.005,-0.683],[-1.021,-1.297],[0,0],[-9.559,1.334],[0,0],[-7.147,-6.967],[0,0],[3.922,-0.57],[0,0],[4.417,-8.95]],"v":[[10.798,-86.111],[31.376,-44.415],[40.443,-37.828],[86.457,-31.142],[93.131,-10.602],[59.835,21.854],[56.372,32.512],[64.232,78.34],[46.76,91.035],[5.604,69.398],[-5.604,69.398],[-47.583,91.467],[-64.389,79.257],[-61.01,58.883],[-42.61,33.738],[7.269,8.292],[9.366,4.761],[8.815,3.13],[4.493,1.451],[-54.932,9.747],[-81.04,1.184],[-93.131,-10.602],[-86.457,-31.142],[-40.443,-37.828],[-31.376,-44.415],[-10.798,-86.111]],"c":true}]},{"i":{"x":0.18,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[-4.417,-8.303],[0,0],[-3.922,-0.509],[0,0],[7.007,-6.691],[0,0],[-0.718,-3.592],[0,0],[9.47,4.449],[0,0],[6.228,-2.649],[0,0],[-1.988,8.994],[0,0],[-11.864,4.703],[0,0],[-0.01,1.272],[0.398,0.441],[1.634,-0.199],[0,0],[6.911,6.017],[0,0],[-9.877,1.282],[0,0],[-1.754,3.174],[0,0]],"o":[[0,0],[1.754,3.174],[0,0],[9.877,1.282],[0,0],[-2.621,2.64],[0,0],[1.809,9.422],[0,0],[-5.781,-2.649],[0,0],[-10.115,4.302],[0,0],[3.866,-13.292],[0,0],[1.252,-0.651],[0.005,-0.596],[-1.021,-1.132],[0,0],[-9.559,1.165],[0,0],[-7.147,-6.222],[0,0],[3.922,-0.509],[0,0],[4.417,-8.303]],"v":[[10.82,-76.11],[31.376,-41.143],[40.443,-35.259],[86.457,-29.287],[93.131,-10.941],[61.687,16.38],[58.377,26.338],[71.991,74.16],[53.261,86.319],[9.176,64.074],[-9.188,64.074],[-55.099,86.918],[-72.365,74.153],[-67.21,54.806],[-44.646,27.799],[7.269,5.616],[9.366,2.533],[8.815,1.109],[4.493,-0.357],[-54.932,6.886],[-81.04,-0.415],[-93.131,-10.941],[-86.457,-29.287],[-40.443,-35.259],[-31.376,-41.143],[-10.776,-76.11]],"c":true}]},{"t":142,"s":[{"i":[[-4.417,-8.95],[0,0],[-3.922,-0.57],[0,0],[7.147,-6.967],[0,0],[-0.67,-3.906],[0,0],[8.834,4.644],[0,0],[3.508,-1.844],[0,0],[-1.623,9.462],[0,0],[-9.776,4.987],[0,0],[-0.01,1.457],[0.398,0.505],[1.634,-0.228],[0,0],[6.911,6.737],[0,0],[-9.877,1.435],[0,0],[-1.754,3.554],[0,0]],"o":[[0,0],[1.754,3.554],[0,0],[9.877,1.435],[0,0],[-2.838,2.766],[0,0],[1.687,9.837],[0,0],[-3.508,-1.844],[0,0],[-8.498,4.467],[0,0],[1.796,-10.826],[0,0],[1.252,-0.746],[0.005,-0.683],[-1.021,-1.297],[0,0],[-9.559,1.334],[0,0],[-7.147,-6.967],[0,0],[3.922,-0.57],[0,0],[4.417,-8.95]],"v":[[10.798,-86.111],[31.376,-44.415],[40.443,-37.828],[86.457,-31.142],[93.131,-10.602],[59.835,21.854],[56.372,32.512],[64.232,78.34],[46.76,91.035],[5.604,69.398],[-5.604,69.398],[-47.583,91.467],[-64.389,79.257],[-61.01,58.883],[-42.61,33.738],[7.269,8.292],[9.366,4.761],[8.815,3.13],[4.493,1.451],[-54.932,9.747],[-81.04,1.184],[-93.131,-10.602],[-86.457,-31.142],[-40.443,-37.828],[-31.376,-44.415],[-10.798,-86.111]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.586020795037,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[0,1,0.784,0,0.5,1,0.867,0.141,1,1,0.949,0.282]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[0,0.945,0.571,0,0.5,0.973,0.658,0,1,1,0.745,0]},{"t":118,"s":[0,1,0.784,0,0.5,1,0.867,0.141,1,1,0.949,0.282]}]}},"s":{"a":0,"k":[-48.568,83.135]},"e":{"a":0,"k":[44.255,-62.599]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.015,171.312]},"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}],"ip":68,"op":186,"st":-9,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"conf1","refId":"comp_0","sr":1,"ks":{"r":{"a":0,"k":-22},"p":{"a":0,"k":[285,247,0]},"a":{"a":0,"k":[256,256,0]},"s":{"a":0,"k":[-90,90,100]}},"ao":0,"w":512,"h":512,"ip":73,"op":164,"st":-16,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"conf1","refId":"comp_0","sr":1,"ks":{"r":{"a":0,"k":4},"p":{"a":0,"k":[256,271,0]},"a":{"a":0,"k":[256,256,0]}},"ao":0,"w":512,"h":512,"ip":72,"op":160,"st":-20,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"conf2","refId":"comp_1","sr":1,"ks":{"r":{"a":0,"k":9},"p":{"a":0,"k":[247,282,0]},"a":{"a":0,"k":[256,256,0]},"s":{"a":0,"k":[80,80,100]}},"ao":0,"w":512,"h":512,"ip":66,"op":155,"st":-25,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"conf2","refId":"comp_1","sr":1,"ks":{"r":{"a":0,"k":-25},"p":{"a":0,"k":[243,245.5,0]},"a":{"a":0,"k":[256,256,0]},"s":{"a":0,"k":[-68,68,100]}},"ao":0,"w":512,"h":512,"ip":68,"op":158,"st":-22,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"conf2","refId":"comp_1","sr":1,"ks":{"r":{"a":0,"k":36},"p":{"a":0,"k":[276,238,0]},"a":{"a":0,"k":[256,256,0]},"s":{"a":0,"k":[-80,80,100]}},"ao":0,"w":512,"h":512,"ip":69,"op":159,"st":-21,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"conf 28","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[100]},{"t":148,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[116]},{"t":150,"s":[638]}]},"p":{"a":1,"k":[{"i":{"x":0.498,"y":1},"o":{"x":0.167,"y":0.167},"t":77,"s":[261.923,286.766,0],"to":[21.833,-336.792,0],"ti":[0.083,-285.042,0]},{"t":153,"s":[319.923,471.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":79,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":116,"s":[100,100,100]},{"t":143,"s":[0,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.760784373564,0.035294117647,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.941176530427,0.376470618154,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":77,"op":189,"st":-9,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"conf 27","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":145,"s":[100]},{"t":161,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":84,"s":[116]},{"t":165,"s":[455]}]},"p":{"a":1,"k":[{"i":{"x":0.488,"y":1},"o":{"x":0.167,"y":0.167},"t":84,"s":[266.423,204.266,0],"to":[74.333,-225.792,0],"ti":[-27.917,-402.542,0]},{"t":172,"s":[490.923,382.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":86,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":99.051,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":112.102,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":125.152,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":139.391,"s":[100,100,100]},{"t":156,"s":[0,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.760784373564,0.035294117647,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.941176530427,0.376470618154,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":84,"op":196,"st":-2,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"conf 26","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[100]},{"t":167,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[116]},{"t":172,"s":[448]}]},"p":{"a":1,"k":[{"i":{"x":0.466,"y":1},"o":{"x":0.167,"y":0.167},"t":79,"s":[270.423,227.766,0],"to":[13.833,-212.292,0],"ti":[-4.917,-310.042,0]},{"t":143,"s":[295.923,490.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":107.188,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":138.453,"s":[0,100,100]},{"t":167,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":79,"op":192,"st":-6,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"conf 25","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":142,"s":[100]},{"t":158,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":71,"s":[116]},{"t":163,"s":[448]}]},"p":{"a":1,"k":[{"i":{"x":0.481,"y":1},"o":{"x":0.167,"y":0.167},"t":77,"s":[278.423,174.766,0],"to":[-16.167,-299.292,0],"ti":[-0.417,-296.042,0]},{"t":160,"s":[189.923,475.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":71,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":98.5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130.125,"s":[0,100,100]},{"t":159,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":77,"op":183,"st":-15,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"conf 24","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":139,"s":[100]},{"t":155,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[116]},{"t":158,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.493,"y":1},"o":{"x":0.167,"y":0.167},"t":75,"s":[256.423,128.266,0],"to":[-33.167,-176.292,0],"ti":[26.583,-426.542,0]},{"t":150,"s":[161.923,464.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":75,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":102.334,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":128.301,"s":[0,100,100]},{"t":157,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.945098099054,0.011764706817,0.388235324037,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.317647058824,0.525490196078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":75,"op":187,"st":-11,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"conf 23","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":140,"s":[100]},{"t":156,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[116]},{"t":166,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.493,"y":1},"o":{"x":0.167,"y":0.167},"t":85,"s":[258.923,270.766,0],"to":[63.333,-182.292,0],"ti":[-38.917,-328.542,0]},{"t":173,"s":[479.923,485.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":85,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":111.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":137,"s":[0,100,100]},{"t":165,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.945098099054,0.011764706817,0.388235324037,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.317647058824,0.525490196078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":85,"op":197,"st":-1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"conf 22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[100]},{"t":122,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[116]},{"t":132,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.493,"y":1},"o":{"x":0.167,"y":0.167},"t":72,"s":[260.923,262.266,0],"to":[-106.667,-267.292,0],"ti":[37.583,-245.042,0]},{"t":150,"s":[34.923,482.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":97.334,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121.4,"s":[0,100,100]},{"t":148,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":72,"op":184,"st":-14,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"conf 21","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":142,"s":[100]},{"t":158,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[116]},{"t":162,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.478,"y":1},"o":{"x":0.167,"y":0.167},"t":80,"s":[272.423,251.766,0],"to":[91.333,-292.792,0],"ti":[-37.417,-262.042,0]},{"t":164,"s":[489.423,462.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":107.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":133.949,"s":[0,100,100]},{"t":163,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":80,"op":192,"st":-6,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"conf 20","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":143,"s":[100]},{"t":159,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[116]},{"t":164,"s":[448]}]},"p":{"a":1,"k":[{"i":{"x":0.456,"y":1},"o":{"x":0.167,"y":0.167},"t":78,"s":[290.923,243.266,0],"to":[21.833,-270.792,0],"ti":[-0.417,-296.042,0]},{"t":148,"s":[397.923,455.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":99.5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":131.125,"s":[0,100,100]},{"t":160,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":78,"op":184,"st":-14,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"conf 19","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":131,"s":[100]},{"t":146,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[642]},{"t":159,"s":[1047]}]},"p":{"a":1,"k":[{"i":{"x":0.465,"y":1},"o":{"x":0.167,"y":0.167},"t":76,"s":[265.923,228.766,0],"to":[52.333,-383.292,0],"ti":[-8.417,-261.542,0]},{"t":155,"s":[449.923,414.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":78.627,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":96.529,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":114.432,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":132.334,"s":[0,100,100]},{"t":151.86328125,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.274509803922,0.870588295133,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705882353,0.968627510819,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":76,"op":188,"st":-10,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"conf 9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":122,"s":[100]},{"t":137,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[484]},{"t":147,"s":[823]}]},"p":{"a":1,"k":[{"i":{"x":0.465,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[261.923,252.766,0],"to":[-78.667,-319.792,0],"ti":[21.583,-363.542,0]},{"t":137,"s":[84.423,422.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72.766,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90.666,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":108.568,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":126.471,"s":[0,100,100]},{"t":146,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.274509803922,0.870588295133,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705882353,0.968627510819,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":67,"op":179,"st":-19,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"conf 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":125,"s":[100]},{"t":140,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[348]},{"t":150,"s":[687]}]},"p":{"a":1,"k":[{"i":{"x":0.469,"y":1},"o":{"x":0.167,"y":0.167},"t":74,"s":[267.923,198.766,0],"to":[69.333,-217.292,0],"ti":[-30.417,-249.042,0]},{"t":151,"s":[420.923,419.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":87,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":98,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":109,"s":[0,100,100]},{"t":121,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.603921568627,0.313725490196,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.682352941176,0.482352971096,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":74,"op":186,"st":-12,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"conf 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":121,"s":[100]},{"t":136,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[348]},{"t":123,"s":[687]}]},"p":{"a":1,"k":[{"i":{"x":0.484,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[299.423,244.266,0],"to":[40.833,-175.792,0],"ti":[-8.417,-207.042,0]},{"t":133,"s":[383.423,482.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":68,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":85.902,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":103.805,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121.705,"s":[0,100,100]},{"t":141.234375,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.603921568627,0.313725490196,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.682352941176,0.482352971096,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":66,"op":178,"st":-20,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"conf 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":129,"s":[100]},{"t":145,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":71,"s":[246]},{"t":139,"s":[585]}]},"p":{"a":1,"k":[{"i":{"x":0.469,"y":1},"o":{"x":0.167,"y":0.167},"t":71,"s":[248.423,264.766,0],"to":[-38.667,-226.792,0],"ti":[10.583,-349.042,0]},{"t":148,"s":[117.923,487.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76.766,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94.666,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":112.568,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130.471,"s":[0,100,100]},{"t":150,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.760784373564,0.035294117647,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.941176530427,0.376470618154,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":71,"op":183,"st":-15,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"conf 14","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[100]},{"t":148,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[116]},{"t":150,"s":[638]}]},"p":{"a":1,"k":[{"i":{"x":0.472,"y":1},"o":{"x":0.167,"y":0.167},"t":77,"s":[261.923,286.766,0],"to":[21.833,-336.792,0],"ti":[0.083,-285.042,0]},{"t":161,"s":[319.923,471.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":79,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":116,"s":[100,100,100]},{"t":143,"s":[0,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.760784373564,0.035294117647,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.941176530427,0.376470618154,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":77,"op":189,"st":-9,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"conf 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":127,"s":[100]},{"t":143,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[116]},{"t":147,"s":[455]}]},"p":{"a":1,"k":[{"i":{"x":0.463,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[266.423,204.266,0],"to":[74.333,-225.792,0],"ti":[-27.917,-402.542,0]},{"t":141,"s":[490.923,382.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":68,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":81.051,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94.102,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":107.152,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121.391,"s":[100,100,100]},{"t":138,"s":[0,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.671,3.292],[4.541,3.295],[-3.556,-1.371],[2.31,-3.983]],"o":[[1.046,-5.133],[-3.55,-2.576],[6.92,2.668],[-2.353,4.058]],"v":[[1.937,6.851],[-2.087,-7.406],[4.036,-12.108],[11.105,4.941]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.760784373564,0.035294117647,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.941176530427,0.376470618154,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":66,"op":178,"st":-20,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"conf 18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":145,"s":[100]},{"t":161,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[116]},{"t":166,"s":[448]}]},"p":{"a":1,"k":[{"i":{"x":0.443,"y":1},"o":{"x":0.167,"y":0.167},"t":73,"s":[270.423,227.766,0],"to":[13.833,-212.292,0],"ti":[-4.917,-310.042,0]},{"t":163,"s":[295.923,490.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":74,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":101.188,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":132.453,"s":[0,100,100]},{"t":161,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":73,"op":186,"st":-12,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"conf 12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":133,"s":[100]},{"t":149,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[116]},{"t":154,"s":[448]}]},"p":{"a":1,"k":[{"i":{"x":0.456,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[278.423,174.766,0],"to":[-16.167,-299.292,0],"ti":[-0.417,-296.042,0]},{"t":155,"s":[189.923,475.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":62,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":89.5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121.125,"s":[0,100,100]},{"t":150,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":68,"op":174,"st":-24,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"conf 17","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":129,"s":[100]},{"t":145,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[116]},{"t":148,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.467,"y":1},"o":{"x":0.167,"y":0.167},"t":65,"s":[256.423,128.266,0],"to":[-33.167,-176.292,0],"ti":[26.583,-426.542,0]},{"t":143,"s":[161.923,464.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":92.334,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":118.301,"s":[0,100,100]},{"t":147,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.945098099054,0.011764706817,0.388235324037,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.317647058824,0.525490196078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":65,"op":177,"st":-21,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"conf 16","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":131,"s":[100]},{"t":147,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[116]},{"t":157,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.467,"y":1},"o":{"x":0.167,"y":0.167},"t":76,"s":[258.923,270.766,0],"to":[63.333,-182.292,0],"ti":[-38.917,-328.542,0]},{"t":154,"s":[479.923,485.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":102.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":128,"s":[0,100,100]},{"t":156,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.945098099054,0.011764706817,0.388235324037,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.317647058824,0.525490196078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":76,"op":188,"st":-10,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"conf 15","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[100]},{"t":119,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[116]},{"t":129,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.467,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[260.923,262.266,0],"to":[-106.667,-267.292,0],"ti":[37.583,-245.042,0]},{"t":133,"s":[34.923,482.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":69,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94.334,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":118.4,"s":[0,100,100]},{"t":145,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":69,"op":181,"st":-17,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"conf 11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":128,"s":[100]},{"t":144,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[116]},{"t":148,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.454,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[272.423,251.766,0],"to":[91.333,-292.792,0],"ti":[-37.417,-262.042,0]},{"t":150,"s":[489.423,462.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":93.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":119.949,"s":[0,100,100]},{"t":149,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.431372578939,0.886274569642,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.580392156863,1,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":66,"op":178,"st":-20,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"conf 10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":127,"s":[100]},{"t":143,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[116]},{"t":147,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.454,"y":1},"o":{"x":0.167,"y":0.167},"t":65,"s":[258.923,253.766,0],"to":[-54.667,-224.792,0],"ti":[37.083,-264.042,0]},{"t":141,"s":[110.923,423.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":92.334,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":118.301,"s":[0,100,100]},{"t":147,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.941176530427,0,0.384313755409,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.317647058824,0.525490196078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":65,"op":177,"st":-21,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"conf 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":133,"s":[100]},{"t":149,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[116]},{"t":153,"s":[280]}]},"p":{"a":1,"k":[{"i":{"x":0.454,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[226.423,179.266,0],"to":[-83.667,-162.792,0],"ti":[38.583,-315.542,0]},{"t":154,"s":[15.423,401.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":70,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":96.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":122,"s":[0,100,100]},{"t":150,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.361,4.914],[3.117,-4.975]],"o":[[3.361,-4.914],[-3.117,4.975]],"v":[[-7.386,-3.973],[10.654,3.435]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.941176530427,0,0.384313755409,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.317647058824,0.525490196078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":70,"op":182,"st":-16,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"conf 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":131,"s":[100]},{"t":147,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"t":147,"s":[164]}]},"p":{"a":1,"k":[{"i":{"x":0.46,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[255.423,267.266,0],"to":[-112.167,-200.292,0],"ti":[42.583,-300.042,0]},{"t":134,"s":[26.923,448.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":94.334,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":121.25,"s":[0,100,100]},{"t":151,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.563,7.504],[4.72,-6.451]],"o":[[3.005,-6.328],[-4.539,6.204]],"v":[[-5.366,-3.126],[5.981,2.559]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.396078437567,0.439215689898,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196079016,0.556862771511,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":66,"op":178,"st":-20,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"conf 13","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[100]},{"t":154,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[0]},{"t":154,"s":[164]}]},"p":{"a":1,"k":[{"i":{"x":0.46,"y":1},"o":{"x":0.167,"y":0.167},"t":76,"s":[254.423,254.766,0],"to":[-38.667,-199.292,0],"ti":[67.583,-482.042,0]},{"t":166,"s":[24.423,376.016,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":101.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":126.051,"s":[0,100,100]},{"t":153,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.563,7.504],[4.72,-6.451]],"o":[[3.005,-6.328],[-4.539,6.204]],"v":[[-5.366,-3.126],[5.981,2.559]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.274509803922,0.870588295133,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705882353,0.968627510819,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":76,"op":188,"st":-10,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"conf 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[100]},{"t":148,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[0]},{"t":148,"s":[164]}]},"p":{"a":1,"k":[{"i":{"x":0.46,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[265.923,218.766,0],"to":[32.333,-265.292,0],"ti":[-53.417,-379.542,0]},{"t":151,"s":[411.423,449.516,0]}]},"a":{"a":0,"k":[414.423,263.016,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":70,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":95.666,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120.051,"s":[0,100,100]},{"t":147,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.563,7.504],[4.72,-6.451]],"o":[[3.005,-6.328],[-4.539,6.204]],"v":[[-5.366,-3.126],[5.981,2.559]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.396078437567,0.439215689898,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.722},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196079016,0.556862771511,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[414.423,263.016]},"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":70,"op":182,"st":-16,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"B1","parent":46,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.76],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[5.926]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[-17.329]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[-0.014]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[-36.997]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[8]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[-61]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":49,"s":[8]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":54,"s":[-61]},{"t":62,"s":[8]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[238.711,241.224,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[235.079,237.546,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[242.04,242.629,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[236.419,238.279,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[247.58,244.08,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[233.804,236.255,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[254.825,247.846,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[227.154,235.829,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[254.825,247.846,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[227.154,235.829,0]}]},"a":{"a":0,"k":[238.711,241.224,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[{"i":[[0.271,4.032],[4.729,-7.592],[-3.857,-1.928]],"o":[[-0.241,-3.58],[-4.459,7.16],[11.141,5.568]],"v":[[25.449,-3.352],[-23.122,-11.063],[-21.073,12.481]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[0.706,2.931],[3.854,-6.284],[-4.025,-0.858]],"o":[[-0.627,-2.603],[-3.635,5.926],[11.626,2.479]],"v":[[26.518,-1.204],[-23.086,-1.726],[-18.842,18.944]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[-0.407,2.133],[4.975,-3.774],[-3.975,-0.487]],"o":[[0.82,-4.296],[-6.019,4.566],[11.484,1.406]],"v":[[19.757,0.46],[-21.697,-2.938],[-26.915,17.524]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[0.706,2.931],[3.854,-6.284],[-3.899,-1.317]],"o":[[-0.627,-2.603],[-3.635,5.926],[12.53,4.233]],"v":[[27.216,-1.062],[-23.086,-1.726],[-18.842,18.944]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0.604,2.227],[4.975,-4.029],[-3.975,-0.52]],"o":[[-0.536,-1.977],[-6.019,4.875],[11.484,1.502]],"v":[[19.757,-1.013],[-19.627,2.793],[-26.915,17.206]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[{"i":[[0.706,2.931],[3.854,-6.284],[-4.025,-0.858]],"o":[[-0.627,-2.603],[-3.635,5.926],[11.626,2.479]],"v":[[26.518,-1.204],[-23.086,-1.726],[-18.842,18.944]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[0.604,2.227],[4.975,-4.029],[-3.975,-0.52]],"o":[[-0.536,-1.977],[-6.019,4.875],[11.484,1.502]],"v":[[19.757,-1.013],[-19.627,2.793],[-26.915,17.206]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[0.706,2.931],[3.854,-6.284],[-4.025,-0.858]],"o":[[-0.627,-2.603],[-3.635,5.926],[11.626,2.479]],"v":[[26.518,-1.204],[-23.086,-1.726],[-18.842,18.944]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[0.604,2.227],[4.975,-4.029],[-3.975,-0.52]],"o":[[-0.536,-1.977],[-6.019,4.875],[11.484,1.502]],"v":[[19.757,-1.013],[-19.627,2.793],[-26.915,17.206]],"c":true}]},{"t":62,"s":[{"i":[[0.706,2.931],[3.854,-6.284],[-4.025,-0.858]],"o":[[-0.627,-2.603],[-3.635,5.926],[11.626,2.479]],"v":[[26.518,-1.204],[-23.086,-1.726],[-18.842,18.944]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.870588302612,0.423529446125,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.953,0.545,0,0.5,0.976,0.661,0.065,1,1,0.776,0.129]}},"s":{"a":0,"k":[-0.629,-6.878]},"e":{"a":0,"k":[3.349,17.709]},"t":1,"nm":"Gradient Fill 1dsh","hd":false},{"ty":"tr","p":{"a":0,"k":[217.076,247.324]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[{"i":[[0,0],[-2.231,-6.286],[0,0],[0,0],[2.076,10.602],[-1.245,0.762]],"o":[[0,0],[2.767,7.797],[0,0],[0,0],[-1.817,-9.276],[1.491,-0.912]],"v":[[-1.834,-17.783],[0.107,-2.868],[7.354,8.024],[1.299,17.783],[-6.213,1.035],[-6.173,-16.845]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[0,0],[-3.368,-5.819],[0,0],[0,0],[3.351,9.061],[-0.841,1.957]],"o":[[0,0],[3.368,5.819],[0,0],[0,0],[-3.351,-9.061],[0.841,-1.957]],"v":[[-4.279,-3.314],[0.134,9.41],[9.793,19.594],[2.635,29.965],[-5.228,15.891],[-8.105,-1.131]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[0,0],[-2.216,-8.51],[0,0],[0,0],[2.986,13.657],[-1.031,1.149]],"o":[[0,0],[3.129,12.02],[0,0],[0,0],[-1.92,-8.78],[2.525,-2.815]],"v":[[-0.984,-9.774],[0.416,3.994],[5.85,19.168],[0.475,29.732],[-7.545,9.546],[-7.958,-6.631]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[0,0],[-3.463,-6.205],[0,0],[0,0],[2.042,6.913],[-0.981,2.433]],"o":[[0,0],[3.463,6.205],[0,0],[0,0],[-2.042,-6.913],[0.981,-2.433]],"v":[[-2.785,-3.444],[0.966,8.729],[9.793,19.594],[2.635,29.965],[-4.986,14.81],[-6.432,-0.928]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[-2.05,-12.037],[0,0],[0,0],[1.952,14.778],[-0.961,1.29]],"o":[[0,0],[2.221,13.047],[0,0],[0,0],[-1.618,-12.253],[2.354,-3.16]],"v":[[0.123,-19.964],[0.65,0.363],[7.919,24.829],[0.702,34.347],[-7.311,6.29],[-6.653,-16.173]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[{"i":[[0,0],[-2.771,-4.233],[0,0],[0,0],[2.788,5.382],[-0.841,1.957]],"o":[[0,0],[2.771,4.233],[0,0],[0,0],[-2.788,-5.382],[0.841,-1.957]],"v":[[-4.766,3.066],[-1.87,10.429],[6.923,18.043],[2.516,26.447],[-7.059,15.968],[-8.592,5.25]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[0,0],[-2.05,-12.038],[0,0],[0,0],[1.952,14.778],[-0.961,1.29]],"o":[[0,0],[2.221,13.047],[0,0],[0,0],[-1.618,-12.253],[2.354,-3.16]],"v":[[0.123,-19.964],[0.65,0.363],[7.919,24.829],[0.702,34.347],[-7.311,6.29],[-6.653,-16.173]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[0,0],[-2.771,-4.233],[0,0],[0,0],[2.788,5.382],[-0.841,1.957]],"o":[[0,0],[2.771,4.233],[0,0],[0,0],[-2.788,-5.382],[0.841,-1.957]],"v":[[-4.766,3.066],[-1.87,10.429],[6.923,18.043],[2.516,26.447],[-7.059,15.968],[-8.592,5.25]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[0,0],[-2.05,-12.037],[0,0],[0,0],[1.952,14.778],[-0.961,1.29]],"o":[[0,0],[2.221,13.047],[0,0],[0,0],[-1.618,-12.253],[2.354,-3.16]],"v":[[0.123,-19.964],[0.65,0.363],[7.919,24.829],[0.702,34.347],[-7.311,6.29],[-6.653,-16.173]],"c":true}]},{"t":62,"s":[{"i":[[0,0],[-2.771,-4.233],[0,0],[0,0],[2.788,5.382],[-0.841,1.957]],"o":[[0,0],[2.771,4.233],[0,0],[0,0],[-2.788,-5.382],[0.841,-1.957]],"v":[[-4.766,3.066],[-1.87,10.429],[6.923,18.043],[2.516,26.447],[-7.059,15.968],[-8.592,5.25]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.960784316063,0.800000011921,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[189.219,224.193]},"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.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[{"i":[[17.355,4.131],[-9.846,15.788],[-7.67,-5.276],[4.158,-12.805]],"o":[[-13.657,-3.25],[9.853,-15.799],[8.407,5.783],[-1.697,5.227]],"v":[[-20.932,31.717],[-32.503,-27.212],[20.92,-11.895],[36.015,10.101]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[17.619,0.514],[-8.026,13.069],[-13.057,-5.942],[2.393,-5.026]],"o":[[-13.864,-0.405],[8.032,-13.078],[9.637,4.385],[-2.393,5.026]],"v":[[-15.674,34.992],[-32.313,-12.779],[21.33,-5.741],[36.589,9.923]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[11.923,1.781],[-12.065,13.275],[-12.158,-6.848],[2.866,-7.428]],"o":[[-13.863,-2.071],[13.677,-15.049],[9.713,5.471],[-0.853,2.212]],"v":[[-20.932,31.838],[-33.325,-18.451],[17.32,-8.56],[30.512,10.643]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[17.619,0.514],[-7.722,18.113],[-13.057,-5.942],[2.393,-5.026]],"o":[[-13.864,-0.405],[6.019,-14.119],[9.637,4.385],[-2.393,5.026]],"v":[[-13.778,33.364],[-30.717,-12.32],[21.329,-5.741],[36.589,9.923]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[11.923,1.902],[-12.135,14.104],[-11.582,-11.188],[2.866,-7.931]],"o":[[-13.863,-2.211],[16.542,-19.227],[7.339,7.089],[-0.853,2.362]],"v":[[-20.932,31.717],[-32.503,-27.212],[17.734,-12.743],[30.512,9.089]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[{"i":[[17.619,0.514],[-8.026,13.069],[-8.161,-2.77],[1.526,-7.354]],"o":[[-13.864,-0.405],[8.032,-13.078],[8.945,3.036],[-0.863,4.158]],"v":[[-15.674,34.992],[-32.8,-6.398],[21.476,-3.363],[37.268,11.152]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[11.923,1.902],[-12.135,14.104],[-11.582,-11.188],[2.866,-7.931]],"o":[[-13.863,-2.211],[16.542,-19.227],[7.339,7.089],[-0.853,2.362]],"v":[[-20.932,31.717],[-32.503,-27.212],[17.734,-12.744],[30.512,9.089]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[17.619,0.514],[-8.026,13.069],[-8.161,-2.77],[1.526,-7.354]],"o":[[-13.864,-0.405],[8.032,-13.078],[8.945,3.036],[-0.863,4.158]],"v":[[-15.674,34.992],[-32.8,-6.398],[21.476,-3.363],[37.268,11.152]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[11.923,1.902],[-12.135,14.104],[-11.582,-11.188],[2.866,-7.931]],"o":[[-13.863,-2.211],[16.542,-19.227],[7.339,7.089],[-0.853,2.362]],"v":[[-20.932,31.717],[-32.503,-27.212],[17.734,-12.743],[30.512,9.089]],"c":true}]},{"t":62,"s":[{"i":[[17.619,0.514],[-8.026,13.069],[-8.161,-2.77],[1.526,-7.354]],"o":[[-13.864,-0.405],[8.032,-13.078],[8.945,3.036],[-0.863,4.158]],"v":[[-15.674,34.992],[-32.8,-6.398],[21.476,-3.363],[37.268,11.152]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.917647063732,0.521568655968,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.92549020052,0.20000000298,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[210.306,235.937]},"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}],"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":"B0","parent":61,"sr":1,"ks":{"p":{"a":0,"k":[261.125,232.287,0]},"a":{"a":0,"k":[261.125,232.287,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.857,-1.917],[-14.445,-11.551]],"o":[[-10.857,1.917],[0,0]],"v":[[9.781,-15.453],[-2.694,15.765]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.976470589638,0.57647061348,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[253.264,237.501]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[10.68,-39.339]],"o":[[0,0],[0,0]],"v":[[-16.689,-15.217],[15.235,16.192]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.976470589638,0.57647061348,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.21,235.112]},"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":[[-7.475,29.918],[-5.895,13.556]],"o":[[10.4,13.168],[5.667,29.931]],"v":[[-25.765,-10.684],[25.78,-12.572]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.807843148708,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[261.552,241.106]},"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":0,"k":{"i":[[15,-5.178],[-1.896,-22.156]],"o":[[12.875,-11.678],[-6.084,-12.531]],"v":[[-23.792,0.948],[23.354,11.239]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.960784316063,0.800000011921,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[264.355,220.383]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.317,-28.267],[0.607,27.929]],"o":[[1.317,28.267],[-0.632,-29.06]],"v":[[28.754,-1.19],[-28.056,1.728]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.976470589638,0.57647061348,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.92549020052,0.20000000298,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[261.125,232.547]},"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 6","bm":0,"hd":false}],"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":"B2","parent":46,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.76],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[12.593]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[-6.949]},{"i":{"x":[0.667],"y":[0.192]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[9.422]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[-0.639]},"t":31,"s":[-19.335]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[17]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[-38]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":49,"s":[28]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":54,"s":[-38]},{"t":62,"s":[28]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[282.057,234.639,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[285.056,237.659,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[277.306,230.949,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.192},"o":{"x":0.333,"y":0},"t":24,"s":[283.318,236.255,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.622},"t":31,"s":[274.635,227.396,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[286.106,238.717,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[269,221.645,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[290.014,240.349,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[269,221.645,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[290.014,240.349,0]}]},"a":{"a":0,"k":[282.057,234.639,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[{"i":[[-1.794,5.269],[-7.764,0.493],[4.171,-9.069]],"o":[[1.687,-4.957],[5.424,-0.344],[-3.736,8.123]],"v":[[-26.825,9.841],[18.191,-13.772],[25.482,7.638]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.794,4.243],[-7.764,0.397],[4.171,-7.303]],"o":[[1.687,-3.992],[5.424,-0.277],[-3.736,6.542]],"v":[[-31.138,4.618],[16.446,-16.429],[22.927,4.127]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[-0.933,2.661],[-7.764,0.493],[3.516,-4.119]],"o":[[0.933,-2.661],[5.424,-0.344],[-3.516,4.119]],"v":[[-27.499,11.049],[22.43,-7.944],[25.204,6.758]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[-1.794,4.243],[-7.764,0.397],[4.171,-7.303]],"o":[[1.687,-3.992],[5.424,-0.277],[-3.736,6.542]],"v":[[-31.138,4.618],[16.446,-16.429],[22.927,4.127]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[-0.933,2.661],[-7.764,0.493],[3.516,-4.119]],"o":[[0.933,-2.661],[5.424,-0.344],[-3.516,4.119]],"v":[[-27.499,11.049],[22.43,-7.944],[25.204,6.758]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[{"i":[[-1.54,3.924],[-7.724,0.864],[3.733,-6.825]],"o":[[1.449,-3.692],[5.396,-0.603],[-3.344,6.114]],"v":[[-29.992,4.509],[16.253,-17.486],[23.929,0.533]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[-0.933,2.661],[-7.764,0.493],[3.516,-4.119]],"o":[[0.933,-2.661],[5.424,-0.344],[-3.516,4.119]],"v":[[-25.586,11.827],[15.659,2.183],[14.892,11.327]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[-1.54,3.924],[-7.724,0.864],[3.733,-6.825]],"o":[[1.449,-3.692],[5.396,-0.603],[-3.344,6.114]],"v":[[-29.992,4.509],[15.57,-22.999],[23.246,-4.98]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[-0.933,2.661],[-7.764,0.493],[3.516,-4.119]],"o":[[0.933,-2.661],[5.424,-0.344],[-3.516,4.119]],"v":[[-25.586,11.827],[11.725,4.649],[10.958,13.793]],"c":true}]},{"t":62,"s":[{"i":[[-1.54,3.924],[-7.724,0.864],[3.733,-6.825]],"o":[[1.449,-3.692],[5.396,-0.603],[-3.344,6.114]],"v":[[-29.992,4.509],[15.57,-22.999],[23.246,-4.98]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.870588302612,0.423529446125,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.953,0.545,0,0.5,0.976,0.661,0.065,1,1,0.776,0.129]}},"s":{"a":0,"k":[-0.93,-4.373]},"e":{"a":0,"k":[1.239,17.442]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[312.377,234.819]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[{"i":[[0,0],[-5.862,-11.025],[0,0],[0,0],[7.763,14.057],[3.752,-0.162]],"o":[[0,0],[5.622,10.574],[0,0],[0,0],[-4.235,-7.668],[-2.144,0.093]],"v":[[-11.655,-13.561],[-1.859,-2.991],[2.037,13.455],[11.421,15.58],[5.667,-4.19],[-5.99,-15.575]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[0,0],[-3.263,-5.25],[0,0],[0,0],[4.928,7.287],[3.752,-0.131]],"o":[[0,0],[3.263,5.25],[0,0],[0,0],[-3.026,-4.474],[-2.144,0.075]],"v":[[-11.655,-8.417],[-4.314,-0.638],[0.292,10.631],[9.676,12.342],[3.648,-2.102],[-5.99,-10.039]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[0,0],[-7.957,-9.623],[0,0],[0,0],[10.98,12.83],[3.643,-0.913]],"o":[[0,0],[7.632,9.229],[0,0],[0,0],[-5.696,-6.655],[-2.082,0.522]],"v":[[-16.489,-7.155],[-3.269,1.707],[6.276,19.283],[15.66,21.408],[3.863,-0.98],[-11.344,-10.265]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[0,0],[-3.263,-5.25],[0,0],[0,0],[4.928,7.287],[3.752,-0.131]],"o":[[0,0],[3.263,5.25],[0,0],[0,0],[-3.026,-4.474],[-2.144,0.075]],"v":[[-11.655,-8.417],[-4.314,-0.638],[0.292,10.631],[9.676,12.342],[3.648,-2.102],[-5.99,-10.039]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[-7.957,-9.623],[0,0],[0,0],[10.98,12.83],[3.643,-0.913]],"o":[[0,0],[7.632,9.229],[0,0],[0,0],[-5.696,-6.655],[-2.082,0.522]],"v":[[-16.489,-7.155],[-3.269,1.707],[6.276,19.283],[15.66,21.408],[3.863,-0.98],[-11.344,-10.265]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[{"i":[[0,0],[-3.565,-4.497],[0,0],[0,0],[5.346,6.216],[3.737,-0.363]],"o":[[0,0],[3.565,4.497],[0,0],[0,0],[-3.282,-3.816],[-2.135,0.207]],"v":[[-12.894,-6.573],[-5.112,-0.074],[0.147,9.735],[9.611,10.657],[2.747,-1.908],[-7.337,-8.399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[0,0],[-7.957,-9.623],[0,0],[0,0],[10.98,12.83],[3.643,-0.913]],"o":[[0,0],[7.632,9.229],[0,0],[0,0],[-5.696,-6.655],[-2.082,0.522]],"v":[[-25.281,1.044],[-12.061,9.906],[-2.516,27.483],[3.025,27.076],[-5.265,8.296],[-19.781,-1.99]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[0,0],[-1.825,-1.713],[0,0],[0,0],[1.86,1.829],[3.737,-0.363]],"o":[[0,0],[1.825,1.713],[0,0],[0,0],[-1.86,-1.829],[-2.135,0.207]],"v":[[-12.894,-6.573],[-5.816,-1.363],[-0.536,4.223],[8.928,5.144],[1.195,-3.471],[-7.337,-8.399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[0,0],[-7.957,-9.623],[0,0],[0,0],[10.98,12.83],[3.643,-0.913]],"o":[[0,0],[7.632,9.229],[0,0],[0,0],[-5.696,-6.655],[-2.082,0.522]],"v":[[-29.215,3.511],[-15.995,12.372],[-6.45,29.949],[-0.909,29.542],[-9.199,10.762],[-23.715,0.477]],"c":true}]},{"t":62,"s":[{"i":[[0,0],[-1.825,-1.713],[0,0],[0,0],[1.86,1.829],[3.737,-0.363]],"o":[[0,0],[1.825,1.713],[0,0],[0,0],[-1.86,-1.829],[-2.135,0.207]],"v":[[-12.894,-6.573],[-5.816,-1.363],[-0.536,4.223],[8.928,5.144],[1.195,-3.471],[-7.337,-8.399]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.960784316063,0.800000011921,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[324.987,208.448]},"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.667,"y":1},"o":{"x":0.76,"y":0},"t":0,"s":[{"i":[[-4.585,14.569],[13.559,-3.924],[6.207,-9.982],[-6.81,-3.786]],"o":[[5.785,-18.381],[-12.51,3.621],[-4.503,7.242],[5.747,3.196]],"v":[[34.488,21.309],[5.923,-29.703],[-32.584,4.993],[-29.692,25.233]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-4.585,11.733],[13.559,-3.16],[6.207,-8.039],[-6.81,-3.049]],"o":[[5.785,-14.803],[-12.51,2.916],[-4.503,5.832],[5.747,2.573]],"v":[[30.158,16.643],[5.923,-23.702],[-33.488,4.736],[-34.005,19.863]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[-8.062,12.973],[12.494,-6.568],[6.207,-9.982],[-6.81,-3.786]],"o":[[6.37,-10.25],[-11.528,6.06],[-4.503,7.242],[5.747,3.196]],"v":[[31.853,17.757],[0.129,-23.946],[-32.584,4.993],[-29.692,25.233]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[-4.585,11.733],[13.559,-3.16],[6.207,-8.039],[-6.81,-3.049]],"o":[[5.785,-14.803],[-12.51,2.916],[-4.503,5.832],[5.747,2.573]],"v":[[30.158,16.643],[5.923,-23.702],[-33.488,4.736],[-34.005,19.863]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[-8.062,12.973],[12.494,-6.568],[6.207,-9.982],[-6.81,-3.786]],"o":[[6.37,-10.25],[-11.528,6.06],[-4.503,7.242],[5.747,3.196]],"v":[[31.853,17.757],[0.129,-23.946],[-32.584,4.993],[-29.692,25.233]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[{"i":[[-3.886,10.826],[13.344,-3.722],[5.721,-7.618],[-6.974,-2.29]],"o":[[4.902,-13.659],[-12.312,3.434],[-4.15,5.527],[5.886,1.933]],"v":[[31.023,12.878],[4.467,-21.734],[-33.187,6.358],[-32.814,19.963]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[-8.062,12.973],[12.494,-6.568],[6.207,-9.982],[-6.81,-3.786]],"o":[[6.37,-10.25],[-11.528,6.06],[-4.503,7.242],[5.747,3.196]],"v":[[20.647,21.734],[-8.663,-15.747],[-37.038,8.252],[-29.692,25.233]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[-3.886,10.826],[13.344,-3.722],[5.721,-7.618],[-6.974,-2.29]],"o":[[4.902,-13.659],[-12.312,3.434],[-4.15,5.527],[5.886,1.933]],"v":[[30.34,7.365],[4.467,-21.734],[-33.187,6.358],[-32.814,19.963]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[-8.062,12.973],[12.494,-6.568],[6.207,-9.982],[-6.81,-3.786]],"o":[[6.37,-10.25],[-11.528,6.06],[-4.503,7.242],[5.747,3.196]],"v":[[16.713,24.201],[-12.597,-13.28],[-37.038,8.252],[-29.692,25.233]],"c":true}]},{"t":62,"s":[{"i":[[-3.886,10.826],[13.344,-3.722],[5.721,-7.618],[-6.974,-2.29]],"o":[[4.902,-13.659],[-12.312,3.434],[-4.15,5.527],[5.886,1.933]],"v":[[30.34,7.365],[4.467,-21.734],[-33.187,6.358],[-32.814,19.963]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.917647063732,0.521568655968,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.92549020052,0.20000000298,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[311.085,220.184]},"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}],"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":"L4","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[261.133,331.925,0]},"a":{"a":0,"k":[261.133,331.925,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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[0,0],[-6.612,-4.372],[-6.666,-1.21],[-1.989,0.783],[0,0],[10.878,5.184],[0.421,3.535]],"o":[[0,0],[6.511,4.305],[6.937,1.259],[1.113,-0.438],[0,0],[-7.258,-3.459],[-0.421,-3.535]],"v":[[-21.957,-19.683],[-13.429,-5.477],[8.693,4.596],[20.064,4.221],[20.252,16.217],[-4.389,9.383],[-21.152,-2.652]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[-3.963,-4.244],[-4.558,-1.323],[-1.717,0.82],[0,0],[7.162,4.626],[0.605,3.383]],"o":[[0,0],[5.568,4.46],[4.577,1.443],[0.953,-0.455],[0,0],[-7.162,-4.626],[-0.605,-3.383]],"v":[[-25.072,-26.456],[-19.087,-14.28],[-1.514,-3.88],[11.091,-2.155],[11.123,13.066],[-10.181,2.599],[-23.507,-8.613]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0,0],[-6.269,-4.223],[-6.015,-1.106],[-2.269,0.977],[0,0],[15.665,5.569],[0.679,3.868]],"o":[[0,0],[7.309,4.923],[6.015,1.106],[1.269,-0.547],[0,0],[-8.847,-3.145],[-0.679,-3.868]],"v":[[-11.873,-12.02],[-3.981,-1.281],[19.367,7.27],[34.813,7.769],[34.933,21.403],[3.891,14.632],[-10.961,4.838]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0,0],[-3.848,-4.349],[-4.521,-1.445],[-1.737,0.778],[0,0],[7.035,4.817],[0.514,3.398]],"o":[[0,0],[5.446,4.608],[4.536,1.566],[0.965,-0.43],[0,0],[-7.035,-4.817],[-0.514,-3.398]],"v":[[-28.185,-27.943],[-22.53,-15.61],[-5.243,-4.742],[6.095,-3.255],[5.717,11.961],[-14.082,1.501],[-27.101,-10.065]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0,0],[-6.501,-3.856],[-6.385,-0.644],[-2.269,0.977],[0,0],[15.776,5.246],[0.651,1.902]],"o":[[0,0],[4.385,2.601],[6.085,0.614],[1.269,-0.547],[0,0],[-8.603,-2.861],[-0.961,-2.807]],"v":[[-4.669,-5.372],[2.987,4.562],[26.985,10.762],[42.762,10.251],[42.386,23.969],[10.186,17.804],[-3.992,10.681]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[-3.451,-3.382],[-3.29,-0.594],[-1.195,0.317],[0,0],[6.437,4.263],[0.538,2.074]],"o":[[0,0],[2.97,2.91],[3.936,0.711],[0.242,1.162],[0,0],[-5.316,-3.52],[-0.604,-2.332]],"v":[[-23.476,-19.37],[-18.535,-11.982],[-4.816,-4.369],[2.133,-4.316],[2.066,8.973],[-13.462,0.168],[-22.493,-8.094]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[0,0],[-5.153,-3.162],[-10.672,0.015],[-0.215,-2.468],[0,0],[14.223,3.937],[0.037,2.076]],"o":[[0,0],[6.015,3.69],[10.672,-0.015],[0.132,1.519],[0,0],[-9.319,-2.58],[-0.071,-3.931]],"v":[[-5.316,-3.342],[2.909,4.799],[33.402,12.831],[47.316,12.125],[46.335,24.933],[16.875,20.231],[-4.664,11.534]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[-2.083,-3.6],[-3.832,-2.21],[-0.794,0.115],[0,0],[5.291,5.622],[0.356,2.113]],"o":[[0,0],[2.083,3.6],[3.21,1.851],[0.079,1.184],[0,0],[-4.449,-4.728],[-0.201,-1.197]],"v":[[-24.038,-31.074],[-19.346,-19.794],[-10.078,-11.235],[-3.117,-9.66],[-3.245,4.095],[-16.621,-7.041],[-23.024,-15.597]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[0,0],[-5.175,-2.249],[-9.71,1.39],[-0.598,-2.396],[0,0],[13.498,1.489],[0.374,2.039]],"o":[[0,0],[6.04,2.625],[8.154,-1.168],[0.368,1.475],[0,0],[-8.844,-0.975],[-0.708,-3.862]],"v":[[12.422,-1.851],[20.731,5.272],[53.976,8.067],[64.908,5.424],[64.903,17.968],[35.344,17.034],[13.37,12.162]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[-0.208,-2.177],[-0.397,-0.728],[-0.033,-0.499],[0,0],[0.553,3.112],[0.017,1.358]],"o":[[0,0],[0.241,2.282],[0.401,0.919],[0.018,0.321],[0,0],[-0.361,-1.932],[-0.022,-1.805]],"v":[[-17.499,-48.168],[-17.199,-41.228],[-16.227,-36.359],[-15.606,-35.217],[-15.595,-25.396],[-16.659,-30.964],[-17.348,-37.109]],"c":true}]},{"t":69,"s":[{"i":[[0,0],[-6.612,-4.372],[-6.666,-1.21],[-1.989,0.783],[0,0],[10.878,5.184],[0.421,3.535]],"o":[[0,0],[6.511,4.305],[6.937,1.259],[1.113,-0.438],[0,0],[-7.258,-3.459],[-0.421,-3.535]],"v":[[-6.783,-17.6],[1.745,-3.394],[23.867,6.679],[35.238,6.304],[35.426,18.301],[10.785,11.466],[-5.979,-0.569]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.800000011921,0.06274510175,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[184.386,438.683]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[-2.078,-0.219],[-2.34,-1.323],[1.599,0.56],[2.33,2.501]],"o":[[2.078,0.219],[2.508,1.418],[-3.746,-1.311],[-1.388,-1.49]],"v":[[-20.304,-11.192],[21.173,6.983],[20.051,10.685],[-22.462,-8.453]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[-1.634,-0.381],[-1.876,-1.361],[1.312,0.608],[1.997,2.332]],"o":[[1.661,0.489],[2.002,1.319],[-3.042,-1.312],[-1.191,-1.412]],"v":[[-22.737,-21.949],[14.713,-4.63],[13.746,-1.325],[-24.577,-19.228]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[-2.063,0.185],[-2.559,-0.954],[1.673,0.28],[2.809,2.227]],"o":[[2.063,-0.185],[2.743,1.022],[-3.919,-0.655],[-1.673,-1.326]],"v":[[-9.636,-17.712],[36.459,-4.952],[36.185,-0.728],[-11.126,-14.317]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[-1.634,-0.381],[-1.876,-1.361],[1.312,0.608],[1.997,2.332]],"o":[[1.661,0.489],[2.002,1.319],[-3.042,-1.312],[-1.191,-1.412]],"v":[[-25.629,-24.036],[9.83,-7.036],[8.864,-3.731],[-27.469,-21.315]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-2.054,0.267],[-2.595,-0.851],[1.683,0.213],[2.895,2.113]],"o":[[2.054,-0.267],[2.781,0.912],[-3.942,-0.499],[-1.725,-1.259]],"v":[[-0.605,13.981],[48.492,25.211],[48.387,29.442],[-1.958,17.432]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[-1.333,-0.571],[-1.522,-1.384],[1.104,0.662],[1.66,2.12]],"o":[[1.392,0.759],[1.6,1.237],[-2.518,-1.357],[-1.01,-1.29]],"v":[[-23.832,-4.725],[6.06,10.87],[5.059,13.568],[-25.529,-2.286]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-2.202,0.279],[-2.799,-0.849],[1.811,0.208],[3.138,2.124]],"o":[[2.202,-0.279],[3,0.91],[-4.241,-0.488],[-1.869,-1.265]],"v":[[-2.451,16.875],[50.437,28.021],[50.38,32.298],[-3.858,20.37]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[-1.268,-0.703],[-1.374,-1.53],[1.032,0.77],[1.438,2.276]],"o":[[1.309,0.896],[1.467,1.392],[-2.368,-1.604],[-0.875,-1.385]],"v":[[-25.333,-17.477],[-2.32,-2.475],[-3.589,0.108],[-27.267,-15.222]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[-1.996,0.551],[-2.689,-0.481],[1.696,-0.024],[3.162,1.689]],"o":[[1.996,-0.551],[2.881,0.515],[-3.973,0.056],[-1.883,-1.006]],"v":[[15.211,-4.454],[67.974,-0.276],[68.46,3.928],[14.353,-0.848]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-0.658,-1.424],[-0.24,-1.574],[0.217,0.883],[0.402,2.036]],"o":[[0.364,1.175],[0.271,1.383],[-0.501,-1.816],[-0.248,-1.255]],"v":[[-18.838,-27.47],[-14.108,-13.401],[-16.973,-12.666],[-21.1,-26.44]],"c":true}]},{"t":69,"s":[{"i":[[-2.078,-0.219],[-2.34,-1.323],[1.599,0.56],[2.33,2.501]],"o":[[2.078,0.219],[2.508,1.418],[-3.746,-1.311],[-1.388,-1.49]],"v":[[-0.371,-37.629],[41.106,-19.453],[39.984,-15.751],[-2.529,-34.889]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.960784316063,0.800000011921,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[183.6,280.755]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[9.227,11.608],[-2.107,5.994],[-6.443,2.077],[8.428,-2.141],[2.107,-4.709],[0.915,-5.947]],"o":[[-2.067,-2.601],[2.107,-5.994],[5.2,-1.676],[-8.428,2.141],[-2.107,4.709],[-0.527,3.425]],"v":[[-99.897,125.483],[-102.656,-43.988],[51.048,-112.599],[101.789,-93.918],[-53.671,-21.725],[-53.582,143.943]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[6.421,8.076],[-2.762,8.926],[-9.692,2.96],[4.149,-1.247],[1.332,-4.825],[1.671,-6.159]],"o":[[-2.037,-2.748],[1.326,-6.029],[4.489,-1.232],[-8.157,2.334],[-1.774,5.859],[-0.738,2.929]],"v":[[-102.582,119.247],[-104.459,-54.852],[60.138,-115.814],[106.727,-96.113],[-61.209,-33.554],[-62.98,140.953]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[8.279,8.429],[-0.724,6.896],[-10.699,4.643],[4.212,-1.871],[1.006,-5.51],[2.433,-6.171]],"o":[[-2.608,-2.655],[0.724,-6.896],[4.608,-2],[-7.934,3.524],[-1.006,5.51],[-1.074,2.725]],"v":[[-89.866,133.359],[-91.902,-49.571],[40.3,-124.623],[90.303,-110.307],[-37.631,-33.923],[-39.773,149.188]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[6.201,8.246],[-2.762,8.926],[-9.692,2.96],[4.149,-1.247],[1.332,-4.825],[1.837,-6.112]],"o":[[-1.963,-2.801],[1.326,-6.029],[4.489,-1.232],[-8.157,2.334],[-1.774,5.859],[-0.816,2.908]],"v":[[-106.241,117.734],[-107.352,-56.938],[57.378,-109.882],[102.616,-90.946],[-66.092,-35.96],[-68.454,139.921]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[8.285,7.768],[-0.449,6.92],[-10.699,4.643],[4.212,-1.871],[0.786,-5.546],[2.433,-6.171]],"o":[[-2.715,-2.546],[0.449,-6.92],[4.608,-2],[-7.934,3.524],[-0.786,5.546],[-1.074,2.725]],"v":[[-83.173,138.586],[-82.84,-17.695],[27.758,-101.775],[77.947,-88.974],[-25.459,-3.904],[-32.32,151.754]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[5.678,7.395],[-0.429,6.351],[-3.541,0.64],[3.999,-1.026],[0.877,-4.454],[0.53,-6.199]],"o":[[-1.854,-2.684],[0.909,-5.503],[5.263,-0.951],[-3.999,1.026],[-0.056,3.723],[-0.193,3.105]],"v":[[-101.54,118.969],[-105.138,-37.835],[57.789,-87.324],[99.135,-69.741],[-70.772,-18.332],[-71.595,137.59]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[9.486,8.149],[-0.389,6.996],[-10.079,5.869],[3.963,-2.353],[0.866,-4.028],[2.285,-6.258]],"o":[[-2.988,-2.567],[0.389,-6.996],[4.341,-2.528],[-7.465,4.432],[-1.191,5.541],[-1.009,2.763]],"v":[[-84.004,138.772],[-85.016,-14.771],[22.564,-94.017],[75.166,-81.706],[-23.195,-1.073],[-27.708,152.833]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[4.606,8.106],[-1.068,6.275],[-3.541,0.64],[3.999,-1.026],[1.322,-4.343],[1.379,-6.067]],"o":[[-1.467,-2.913],[1.459,-5.384],[5.263,-0.951],[-3.999,1.026],[-0.431,3.699],[-0.618,3.049]],"v":[[-102.174,111.85],[-106.562,-50.955],[89.165,-84.448],[121.182,-67.876],[-79.493,-31.613],[-77.634,132.399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[9.907,6.436],[-0.472,7.855],[-9.752,6.397],[3.832,-2.561],[0.292,-4.062],[1.04,-6.551]],"o":[[-3.121,-2.028],[0.416,-6.922],[4.201,-2.755],[-7.218,4.823],[-0.401,5.587],[-0.459,2.893]],"v":[[-65.704,140.204],[-66.86,-35.496],[3.302,-111.407],[55.012,-105.812],[-5.536,-29.938],[-9.153,145.206]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0.932,6.819],[-0.769,8.063],[-15.59,-0.024],[3.8,-0.327],[1.087,-3.149],[0.153,-5.567]],"o":[[-0.299,-2.593],[0.652,-4.165],[5.133,0.753],[-7.952,0.506],[-0.546,1.944],[-0.071,2.916]],"v":[[-95.893,94.333],[-99.334,-62.18],[99.386,-70.162],[113.955,-52.135],[-92.725,-42.224],[-90.063,112.935]],"c":true}]},{"t":69,"s":[{"i":[[9.227,11.608],[-2.107,5.994],[-6.443,2.077],[8.427,-2.141],[2.107,-4.709],[0.915,-5.947]],"o":[[-2.067,-2.601],[2.107,-5.994],[5.2,-1.676],[-8.428,2.141],[-2.107,4.709],[-0.527,3.425]],"v":[[-84.724,127.567],[-82.723,-70.424],[71.731,-134.285],[122.472,-115.604],[-33.738,-48.162],[-38.408,146.026]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.905882418156,0.596078455448,0.047058828175,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.925,0.2,0.5,0.99,0.757,0.1,1,0.98,0.588,0]}},"s":{"a":1,"k":[{"i":{"x":0.27,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-41.248,-63.095],"to":[-13.583,3.167],"ti":[13.583,-3.167]},{"t":21,"s":[-122.748,-44.095]}]},"e":{"a":1,"k":[{"i":{"x":0.27,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-45.168,52.078],"to":[-13.292,1.292],"ti":[13.292,-1.292]},{"t":21,"s":[-124.918,59.828]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[261.233,313.284]},"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 5","bm":0,"hd":false}],"ip":0,"op":63,"st":0,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":"L1","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[261.133,331.925,0]},"a":{"a":0,"k":[261.133,331.925,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[0,0],[-6.612,-4.372],[-6.666,-1.21],[-1.989,0.783],[0,0],[10.878,5.184],[0.421,3.535]],"o":[[0,0],[6.511,4.305],[6.937,1.259],[1.113,-0.438],[0,0],[-7.258,-3.459],[-0.421,-3.535]],"v":[[-21.957,-19.683],[-13.429,-5.477],[8.693,4.596],[20.064,4.221],[20.252,16.217],[-4.389,9.383],[-21.152,-2.652]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[-6.269,-4.223],[-6.015,-1.106],[-2.269,0.977],[0,0],[15.665,5.569],[0.679,3.868]],"o":[[0,0],[7.309,4.923],[6.015,1.106],[1.269,-0.547],[0,0],[-8.847,-3.145],[-0.679,-3.868]],"v":[[-20.192,-15.477],[-11.364,-2.894],[11.984,5.657],[27.43,6.157],[27.55,19.79],[-3.492,13.02],[-18.343,3.226]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0,0],[-3.848,-4.349],[-4.521,-1.445],[-1.737,0.778],[0,0],[7.035,4.817],[0.514,3.398]],"o":[[0,0],[5.446,4.609],[4.536,1.566],[0.965,-0.43],[0,0],[-7.035,-4.817],[-0.514,-3.398]],"v":[[-28.185,-27.943],[-22.53,-15.61],[-5.243,-4.742],[6.095,-3.255],[5.717,11.961],[-14.082,1.501],[-27.101,-10.065]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0,0],[-6.269,-4.223],[-6.015,-1.106],[-2.269,0.977],[0,0],[15.665,5.569],[0.679,3.868]],"o":[[0,0],[7.309,4.923],[6.015,1.106],[1.269,-0.547],[0,0],[-8.847,-3.145],[-0.679,-3.868]],"v":[[-13.759,-12.333],[-4.931,0.251],[18.417,8.802],[33.863,9.302],[33.983,22.935],[2.941,16.164],[-11.911,6.37]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0,0],[-2.083,-3.6],[-3.403,-1.466],[-0.794,0.115],[0,0],[5.789,5.108],[0.438,2.098]],"o":[[0,0],[2.083,3.6],[3.403,1.466],[0.079,1.184],[0,0],[-4.78,-4.218],[-0.438,-2.098]],"v":[[-29.817,-28.508],[-25.453,-17.001],[-13.669,-6.683],[-6.985,-5.132],[-7.139,7.819],[-20.89,-2.901],[-28.93,-12.626]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[-6.269,-4.223],[-6.015,-1.106],[-2.269,0.977],[0,0],[15.665,5.569],[0.679,3.868]],"o":[[0,0],[7.309,4.923],[6.015,1.106],[1.269,-0.547],[0,0],[-8.847,-3.145],[-0.679,-3.868]],"v":[[-13.759,-12.333],[-4.931,0.251],[18.417,8.802],[34.733,9.273],[34.853,22.907],[2.941,16.164],[-11.911,6.37]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[0,0],[-2.083,-3.6],[-3.403,-1.466],[-0.794,0.115],[0,0],[5.789,5.108],[0.438,2.098]],"o":[[0,0],[2.083,3.6],[3.403,1.466],[0.079,1.184],[0,0],[-4.78,-4.218],[-0.438,-2.098]],"v":[[-29.817,-28.508],[-25.453,-17.001],[-13.669,-6.683],[-6.985,-5.132],[-7.139,7.819],[-20.89,-2.901],[-28.93,-12.626]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[-5.028,-2.562],[-9.734,1.216],[-0.451,-2.429],[0,0],[13.382,2.311],[0.249,2.058]],"o":[[0,0],[5.868,2.99],[9.734,-1.216],[0.277,1.495],[0,0],[-8.768,-1.514],[-0.471,-3.898]],"v":[[-5.111,-2.304],[2.192,5.2],[30.838,9.748],[44.181,7.657],[44.03,20.482],[14.968,18.632],[-4.021,12.743]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[0,0],[-1.542,-3.294],[-2.947,-1.068],[-0.247,-0.757],[0,0],[4.102,4.683],[0.096,2.069]],"o":[[0,0],[1.783,3.452],[2.977,1.359],[0.134,0.487],[0,0],[-2.677,-2.905],[-0.16,-2.747]],"v":[[-39.516,-33.366],[-37.307,-22.823],[-30.101,-15.505],[-25.486,-13.83],[-25.43,1.132],[-33.322,-7.241],[-38.425,-16.532]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[-5.278,-1.995],[-9.542,2.275],[-0.714,-2.365],[0,0],[13.554,0.831],[0.473,2.019]],"o":[[0,0],[6.16,2.329],[9.542,-2.275],[0.44,1.456],[0,0],[-8.881,-0.544],[-0.895,-3.823]],"v":[[32.301,3.296],[39.537,10.157],[70.709,10.571],[84.332,7.496],[84.528,20.095],[54.085,21.429],[33.512,17.554]],"c":true}]},{"t":69,"s":[{"i":[[0,0],[-6.612,-4.372],[-6.666,-1.21],[-1.989,0.783],[0,0],[10.878,5.184],[0.421,3.535]],"o":[[0,0],[6.511,4.305],[6.937,1.259],[1.113,-0.438],[0,0],[-7.258,-3.459],[-0.421,-3.535]],"v":[[-6.783,-17.6],[1.745,-3.394],[23.867,6.679],[35.238,6.304],[35.426,18.301],[10.785,11.466],[-5.979,-0.569]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.800000011921,0.06274510175,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[184.386,438.683]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[-2.078,-0.219],[-2.34,-1.323],[1.599,0.56],[2.33,2.501]],"o":[[2.078,0.219],[2.508,1.418],[-3.746,-1.311],[-1.388,-1.49]],"v":[[-20.304,-11.192],[21.173,6.983],[20.051,10.685],[-22.462,-8.453]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[-2.07,0.061],[-2.497,-1.106],[1.653,0.38],[2.67,2.392]],"o":[[2.07,-0.061],[2.676,1.185],[-3.872,-0.89],[-1.59,-1.425]],"v":[[-13.22,-16.146],[34.508,-0.063],[33.98,4.136],[-14.912,-12.848]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[-1.634,-0.381],[-1.876,-1.361],[1.312,0.608],[1.997,2.332]],"o":[[1.661,0.489],[2.002,1.319],[-3.042,-1.312],[-1.191,-1.412]],"v":[[-28.569,-30.904],[7.474,-12.634],[6.508,-9.33],[-30.409,-28.183]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[-2.063,0.185],[-2.559,-0.954],[1.673,0.28],[2.809,2.227]],"o":[[2.063,-0.185],[2.743,1.022],[-3.919,-0.655],[-1.673,-1.326]],"v":[[-11.767,-13.635],[36.844,-0.457],[36.57,3.766],[-13.256,-10.24]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-1.138,-0.899],[-1.108,-1.732],[0.893,0.927],[1.05,2.479]],"o":[[1.146,1.096],[1.223,1.611],[-2.077,-1.966],[-0.639,-1.509]],"v":[[-30.062,-4.469],[-5.268,18.378],[-6.938,20.722],[-32.337,-2.557]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[-2.063,0.185],[-2.559,-0.954],[1.673,0.28],[2.809,2.227]],"o":[[2.063,-0.185],[2.743,1.022],[-3.919,-0.655],[-1.673,-1.326]],"v":[[-14.291,6.514],[34.32,19.692],[34.046,23.915],[-15.78,9.909]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-1.138,-0.899],[-1.108,-1.732],[0.893,0.927],[1.05,2.479]],"o":[[1.146,1.096],[1.223,1.611],[-2.077,-1.966],[-0.639,-1.509]],"v":[[-29.93,-2.764],[-5.136,20.083],[-6.806,22.426],[-32.205,-0.852]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[-2.027,0.423],[-2.653,-0.651],[1.694,0.084],[3.048,1.887]],"o":[[2.027,-0.423],[2.843,0.698],[-3.968,-0.198],[-1.815,-1.124]],"v":[[-6.077,0.175],[43.732,7.639],[43.949,11.865],[-7.164,3.719]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[-0.822,-1.042],[-0.748,-1.724],[0.677,0.964],[0.741,2.261]],"o":[[0.837,1.311],[0.844,1.512],[-1.563,-1.98],[-0.457,-1.394]],"v":[[-40.927,-36.971],[-25.17,-18.576],[-26.843,-16.805],[-43.096,-35.352]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-2.027,0.423],[-2.653,-0.651],[1.694,0.084],[3.048,1.887]],"o":[[2.027,-0.423],[2.843,0.698],[-3.968,-0.198],[-1.815,-1.124]],"v":[[33.15,6.241],[83.255,8.12],[83.471,12.346],[32.063,9.785]],"c":true}]},{"t":69,"s":[{"i":[[-2.078,-0.219],[-2.34,-1.323],[1.599,0.56],[2.33,2.501]],"o":[[2.078,0.219],[2.508,1.418],[-3.746,-1.311],[-1.388,-1.49]],"v":[[-0.371,-37.629],[41.106,-19.453],[39.984,-15.751],[-2.529,-34.889]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.960784316063,0.800000011921,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[183.6,280.755]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[9.227,11.608],[-2.107,5.994],[-6.443,2.077],[8.428,-2.141],[2.107,-4.709],[0.915,-5.947]],"o":[[-2.067,-2.601],[2.107,-5.994],[5.2,-1.676],[-8.428,2.141],[-2.107,4.709],[-0.527,3.425]],"v":[[-99.897,125.483],[-102.656,-43.988],[51.798,-107.849],[102.539,-89.168],[-53.671,-21.725],[-53.582,143.943]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[8.279,8.429],[-1.138,6.84],[-10.831,4.326],[4.266,-1.746],[1.337,-5.439],[2.433,-6.171]],"o":[[-2.608,-2.655],[1.138,-6.84],[4.665,-1.863],[-8.034,3.288],[-1.337,5.439],[-1.074,2.725]],"v":[[-97.248,131.747],[-95.518,-48.286],[43.916,-115.207],[95.785,-97.748],[-39.803,-28.827],[-47.156,147.576]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[6.201,8.246],[-2.762,8.926],[-11.009,2.76],[4.149,-1.247],[1.332,-4.825],[1.837,-6.112]],"o":[[-1.963,-2.801],[1.326,-6.029],[4.489,-1.232],[-8.157,2.334],[-1.774,5.859],[-0.816,2.908]],"v":[[-106.241,117.734],[-110.291,-63.807],[58.229,-115.374],[102.127,-93.652],[-68.448,-41.558],[-68.454,139.921]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[8.279,8.429],[-0.724,6.896],[-10.699,4.643],[4.212,-1.871],[1.007,-5.51],[2.433,-6.171]],"o":[[-2.608,-2.655],[0.724,-6.896],[4.608,-2],[-7.934,3.524],[-1.006,5.51],[-1.074,2.725]],"v":[[-90.816,134.892],[-94.032,-45.494],[41.504,-110.946],[92.532,-96.187],[-37.246,-29.428],[-40.723,150.72]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[4.606,8.106],[-2.07,6.02],[-3.541,0.64],[3.999,-1.026],[2.008,-4.072],[1.379,-6.067]],"o":[[-1.467,-2.913],[2.312,-5.076],[5.263,-0.951],[-3.999,1.026],[-1.025,3.58],[-0.618,3.049]],"v":[[-107.953,114.416],[-111.09,-38.517],[75.73,-87.229],[114.097,-61.219],[-82.996,-10.73],[-80.857,136.983]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[8.279,8.429],[-0.724,6.896],[-10.699,4.643],[4.212,-1.871],[1.007,-5.51],[2.433,-6.171]],"o":[[-2.608,-2.655],[0.724,-6.896],[4.608,-2],[-7.934,3.524],[-1.006,5.51],[-1.074,2.725]],"v":[[-90.816,134.891],[-96.556,-25.345],[31.023,-90.503],[86.945,-77.118],[-39.77,-9.279],[-39.852,150.692]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[4.606,8.106],[-2.07,6.02],[-3.541,0.64],[3.999,-1.026],[2.008,-4.072],[1.379,-6.067]],"o":[[-1.467,-2.913],[2.312,-5.076],[5.263,-0.951],[-3.999,1.026],[-1.025,3.58],[-0.618,3.049]],"v":[[-107.953,114.416],[-110.958,-36.812],[77.607,-84.302],[113.786,-60.777],[-82.863,-9.025],[-80.857,136.983]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[9.495,7.03],[0.079,6.934],[-10.079,5.869],[3.963,-2.353],[0.55,-4.035],[1.438,-6.475]],"o":[[-2.991,-2.215],[-0.079,-6.934],[4.341,-2.528],[-7.465,4.432],[-0.757,5.55],[-0.635,2.859]],"v":[[-82.952,140.251],[-88.234,-31.153],[6.384,-90.728],[59.935,-82.586],[-29.97,-21.766],[-30.145,147.887]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[2.897,7.474],[-2.419,8.919],[-7.81,1.602],[3.872,-0.766],[1.663,-3.186],[0.49,-6.142]],"o":[[-0.93,-2.845],[2.044,-4.618],[4.121,-0.586],[-8.121,1.409],[-0.313,3.615],[-0.227,3.216]],"v":[[-117.741,110.9],[-121.514,-71.233],[103.104,-96.047],[124.104,-75.758],[-103.724,-48.081],[-99.565,131.145]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[10.208,5.947],[0.079,6.934],[-5.289,1.668],[1.327,-3.2],[0.55,-4.035],[0.72,-6.594]],"o":[[-3.216,-1.874],[-0.079,-6.934],[4.791,-1.511],[-1.646,3.97],[-0.757,5.55],[-0.318,2.911]],"v":[[-45.354,145.358],[-49.007,-25.087],[-12.219,-86.456],[40.526,-85.223],[9.553,-21.285],[10.191,147.226]],"c":true}]},{"t":69,"s":[{"i":[[9.227,11.608],[-2.107,5.994],[-6.443,2.077],[8.427,-2.141],[2.107,-4.709],[0.915,-5.947]],"o":[[-2.067,-2.601],[2.107,-5.994],[5.2,-1.676],[-8.428,2.141],[-2.107,4.709],[-0.527,3.425]],"v":[[-84.724,127.567],[-82.723,-70.424],[71.731,-134.285],[122.472,-115.604],[-33.738,-48.162],[-38.408,146.026]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.905882418156,0.596078455448,0.047058828175,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.925,0.2,0.5,0.992,0.818,0.1,1,0.984,0.71,0]}},"s":{"a":0,"k":[-73.454,-11.731]},"e":{"a":0,"k":[-74.884,106.43]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[261.233,313.284]},"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 5","bm":0,"hd":false}],"ip":0,"op":63,"st":0,"bm":0},{"ddd":0,"ind":55,"ty":3,"nm":"NULL Layer 12","parent":61,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.87],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[-3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[-4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[-7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":52,"s":[-8]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":57,"s":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[-16]},{"t":69,"s":[-23]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[183.408,306.07,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[189.357,304.362,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[175.6,297.386,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[196.296,304.161,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[164.762,300.255,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[196.685,303.81,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[165.37,299.425,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[204.948,302.854,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[148.178,280.951,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[241.008,316.759,0],"to":[0,0,0],"ti":[0,0,0]},{"t":69,"s":[222.562,216.197,0]}]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.87,0.87,0.87],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[106,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[80,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[112,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[70,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[111,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[65,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":52,"s":[126,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[35,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[130,95,100]},{"t":69,"s":[95,97,100]}]}},"ao":0,"ip":0,"op":70,"st":0,"bm":0},{"ddd":0,"ind":56,"ty":4,"nm":"Layer 24","parent":55,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[100]},{"t":66,"s":[0]}]},"p":{"a":0,"k":[50.159,48.558,0]},"a":{"a":0,"k":[183.567,303.628,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[120.509,282.053]},"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 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[152.679,283.585]},"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 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[212.254,325.204]},"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 10","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[246.626,322.332]},"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 11","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":57,"ty":3,"nm":"G 2","parent":61,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.87],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":52,"s":[3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":57,"s":[15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[0]},{"t":69,"s":[40]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[344.337,300.43,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[347.145,294.827,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[332.602,299.793,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[350.378,290.653,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[325.521,311.285,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[351.592,288.497,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[324.455,309.38,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[352.532,282.288,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[308.73,297.26,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[363.772,269.499,0],"to":[0,0,0],"ti":[0,0,0]},{"t":69,"s":[362.495,237.069,0]}]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.87,0.87,0.87],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[85,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[108,111,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[80,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[121,99,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[78,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[121,96,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":52,"s":[50,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[135,111,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[8,99,100]},{"t":69,"s":[72,82,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":58,"ty":4,"nm":"Layer 23","parent":57,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[100]},{"t":66,"s":[0]}]},"p":{"a":0,"k":[39.98,57.971,0]},"a":{"a":0,"k":[336.317,310.9,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[311.095,327.026]},"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 12","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[397.372,287.105]},"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 13","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.804,288.834]},"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 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[275.261,334.695]},"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 15","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":59,"ty":3,"nm":"Null 5","parent":61,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.87],"y":[0]},"t":0,"s":[-45]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[-53]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[-36]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[-62]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[-31]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[-63]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[-30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":52,"s":[-74]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":57,"s":[-16]},{"t":62,"s":[-81]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[257,244.25,0],"to":[-0.073,-0.377,0],"ti":[0.011,0.208,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[256.562,241.987,0],"to":[-0.011,-0.208,0],"ti":[0.402,-0.979,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[256.933,243,0],"to":[-0.402,0.979,0],"ti":[0.114,0.059,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[254.147,247.861,0],"to":[-0.114,-0.059,0],"ti":[-0.282,-0.142,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[256.252,242.646,0],"to":[0.282,0.142,0],"ti":[0.068,-1.011,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":47,"s":[255.841,248.711,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[255.841,248.711,0],"to":[0.128,-1.278,0],"ti":[0.224,-2.291,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[256.611,241.044,0],"to":[-0.224,2.291,0],"ti":[0.353,-3.569,0]},{"t":62,"s":[254.495,262.457,0]}]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.87,0.87,0.87],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[91,108,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[104,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[77,119,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[123,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[76,119,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[123,84,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":52,"s":[52,131,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[141,63,100]},{"t":62,"s":[43,120,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":60,"ty":4,"nm":"Layer 12","parent":59,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[100]},{"t":66,"s":[0]}]},"r":{"a":0,"k":45},"p":{"a":0,"k":[23.171,67.854,0]},"a":{"a":0,"k":[257.154,274.845,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.614,-3.744],[2.581,-1.351],[-3.295,-0.298],[-2.496,1.545],[2.049,-2.182],[-0.951,-1.497],[-1.566,2.272],[-3.444,0.036],[4.029,2.303],[-0.396,1.811],[4.483,-1.533],[2.556,1.096]],"o":[[0.617,1.43],[-2.489,1.303],[3.295,0.298],[3.953,-2.448],[-2.696,2.871],[1.102,1.735],[1.566,-2.272],[3.326,-0.035],[-3.368,-1.925],[0.453,-2.069],[-3.278,1.121],[-4.043,-1.734]],"v":[[-6.857,-3.6],[-8.883,-0.664],[-8.415,1.943],[-2.856,0.327],[-0.66,0.705],[-1.571,5.501],[2.308,4.965],[7.238,2.821],[8.598,0.175],[6.513,-3.78],[2.582,-5.459],[-3.079,-5.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[265.875,204.089]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.614,-3.744],[2.581,-1.351],[-3.295,-0.298],[-2.496,1.545],[2.049,-2.182],[-0.951,-1.497],[-1.566,2.272],[-3.444,0.036],[4.029,2.303],[-0.396,1.811],[4.483,-1.533],[2.556,1.096]],"o":[[0.617,1.43],[-2.489,1.303],[3.295,0.298],[3.953,-2.448],[-2.696,2.871],[1.102,1.735],[1.566,-2.272],[3.326,-0.035],[-3.368,-1.925],[0.453,-2.069],[-3.278,1.121],[-4.043,-1.734]],"v":[[-6.857,-3.6],[-8.883,-0.664],[-8.415,1.943],[-2.856,0.327],[-0.66,0.705],[-1.571,5.501],[2.308,4.965],[7.238,2.821],[8.598,0.175],[6.513,-3.78],[2.582,-5.459],[-3.079,-5.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[232.556,213.153]},"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":[[-1.756,-4.074],[2.809,-1.47],[-3.585,-0.324],[-2.715,1.682],[2.229,-2.374],[-1.034,-1.629],[-1.704,2.472],[-3.748,0.039],[4.384,2.506],[-0.431,1.971],[4.878,-1.668],[2.781,1.193]],"o":[[0.671,1.557],[-2.709,1.418],[3.585,0.324],[4.301,-2.664],[-2.933,3.123],[1.199,1.888],[1.704,-2.472],[3.619,-0.038],[-3.665,-2.095],[0.493,-2.252],[-3.566,1.22],[-4.4,-1.887]],"v":[[-7.461,-3.918],[-9.666,-0.722],[-9.157,2.114],[-3.108,0.355],[-0.718,0.767],[-1.709,5.986],[2.512,5.402],[7.876,3.069],[9.356,0.191],[7.087,-4.113],[2.809,-5.94],[-3.351,-6.125]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[363.497,238.587]},"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":0,"k":{"i":[[-1.756,-4.074],[2.809,-1.47],[-3.585,-0.324],[-2.715,1.682],[2.229,-2.374],[-1.034,-1.629],[-1.704,2.472],[-3.748,0.039],[4.384,2.506],[-0.431,1.971],[4.878,-1.668],[2.781,1.193]],"o":[[0.671,1.557],[-2.709,1.418],[3.585,0.324],[4.301,-2.664],[-2.933,3.123],[1.199,1.888],[1.704,-2.472],[3.619,-0.038],[-3.665,-2.095],[0.493,-2.252],[-3.566,1.22],[-4.4,-1.887]],"v":[[-7.461,-3.918],[-9.666,-0.722],[-9.157,2.114],[-3.108,0.355],[-0.718,0.767],[-1.709,5.986],[2.512,5.402],[7.876,3.069],[9.356,0.191],[7.087,-4.113],[2.809,-5.94],[-3.351,-6.125]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[347.54,257.608]},"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":0,"k":{"i":[[-1.756,-4.074],[2.809,-1.47],[-3.585,-0.324],[-2.715,1.682],[2.229,-2.374],[-1.034,-1.629],[-1.704,2.472],[-3.748,0.039],[4.384,2.506],[-0.431,1.971],[4.878,-1.668],[2.781,1.193]],"o":[[0.671,1.557],[-2.709,1.418],[3.585,0.324],[4.301,-2.664],[-2.933,3.123],[1.199,1.888],[1.704,-2.472],[3.619,-0.038],[-3.665,-2.095],[0.493,-2.252],[-3.566,1.22],[-4.4,-1.887]],"v":[[-7.461,-3.918],[-9.666,-0.722],[-9.157,2.114],[-3.108,0.355],[-0.718,0.767],[-1.709,5.986],[2.512,5.402],[7.876,3.069],[9.356,0.191],[7.087,-4.113],[2.809,-5.94],[-3.351,-6.125]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[251.285,291.311]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.756,-4.074],[2.809,-1.47],[-3.585,-0.324],[-2.715,1.682],[2.229,-2.374],[-1.034,-1.629],[-1.704,2.472],[-3.748,0.039],[4.384,2.506],[-0.431,1.971],[4.878,-1.668],[2.781,1.193]],"o":[[0.671,1.557],[-2.709,1.418],[3.585,0.324],[4.301,-2.664],[-2.933,3.123],[1.199,1.888],[1.704,-2.472],[3.619,-0.038],[-3.665,-2.095],[0.493,-2.252],[-3.566,1.22],[-4.4,-1.887]],"v":[[-7.461,-3.918],[-9.666,-0.722],[-9.157,2.114],[-3.108,0.355],[-0.718,0.767],[-1.709,5.986],[2.512,5.402],[7.876,3.069],[9.356,0.191],[7.087,-4.113],[2.809,-5.94],[-3.351,-6.125]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[277.582,273.183]},"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 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.756,-4.074],[2.809,-1.47],[-3.585,-0.324],[-2.715,1.682],[2.229,-2.374],[-1.034,-1.629],[-1.704,2.472],[-3.748,0.039],[4.384,2.506],[-0.431,1.971],[4.878,-1.668],[2.781,1.193]],"o":[[0.671,1.557],[-2.709,1.418],[3.585,0.324],[4.301,-2.664],[-2.933,3.123],[1.199,1.888],[1.704,-2.472],[3.619,-0.038],[-3.665,-2.095],[0.493,-2.252],[-3.566,1.22],[-4.4,-1.887]],"v":[[-7.461,-3.918],[-9.666,-0.722],[-9.157,2.114],[-3.108,0.355],[-0.718,0.767],[-1.709,5.986],[2.512,5.402],[7.876,3.069],[9.356,0.191],[7.087,-4.113],[2.809,-5.94],[-3.351,-6.125]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[163.838,241.268]},"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 7","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":61,"ty":4,"nm":"Cap","parent":83,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[257.154,274.845,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[256.734,265.593,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[256.608,294.843,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[257.154,274.845,0],"to":[-1.888,-20.58,0],"ti":[1.888,20.58,0]},{"t":66,"s":[245.823,151.364,0]}]},"a":{"a":0,"k":[257.154,274.845,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[-9.875,10.249],[-29.625,0.697],[-6.853,-10.615],[3.766,-7.538],[22.981,0.48],[3.966,7.488]],"o":[[9.875,-10.249],[16.751,-0.394],[6.538,10.127],[-4.424,8.855],[-22.981,-0.48],[-3.966,-7.488]],"v":[[-146.597,-30.862],[1.002,-83.858],[149.252,-26.29],[149.252,21.145],[2.256,80.826],[-149.669,15.399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[-9.856,10.249],[-19.599,0.378],[-5.683,-8.861],[3.759,-7.538],[22.937,0.48],[3.959,7.488]],"o":[[9.856,-10.249],[16.059,-0.31],[6.503,10.14],[-4.416,8.855],[-22.937,-0.48],[-3.959,-7.488]],"v":[[-146.175,-26.716],[-10.323,-85.636],[143.905,-31.355],[143.905,16.08],[15.279,77.169],[-149.241,19.544]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[-8.348,8.762],[-20.747,-0.108],[-4.741,-9.121],[4.275,-6.207],[17.759,0.773],[3.079,7.476]],"o":[[8.156,-8.492],[13.714,0.257],[5.378,10.644],[-4.769,7.156],[-17.759,-0.773],[-3.079,-7.476]],"v":[[-138.584,-41.416],[11.85,-88.596],[145.349,-19.592],[144.561,27.476],[-21.487,75.702],[-140.919,6.746]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[-6.946,7.59],[-14.716,-1.388],[-1.986,-8.566],[2.834,-6.432],[8.124,1.743],[3.05,7.852]],"o":[[7.809,-8.951],[14.667,1.391],[2.475,11.455],[-3.026,7.39],[-8.124,-1.743],[-3.05,-7.852]],"v":[[-144.329,-25.301],[-10.148,-83.628],[145.392,-36.329],[144.445,13.899],[22.841,74.223],[-146.826,26.906]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-7.094,7.193],[-14.305,-2.049],[-2.348,-8.729],[3.627,-5.235],[9.051,2.282],[2.233,7.403]],"o":[[7.438,-7.801],[12.718,2.091],[2.814,11.133],[-3.827,5.909],[-9.051,-2.282],[-2.233,-7.403]],"v":[[-138.85,-42.573],[35.239,-85.825],[149.584,-7.43],[148.233,39.777],[-43.006,85.249],[-140.591,5.162]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[-6.94,7.608],[-14.735,-1.358],[-1.969,-8.559],[2.799,-6.485],[8.083,1.718],[3.086,7.872]],"o":[[7.826,-9.002],[14.755,1.36],[2.46,11.47],[-2.99,7.457],[-8.083,-1.718],[-3.086,-7.872]],"v":[[-144.541,-24.986],[-12.298,-79.378],[145.204,-37.626],[144.275,12.738],[25.798,73.728],[-147.073,27.422]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-7.404,6.838],[-14.243,-2.149],[-2.402,-8.753],[3.747,-5.055],[9.191,2.364],[1.806,7.42]],"o":[[7.695,-7.319],[12.424,2.196],[2.865,11.084],[-3.948,5.685],[-9.191,-2.364],[-1.806,-7.42]],"v":[[-135.283,-40.783],[37.522,-81.656],[150.272,-8.993],[148.86,37.757],[-43.788,84.051],[-138.857,6.172]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[-5.91,7.196],[-13.068,-0.934],[-1.572,-7.725],[2.117,-6.406],[6.685,1.339],[3.149,7.326]],"o":[[6.894,-8.786],[13.727,0.946],[2.011,10.579],[-2.281,7.41],[-6.685,-1.339],[-3.149,-7.326]],"v":[[-150.488,-16.796],[-54.969,-67.41],[129.447,-37.465],[128.803,9.658],[46.029,64.596],[-152.338,32.833]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[-8.216,6.643],[-14.882,-2.808],[-2.854,-9.312],[4.632,-4.321],[10.552,2.92],[1.077,7.472]],"o":[[8.13,-6.522],[11.717,2.875],[3.329,11.359],[-4.854,4.748],[-10.552,-2.92],[-1.077,-7.472]],"v":[[-134.608,-57.666],[78.422,-78.956],[149.498,-9.705],[147.668,36.843],[-81.484,58.38],[-135.753,-11.41]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-4.657,7.497],[-12.083,0.084],[-0.875,-6.863],[0.751,-7.538],[4.585,0.48],[4.274,7.247]],"o":[[6.223,-10.016],[14.82,-0.103],[1.295,10.155],[-0.883,8.855],[-4.585,-0.48],[-4.274,-7.247]],"v":[[-124.239,7.822],[-75.564,-46.909],[108.191,-38.617],[108.191,8.818],[86.058,67.554],[-124.542,57.178]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[-9.332,9.963],[-27.801,0.634],[-2.284,-4.934],[3.133,-2.378],[21.067,0.48],[3.41,6.348]],"o":[[2.836,-3.696],[16.55,-0.364],[5.993,10.13],[-3.68,2.793],[-21.067,-0.48],[-4.007,-7.458]],"v":[[-144.272,-26.839],[-1.68,-36.943],[144.982,-27.572],[144.954,20.314],[6.425,30.908],[-147.056,19.744]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-4.657,7.497],[-12.083,0.084],[-0.875,-6.863],[0.751,-7.538],[4.585,0.48],[4.274,7.247]],"o":[[6.223,-10.016],[14.82,-0.103],[1.295,10.155],[-0.883,8.855],[-4.585,-0.48],[-4.274,-7.247]],"v":[[-124.239,7.822],[-75.564,-46.909],[108.191,-38.617],[108.191,8.818],[86.058,67.554],[-124.542,57.178]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-8.108,4.909],[-10.082,-5.018],[-1.309,-9.468],[4.924,-2.778],[4.653,4.677],[-0.561,7.468]],"o":[[8.108,-4.909],[10.082,5.018],[1.652,11.944],[-4.924,2.778],[-4.653,-4.677],[0.561,-7.468]],"v":[[-108.067,-75.536],[98.81,-77.614],[115.161,-2.977],[112.48,43.145],[-111.493,43.295],[-114.682,-22.36]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":107,"s":[{"i":[[-9.55,10.249],[-19.04,0.835],[-4.242,-6.863],[3.642,-7.538],[22.225,0.48],[3.836,7.488]],"o":[[9.55,-10.249],[14.806,-0.649],[6.277,10.155],[-4.279,8.855],[-22.225,-0.48],[-3.836,-7.488]],"v":[[-132.276,-20.463],[-32.189,-71.358],[143.18,-34.394],[143.18,13.041],[38.917,70.402],[-135.248,25.798]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[-8.108,4.909],[-10.082,-5.018],[-1.309,-9.468],[4.924,-2.778],[4.653,4.677],[-0.561,7.468]],"o":[[8.108,-4.909],[10.082,5.018],[1.652,11.944],[-4.924,2.778],[-4.653,-4.678],[0.561,-7.468]],"v":[[-108.067,-75.536],[98.81,-77.614],[115.161,-2.977],[112.48,43.145],[-111.493,43.295],[-114.682,-22.36]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[-4.305,5.818],[-9.747,-1.831],[-2.241,-9.659],[4.72,-3.571],[5.311,1.355],[0.956,7.453]],"o":[[3.764,-5.014],[7.342,1.785],[2.472,11.641],[-4.831,3.791],[-5.311,-1.355],[-0.956,-7.453]],"v":[[-124.092,-72.756],[82.258,-82.977],[116.829,-11.446],[114.604,34.895],[-102.963,45.467],[-124.759,-26.045]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":148,"s":[{"i":[[-9.55,10.249],[-19.04,0.835],[-4.242,-6.863],[3.642,-7.538],[22.225,0.48],[3.836,7.488]],"o":[[9.55,-10.249],[14.806,-0.649],[6.277,10.155],[-4.279,8.855],[-22.225,-0.48],[-3.836,-7.488]],"v":[[-132.038,-97.463],[-31.951,-148.358],[143.418,-111.394],[143.418,-63.959],[39.155,-6.598],[-135.01,-51.202]],"c":true}]},{"t":152,"s":[{"i":[[-2.802,5.818],[-9.852,-1.832],[-1.618,-9.782],[4.771,-3.571],[5.368,1.355],[0.621,7.453]],"o":[[2.449,-5.014],[7.42,1.785],[1.72,11.775],[-4.883,3.79],[-5.368,-1.355],[-0.621,-7.453]],"v":[[-111.595,-124.562],[84.689,-130.469],[105.347,-57.691],[101.876,-11.345],[-103.043,-6.793],[-112.034,-77.851]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588237047,0.898039221764,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.397,274.507]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[0,0],[15.173,-6.979],[8.181,0.136],[38.74,17.602],[0.354,2.292],[-94.129,26.274],[12.779,-15.882],[-11.269,-18.292],[-7.425,0.332],[-21.765,-10.445],[-2.295,-4.726],[-0.301,-17.2],[-0.002,1.732],[-3.164,4.972]],"o":[[0,0],[-54.126,24.896],[-8.181,-0.136],[-19.782,-8.988],[-0.687,-4.442],[-35.19,0.268],[-4.911,5.002],[0.226,0.367],[11.821,-0.528],[26.395,12.667],[2.295,4.726],[0.033,1.857],[0.017,-17.248],[3.164,-4.972]],"v":[[151.396,-22.703],[141.995,-24.24],[4.01,32.572],[-74.707,1.854],[-138.034,-27.667],[4.285,-83.585],[-146.687,-29.998],[-145.877,17.012],[-141.849,-22.446],[-73.502,6.755],[-0.002,38.152],[2.358,79.305],[5.903,79.163],[7.581,37.454]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[15.274,-6.708],[9.357,0.008],[37.646,12.98],[0.215,2.303],[-68.062,15.196],[12.754,-15.882],[-11.247,-18.292],[-7.409,0.366],[-23.808,-8.246],[-3.123,-5.005],[-0.301,-17.199],[-0.002,1.732],[-3.573,4.68]],"o":[[0,0],[-43.615,23.138],[-9.357,-0.008],[-27.474,-8.422],[-0.436,-5.352],[-21.429,-0.304],[-4.901,5.002],[0.226,0.367],[8.954,-0.442],[26.292,9.422],[2.727,4.481],[0.033,1.857],[0.017,-17.248],[3.958,-5.101]],"v":[[145.297,-28.893],[136.664,-29.305],[16.97,28.091],[-70.49,0.516],[-138.054,-23.933],[-7.044,-85.362],[-146.263,-25.852],[-145.454,21.158],[-141.526,-18.301],[-70.084,4.732],[12.966,34.906],[15.383,75.648],[18.921,75.506],[21.146,33.796]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0,0],[14.573,-4.786],[7.624,0.47],[27.102,16.663],[-0.263,2.149],[-77.324,13.967],[10.355,-13.069],[-8.725,-18.26],[-5.649,0.403],[-16.776,-10.281],[-2.324,-4.911],[-0.614,-16.954],[-0.01,1.732],[-3.435,4.132]],"o":[[0,0],[-43.767,14.176],[-7.624,-0.47],[-19.405,-10.663],[0.278,-4.512],[-33.908,-0.712],[-3.701,5.014],[0.175,0.367],[7.03,-0.502],[18.566,12.111],[2.05,4.563],[0.067,1.856],[0.1,-16.993],[3.871,-4.567]],"v":[[147.278,-16.608],[138.131,-18.856],[-18.948,26.686],[-82.336,-8.474],[-130.986,-38.864],[14.396,-88.567],[-138.354,-40.549],[-137.726,8.352],[-134.674,-33.011],[-83.218,-4.231],[-23.59,32.684],[-21.125,74.181],[-17.697,74.074],[-15.568,32.373]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0,0],[7.798,-4.796],[4.722,-0.708],[25.143,7.282],[0.061,2.448],[-44.422,6.473],[11.437,-14.227],[-7.604,-15.077],[-3.324,2.626],[-21.934,-5.072],[-2.031,-5.105],[0.733,-13.21],[-0.124,1.822],[-1.826,3.737]],"o":[[0,0],[-21.365,8.03],[-4.722,0.708],[-24.57,-6.201],[-0.261,-4.247],[-30.12,-0.125],[-3.95,4.246],[0.207,0.357],[3.469,-2.657],[22.284,6.15],[1.633,4.415],[-0.204,1.951],[1.415,-14.511],[2.014,-4.532]],"v":[[146.999,-33.134],[141.484,-36.609],[23.819,21.327],[-62.612,-0.895],[-137.277,-23.438],[-7.676,-83.572],[-144.029,-24.275],[-143.66,27.913],[-140.761,-16.322],[-63.952,2.656],[21.848,28.286],[23.087,73.014],[26.381,71.987],[27.975,26.489]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0,0],[9.783,-3.317],[4.535,0.207],[15.558,11.78],[-0.368,2.143],[-55.906,6.339],[9.612,-11.957],[-5.743,-16.093],[-2.851,1.547],[-14.754,-11.682],[-1.5,-4.837],[-0.138,-14.571],[0.021,1.727],[-2.388,3.687]],"o":[[0,0],[-28.697,6.839],[-4.535,-0.207],[-15.558,-11.78],[0.405,-3.746],[-34.328,-0.75],[-4.795,5.181],[0.142,0.348],[3.267,-1.652],[14.754,11.682],[1.251,4.426],[-0.042,1.856],[0.292,-13.028],[2.574,-4.166]],"v":[[151.157,-4.859],[144.711,-8.122],[-41.096,35.514],[-92.159,-3.117],[-132.477,-40.763],[37.138,-85.976],[-138.242,-41.651],[-137.984,6.372],[-136.372,-35.356],[-93.831,0.537],[-44.225,41.497],[-42.456,83.893],[-39.429,83.369],[-38.13,40.949]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[7.709,-4.862],[4.731,-0.749],[25.558,7.1],[0.081,2.461],[-43.907,6.479],[11.519,-14.329],[-7.687,-15.032],[-3.346,2.675],[-22.242,-4.794],[-2.055,-5.117],[0.772,-13.149],[-0.13,1.827],[-1.8,3.739]],"o":[[0,0],[-21.035,8.084],[-4.731,0.749],[-24.96,-5.971],[-0.29,-4.269],[-29.931,-0.097],[-3.912,4.205],[0.21,0.357],[3.478,-2.702],[22.608,5.92],[1.651,4.414],[-0.211,1.955],[1.465,-14.578],[1.989,-4.548]],"v":[[146.812,-34.403],[141.34,-37.888],[26.734,20.69],[-61.406,-1.064],[-137.459,-23.12],[-9.8,-79.312],[-144.255,-23.955],[-143.882,28.42],[-140.924,-15.928],[-62.736,2.48],[24.815,27.693],[26.03,72.525],[29.336,71.476],[30.943,25.84]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[0,0],[10.082,-3.094],[4.506,0.345],[16.842,13.638],[-0.52,2.08],[-57.639,6.318],[9.818,-11.214],[-4.801,-16.469],[-2.84,1.267],[-11.814,-8.974],[-1.42,-4.796],[-0.27,-14.776],[0.043,1.713],[-2.472,3.679]],"o":[[0,0],[-29.803,6.659],[-4.506,-0.345],[-16.842,-13.638],[0.658,-3.651],[-34.963,-0.844],[-5.13,5.123],[0.118,0.353],[3.302,-1.365],[12.163,10.79],[1.193,4.428],[-0.017,1.842],[0.122,-12.804],[2.658,-4.111]],"v":[[151.84,-6.517],[145.253,-9.748],[-41.736,34.794],[-90.668,-4.18],[-129.128,-38.771],[39.334,-81.839],[-134.703,-39.902],[-136.421,7.468],[-133.303,-33.785],[-92.297,-1.425],[-45.04,40.63],[-43.192,82.673],[-40.205,82.225],[-38.951,40.27]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[5.915,-5.046],[4.218,-1.065],[25.57,4.381],[0.281,2.375],[-33.616,5.955],[10.675,-14.137],[-7.737,-13.184],[-3.105,2.928],[-22.916,-3.18],[-2.021,-4.772],[1.041,-11.403],[-0.175,1.703],[-1.34,3.426]],"o":[[0,0],[-15.339,7.859],[-4.218,1.065],[-25.57,-4.381],[-0.586,-4.103],[-24.431,0.173],[-2.997,3.507],[0.216,0.327],[3.105,-2.928],[23.2,3.974],[1.604,4.014],[-0.253,1.82],[1.753,-13.894],[1.507,-4.294]],"v":[[131.017,-34.351],[126.619,-37.612],[46.607,14.899],[-50.382,1.464],[-143.816,-15.229],[-52.394,-67.345],[-150.191,-15.886],[-149.132,33.555],[-146.6,-7.908],[-51.31,4.568],[45.413,21.683],[46.254,63.48],[49.259,62.315],[50.789,19.473]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[0,0],[12.346,-2.034],[4.663,1.111],[12.862,16.169],[-0.955,1.92],[-70.689,6.516],[9.352,-9.626],[-3.206,-18.254],[-2.696,0.364],[-10.79,-13.141],[-1.093,-4.809],[-0.981,-16.608],[0.162,1.718],[-3.087,3.817]],"o":[[0,0],[-37.66,6.008],[-4.663,-1.111],[-12.862,-16.169],[1.333,-3.406],[-40.684,-1.397],[-6.289,6],[0.064,0.367],[3.409,-0.516],[10.79,13.141],[0.97,4.652],[0.11,1.854],[-0.763,-12.212],[3.284,-4.012]],"v":[[151.064,-7.575],[143.288,-10.79],[-78.632,9.361],[-107.814,-24.086],[-128.733,-55.414],[79.82,-79.274],[-133.874,-56.801],[-133.737,-9.801],[-133.664,-51.696],[-109.661,-21.526],[-83.082,14.682],[-80.686,56.86],[-77.71,56.802],[-76.604,15.327]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[2.422,-6.682],[3.977,-2.247],[36.145,1.51],[0.952,2.621],[-13.477,5.651],[11.394,-16.588],[-10.199,-10.429],[-4.302,3.682],[-31.171,-0.944],[-2.525,-4.752],[2.139,-8.575],[-0.357,1.695],[-0.391,3.214]],"o":[[0,0],[-3.214,8.865],[-3.977,2.247],[-36.145,-1.51],[-1.628,-4.482],[-15.602,1.026],[-1.209,2.153],[0.299,0.306],[4.302,-3.682],[31.171,0.944],[1.949,3.668],[-0.449,1.802],[3.119,-14.808],[0.541,-4.447]],"v":[[109.763,-34.968],[107.2,-38.255],[85.4,17.488],[-26.135,14.795],[-117.135,9.017],[-72.35,-46.635],[-124.18,8.756],[-120.69,57.418],[-118.753,17.716],[-26.78,18.527],[85.975,25.067],[85.972,66.659],[88.992,64.891],[90.752,21.307]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[9.042,-0.761],[7.743,-0.112],[28.406,0.675],[0.417,2.326],[-79.514,4.528],[3.428,-4.661],[-6.204,-9.51],[-7.101,0.68],[-25.045,-0.865],[-2.319,-4.728],[-0.047,-16.303],[-0.039,1.728],[-2.875,4.789]],"o":[[0,0],[-11.597,0.976],[-7.743,0.112],[-28.406,-0.675],[-0.785,-4.446],[-33.153,0.347],[-4.526,4.706],[0.235,0.36],[11.039,-0.856],[25.044,0.865],[2.259,4.616],[-0.017,1.852],[0.339,-16.995],[2.891,-4.917]],"v":[[147.066,-23.979],[142.121,-27.296],[7.928,-17.534],[-69.952,-19.459],[-135.86,-23.852],[1.596,-36.669],[-144.347,-25.967],[-143.257,21.215],[-139.447,-18.269],[-70.323,-16.244],[4.392,-11.747],[6.507,29.453],[9.997,29.141],[12.08,-12.548]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[0,0],[2.422,-6.682],[3.977,-2.247],[36.145,1.51],[0.952,2.621],[-13.477,5.651],[11.394,-16.588],[-10.199,-10.429],[-4.302,3.682],[-31.171,-0.944],[-2.525,-4.752],[2.139,-8.575],[-0.357,1.695],[-0.391,3.214]],"o":[[0,0],[-3.214,8.865],[-3.977,2.247],[-36.145,-1.51],[-1.628,-4.482],[-15.602,1.026],[-1.209,2.153],[0.299,0.306],[4.302,-3.682],[31.171,0.944],[1.949,3.668],[-0.449,1.802],[3.119,-14.808],[0.541,-4.447]],"v":[[109.763,-34.968],[107.2,-38.255],[85.4,17.488],[-26.135,14.795],[-117.135,9.017],[-72.35,-46.635],[-124.18,8.757],[-120.69,57.418],[-118.753,17.716],[-26.78,18.527],[85.975,25.067],[85.972,66.659],[88.992,64.891],[90.752,21.307]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[0,0],[10.523,0.218],[2.24,1.636],[-0.361,17.658],[-1.522,1.733],[-65.259,0.418],[8.531,-6.807],[1.311,-18.25],[-0.28,0.332],[0.977,-10.431],[-0.086,-4.726],[-1.282,-16.325],[0.302,1.706],[-2.803,3.558]],"o":[[0,0],[-32.662,-0.677],[-2.24,-1.636],[0.226,-11.049],[2.197,-2.5],[-46.229,-1.957],[-8.406,6.807],[-0.026,0.366],[0.445,-0.528],[-1.236,13.195],[0.086,4.726],[0.145,1.852],[-1.47,-8.299],[2.803,-3.558]],"v":[[116.431,-1.547],[109.776,-5.552],[-108.385,-5.727],[-108.294,-35.782],[-103.604,-73.528],[99.27,-78.216],[-106.92,-74.672],[-113.628,-20.749],[-109.551,-71.558],[-111.908,-31.14],[-112.678,-0.96],[-110.339,41.774],[-107.732,41.757],[-107.464,0.467]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":107,"s":[{"i":[[0,0],[14.948,-6.403],[10.409,-0.136],[35.329,7.785],[0.052,2.315],[-53.14,10.043],[12.359,-15.882],[-10.899,-18.292],[-7.174,0.453],[-25.418,-5.773],[-3.963,-5.319],[-0.292,-17.199],[-0.002,1.732],[-3.93,4.352]],"o":[[0,0],[-35.477,15.198],[-10.409,0.136],[-35.329,-7.785],[-0.142,-6.375],[-23.512,-0.457],[-4.749,5.002],[0.219,0.367],[5.472,-0.346],[25.418,5.773],[3.134,4.205],[0.032,1.857],[0.016,-17.248],[4.736,-5.246]],"v":[[145.293,-30.808],[136.201,-32.344],[40.524,20.398],[-54.473,0.604],[-124.853,-18.143],[-28.975,-71.085],[-132.324,-19.599],[-131.541,27.411],[-127.838,-12.047],[-54.977,4.051],[36.644,28.603],[39.055,68.881],[42.484,68.739],[45.26,27.03]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[0,0],[10.523,0.218],[2.24,1.636],[-0.361,17.658],[-1.522,1.733],[-65.259,0.418],[8.531,-6.807],[1.311,-18.25],[-0.28,0.332],[0.977,-10.431],[-0.086,-4.726],[-1.282,-16.325],[0.302,1.706],[-2.803,3.558]],"o":[[0,0],[-32.662,-0.677],[-2.24,-1.636],[0.226,-11.049],[2.197,-2.5],[-46.229,-1.957],[-8.406,6.807],[-0.026,0.366],[0.445,-0.528],[-1.236,13.195],[0.086,4.726],[0.145,1.852],[-1.47,-8.299],[2.803,-3.558]],"v":[[116.431,-1.547],[109.776,-5.552],[-108.385,-5.727],[-108.294,-35.782],[-103.604,-73.528],[99.27,-78.216],[-106.92,-74.672],[-113.628,-20.749],[-109.551,-71.558],[-111.908,-31.14],[-112.678,-0.96],[-110.339,41.774],[-107.732,41.757],[-107.464,0.467]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[0,0],[11.288,-0.981],[3.237,1.386],[6.041,18.196],[-1.161,1.844],[-70.007,4.727],[4.306,-7.5],[-2.651,-18.196],[-1.474,0.39],[-2.746,-10.746],[-0.458,-4.726],[-1.122,-16.47],[-0.026,1.732],[-2.713,3.048]],"o":[[0,0],[-33.705,1.989],[-3.237,-1.386],[-3.061,-10.985],[1.637,-2.849],[-36.885,-1.976],[-0.87,5.038],[0.053,0.365],[2.347,-0.62],[3.291,13.487],[0.458,4.726],[0.126,1.853],[0.25,-16.487],[3.192,-3.509]],"v":[[118.246,-9.656],[110.761,-13.313],[-98.945,-3.427],[-110.823,-38.118],[-118.354,-70.662],[83.194,-83.432],[-123.114,-71.883],[-122.99,-24.453],[-121.982,-64.373],[-113.262,-33.669],[-104.221,0.954],[-101.986,43.946],[-99.225,43.908],[-97.564,2.225]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":148,"s":[{"i":[[0,0],[14.948,-6.403],[10.409,-0.136],[35.329,7.785],[0.052,2.315],[-53.14,10.043],[12.359,-15.882],[-10.899,-18.292],[-7.174,0.453],[-25.418,-5.773],[-3.963,-5.319],[-0.292,-17.199],[-0.002,1.732],[-3.93,4.352]],"o":[[0,0],[-35.477,15.198],[-10.409,0.136],[-35.329,-7.785],[-0.142,-6.375],[-23.512,-0.457],[-4.749,5.002],[0.219,0.367],[5.472,-0.346],[25.418,5.773],[3.134,4.205],[0.032,1.857],[0.016,-17.248],[4.736,-5.246]],"v":[[145.531,-107.808],[136.439,-109.344],[40.762,-56.602],[-54.235,-76.396],[-124.615,-95.143],[-28.737,-148.085],[-132.087,-96.599],[-131.303,-49.589],[-127.6,-89.047],[-54.739,-72.949],[36.882,-48.397],[39.293,-8.119],[42.722,-8.261],[45.498,-49.97]],"c":true}]},{"t":152,"s":[{"i":[[0,0],[11.409,-0.98],[3.271,1.386],[2.584,18.764],[-0.756,1.844],[-70.759,4.721],[2.803,-7.5],[-1.723,-18.196],[-0.959,0.389],[-1.098,-14.315],[-0.605,-4.71],[-0.781,-14.988],[-0.027,1.732],[-2.742,3.047]],"o":[[0,0],[-34.067,1.986],[-3.271,-1.386],[-2.279,-16.548],[1.065,-2.849],[-20.836,-2.236],[-0.566,5.038],[0.035,0.365],[1.527,-0.62],[1.098,14.315],[0.964,7.504],[0.097,1.854],[0.254,-16.487],[3.227,-3.509]],"v":[[106.587,-55.893],[99.136,-59.553],[-98.99,-55.686],[-104.66,-88.94],[-107.445,-122.467],[85.622,-130.924],[-110.541,-123.689],[-110.466,-76.259],[-109.806,-116.178],[-106.759,-89.804],[-103.426,-52.68],[-102.068,-8.313],[-99.278,-8.351],[-97.595,-50.034]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.945098042488,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.201,275.417]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[0.825,3.762],[-2.738,1.99],[-21.396,-8.564],[1.389,-3.594]],"o":[[-0.937,-4.273],[26.994,12.261],[1.209,3.836],[-0.753,1.949]],"v":[[-75.204,-10.142],[-73.667,-54.683],[73.975,9.891],[75.3,54.639]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0.823,3.762],[-2.733,1.99],[-21.355,-8.564],[1.387,-3.594]],"o":[[-0.935,-4.273],[26.943,12.261],[1.206,3.836],[-0.752,1.949]],"v":[[-74.777,-5.997],[-73.244,-50.538],[87.002,6.234],[88.325,50.982]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0.657,3.759],[-2.07,1.997],[-16.296,-8.564],[1.058,-3.594]],"o":[[-0.747,-4.27],[20.654,12.188],[0.921,3.836],[-0.574,1.949]],"v":[[-66.578,-18.797],[-65.399,-65.236],[51.171,4.779],[51.761,49.515]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0.658,3.983],[-1.974,2.217],[-6.504,-9.149],[1.222,-5.257]],"o":[[-0.747,-4.525],[20.668,12.172],[2.629,8.45],[-0.439,2.047]],"v":[[-72.489,1.433],[-71.218,-48.886],[96.192,0.293],[96.482,48.082]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0.5,3.759],[-1.348,2.102],[-6.915,-8.64],[0.827,-4.31]],"o":[[-0.568,-4.27],[15.042,11.39],[1.459,5.969],[-0.342,1.949]],"v":[[-66.368,-20.389],[-65.553,-66.329],[30.35,13.941],[30.618,59.068]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0.665,3.993],[-2.002,2.222],[-6.486,-9.172],[1.239,-5.299]],"o":[[-0.755,-4.536],[20.921,12.207],[2.681,8.561],[-0.443,2.051]],"v":[[-72.73,1.953],[-71.439,-48.563],[99.148,-0.32],[99.439,47.589]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[0.323,3.743],[-1.339,2.028],[-6.977,-8.564],[0.767,-4.167]],"o":[[-0.367,-4.251],[13.717,11.877],[1.283,5.595],[-0.328,1.935]],"v":[[-64.704,-19.38],[-62.084,-64.592],[29.57,13.14],[29.834,57.864]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0.702,3.724],[-1.984,2.091],[-5.504,-8.564],[1.25,-5.222]],"o":[[-0.797,-4.23],[20.828,11.231],[2.836,8.834],[-0.428,1.909]],"v":[[-77.984,7.268],[-77.319,-40.585],[119.446,-6.328],[119.71,38.409]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[0.117,3.753],[-0.988,1.993],[-7.778,-8.564],[0.505,-3.594]],"o":[[-0.133,-4.263],[9.855,12.228],[0.439,3.836],[-0.274,1.949]],"v":[[-61.711,-36.954],[-61.393,-81.487],[-8.158,-12.524],[-7.894,32.193]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[1.019,3.708],[-2.525,2.144],[-4.269,-8.564],[1.654,-6.105]],"o":[[-1.158,-4.212],[26.789,10.689],[4.138,11.549],[-0.511,1.887]],"v":[[-50.019,31.602],[-51.096,-15.949],[159.524,-3.381],[159.788,41.367]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[2.173,4.596],[-2.716,2.006],[-19.615,-8.564],[1.417,-3.856]],"o":[[-1.869,-3.954],[26.973,12.097],[1.513,4.638],[-0.728,1.942]],"v":[[-72.585,-5.801],[-71.32,-50.655],[78.325,-40.027],[79.54,4.721]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[1.019,3.708],[-2.525,2.144],[-4.269,-8.564],[1.654,-6.105]],"o":[[-1.158,-4.212],[26.789,10.689],[4.138,11.549],[-0.511,1.887]],"v":[[-50.019,31.602],[-51.096,-15.949],[159.524,-3.381],[159.788,41.367]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-0.326,3.748],[-0.103,1.99],[-0.806,-8.564],[0.052,-3.594]],"o":[[0.37,-4.257],[1.016,12.261],[0.046,3.836],[-0.028,1.949]],"v":[[-40.883,-47.905],[-34.827,-99.358],[-37.622,-27.595],[-37.624,17.108]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":107,"s":[{"i":[[0.797,3.762],[-2.648,1.99],[-20.693,-8.564],[1.344,-3.594]],"o":[[-0.906,-4.273],[26.107,12.261],[1.169,3.836],[-0.729,1.949]],"v":[[-60.801,0.257],[-59.315,-44.284],[110.707,-0.533],[111.99,44.215]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[-0.326,3.748],[-0.103,1.99],[-0.806,-8.564],[0.052,-3.594]],"o":[[0.37,-4.257],[1.016,12.261],[0.046,3.836],[-0.028,1.949]],"v":[[-40.883,-47.905],[-34.827,-99.358],[-37.622,-27.595],[-37.624,17.108]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[0.247,3.754],[-0.502,2.011],[-4.273,-8.564],[0.277,-3.594]],"o":[[-0.281,-4.264],[5.656,12.044],[0.241,3.836],[-0.15,1.949]],"v":[[-50.716,-51.591],[-50.317,-96.572],[-28.313,-25.431],[-29.232,19.28]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":148,"s":[{"i":[[0.797,3.762],[-2.648,1.99],[-20.693,-8.564],[1.344,-3.594]],"o":[[-0.906,-4.273],[26.107,12.261],[1.169,3.836],[-0.729,1.949]],"v":[[-60.563,-76.743],[-59.077,-121.284],[110.945,-77.533],[112.227,-32.785]],"c":true}]},{"t":152,"s":[{"i":[[0.161,3.754],[-0.327,2.011],[-4.318,-8.564],[0.281,-3.594]],"o":[[-0.182,-4.264],[3.679,12.044],[0.244,3.836],[-0.152,1.949]],"v":[[-38.04,-103.397],[-37.776,-148.377],[-28.381,-77.69],[-29.315,-32.98]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.43137255311,0.823529422283,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[183.495,301.363]},"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 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[1.58,7.55],[-21.49,-0.568],[-2.699,-5.495],[7.374,0]],"o":[[-0.897,-4.284],[17.667,0.467],[2.911,5.928],[-5.818,0]],"v":[[-148.587,-6.199],[0.298,-60.969],[148.548,-3.4],[1.528,57.974]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[1.577,7.55],[-20.387,-0.221],[-2.694,-5.495],[7.36,0]],"o":[[-0.895,-4.284],[16.3,0.177],[2.906,5.928],[-5.807,0]],"v":[[-148.163,-2.054],[-11.027,-62.747],[143.201,-8.466],[14.551,54.317]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0.311,7.372],[-17.193,-0.947],[-2.274,-5.657],[5.616,0]],"o":[[0.029,-4.628],[14.03,0.874],[2.472,6.149],[-4.431,0]],"v":[[-140.254,-16.75],[11.146,-65.707],[144.645,3.297],[-21.79,52.862]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0.583,7.706],[-13.311,-1.381],[-1.093,-6.064],[2.242,0]],"o":[[0.089,-4.424],[14.358,1.294],[1.19,6.603],[-1.769,0]],"v":[[-145.928,-0.476],[-10.852,-60.739],[144.688,-13.439],[22.242,48.262]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-0.262,7.235],[-12.782,-2.273],[-1.26,-5.827],[2.383,0]],"o":[[0.571,-4.673],[12.575,2.215],[1.377,6.375],[-1.88,0]],"v":[[-140.141,-17.852],[34.535,-62.936],[148.88,15.46],[-43.558,62.009]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0.621,7.728],[-13.335,-1.341],[-1.086,-6.074],[2.235,0]],"o":[[0.067,-4.413],[14.438,1.253],[1.182,6.613],[-1.764,0]],"v":[[-146.155,-0.156],[-13.002,-56.488],[144.5,-14.737],[25.196,47.645]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-0.685,7.148],[-12.703,-2.407],[-1.286,-5.791],[2.405,0]],"o":[[0.834,-4.684],[12.305,2.354],[1.405,6.341],[-1.897,0]],"v":[[-136.603,-16.103],[36.818,-58.767],[149.568,13.896],[-44.332,61.222]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[1.001,7.239],[-11.89,-0.848],[-0.879,-5.63],[1.897,0]],"o":[[-0.209,-3.923],[13.38,0.755],[0.957,6.116],[-1.497,0]],"v":[[-152.09,7.913],[-55.673,-44.521],[128.742,-14.576],[45.395,41.755]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[-1.6,7.099],[-13.145,-3.254],[-1.506,-5.879],[2.68,0]],"o":[[1.4,-5.098],[11.721,3.222],[1.648,6.463],[-2.115,0]],"v":[[-135.773,-33.002],[77.718,-56.067],[148.793,13.184],[-81.979,35.558]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[2.413,7.315],[-11.208,0.459],[-0.538,-5.495],[1.471,0]],"o":[[-1.084,-3.285],[14.281,-0.584],[0.581,5.928],[-1.161,0]],"v":[[-126.08,32.555],[-76.268,-24.02],[107.486,-15.728],[85.349,44.702]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[1.667,7.525],[-20.421,-0.461],[-2.474,-5.495],[6.76,0]],"o":[[-0.916,-4.18],[17.315,0.358],[2.669,5.928],[-5.333,0]],"v":[[-146.246,-2.169],[-2.384,-14.053],[144.277,-4.682],[5.698,8.056]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[2.413,7.315],[-11.208,0.459],[-0.538,-5.495],[1.471,0]],"o":[[-1.084,-3.285],[14.281,-0.584],[0.581,5.928],[-1.161,0]],"v":[[-126.08,32.555],[-76.268,-24.02],[107.486,-15.728],[85.349,44.702]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-3.164,6.876],[-9.832,-5.143],[-0.879,-6.06],[0.278,0]],"o":[[2.522,-5.482],[9.832,5.143],[0.974,6.72],[-0.219,0]],"v":[[-108.82,-50.873],[98.106,-54.725],[114.456,19.912],[-112.146,20.487]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":107,"s":[{"i":[[1.528,7.55],[-18.559,0.194],[-2.61,-5.495],[7.132,0]],"o":[[-0.867,-4.284],[14.293,-0.149],[2.816,5.928],[-5.627,0]],"v":[[-134.224,4.2],[-32.893,-48.469],[142.476,-11.505],[38.19,47.55]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[-3.164,6.876],[-9.832,-5.143],[-0.879,-6.06],[0.278,0]],"o":[[2.522,-5.482],[9.832,5.143],[0.974,6.72],[-0.219,0]],"v":[[-108.82,-50.873],[98.106,-54.725],[114.456,19.912],[-112.146,20.487]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[-2.202,7.019],[-8.693,-2.407],[-1.177,-5.968],[1.472,0]],"o":[[1.829,-5.309],[7.753,2.255],[1.299,6.588],[-1.162,0]],"v":[[-125.014,-48.085],[81.554,-60.087],[116.124,11.443],[-102.488,22.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":148,"s":[{"i":[[1.528,7.55],[-18.559,0.194],[-2.61,-5.495],[7.132,0]],"o":[[-0.867,-4.284],[14.293,-0.149],[2.816,5.928],[-5.627,0]],"v":[[-133.986,-72.8],[-32.655,-125.469],[142.714,-88.505],[38.427,-29.45]],"c":true}]},{"t":152,"s":[{"i":[[-1.434,7.019],[-8.786,-2.407],[-0.79,-6.03],[1.488,0]],"o":[[1.191,-5.309],[7.835,2.255],[0.872,6.657],[-1.174,0]],"v":[[-112.441,-99.89],[83.985,-107.579],[104.643,-34.802],[-102.551,-29.608]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.43137255311,0.823529422283,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[258.101,251.618]},"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 22","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[-15.649,5.989],[-4.466,-6.858],[2.233,-5.144],[12.839,0]],"o":[[22.601,-8.649],[4.466,6.858],[-2.233,5.144],[-12.839,0]],"v":[[-1.304,33.145],[148.696,-26.287],[148.696,21.148],[1.888,80.86]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[-15.619,5.989],[-2.844,-5.144],[2.229,-5.144],[12.814,0]],"o":[[22.558,-8.649],[3.475,7.273],[-2.229,5.144],[-12.814,0]],"v":[[13.561,30.959],[143.349,-31.352],[143.349,16.083],[14.91,77.203]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[-11.919,5.989],[-2.341,-6.222],[3.138,-4.536],[9.743,0.088]],"o":[[17.214,-8.649],[2.742,6.824],[-3.138,4.536],[-10.223,-0.48]],"v":[[-22.641,29.01],[144.793,-19.589],[144.004,27.479],[-21.901,75.736]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[-4.757,6.398],[-0.76,-5.626],[2.405,-4.755],[5.191,1.273]],"o":[[6.871,-9.24],[0.977,7.51],[-2.405,4.755],[-5.303,-1.362]],"v":[[22.241,25.285],[144.836,-36.326],[143.889,13.902],[22.342,74.259]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-5.058,6.042],[-0.977,-6.446],[3.185,-4.108],[5.987,1.861]],"o":[[7.305,-8.727],[1.136,6.7],[-3.185,4.109],[-6.146,-1.991]],"v":[[-43.733,38.337],[149.028,-7.427],[147.677,39.779],[-43.502,85.283]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[-4.744,6.414],[-0.75,-5.589],[2.37,-4.784],[5.155,1.247]],"o":[[6.851,-9.263],[0.97,7.546],[-2.37,4.784],[-5.265,-1.334]],"v":[[25.203,24.699],[144.648,-37.623],[143.719,12.74],[25.298,73.764]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-5.103,5.989],[-1.009,-6.57],[3.302,-4.011],[6.107,1.95]],"o":[[7.37,-8.649],[1.16,6.578],[-3.302,4.011],[-6.274,-2.086]],"v":[[-44.533,37.446],[149.716,-8.991],[148.304,37.76],[-44.283,84.085]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[-4.025,5.989],[-0.566,-4.746],[1.748,-4.627],[4.178,0.889]],"o":[[5.814,-8.649],[0.783,7.21],[-1.748,4.627],[-4.254,-0.951]],"v":[[45.492,19.105],[128.89,-37.462],[128.247,9.661],[45.521,64.63]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[-5.688,5.989],[-1.25,-7.56],[4.146,-3.676],[7.154,2.526]],"o":[[8.216,-8.649],[1.365,6.235],[-4.146,3.676],[-7.37,-2.703]],"v":[[-82.343,11.169],[148.941,-9.702],[147.112,36.846],[-81.972,58.414]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-3.122,5.989],[-0.194,-3.218],[0.445,-5.144],[2.561,0]],"o":[[4.509,-8.649],[0.466,7.739],[-0.445,5.144],[-2.561,0]],"v":[[85.696,22.998],[107.634,-38.614],[107.634,8.821],[85.539,67.588]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[-14.346,5.989],[-4.021,-6.479],[1.857,-1.622],[11.77,0]],"o":[[20.72,-8.649],[4.05,6.95],[-1.857,1.622],[-11.77,0]],"v":[[3.197,-16.448],[144.425,-27.569],[144.397,20.317],[6.04,30.942]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-3.122,5.989],[-0.194,-3.218],[0.445,-5.144],[2.561,0]],"o":[[4.509,-8.649],[0.466,7.739],[-0.445,5.144],[-2.561,0]],"v":[[85.696,22.998],[107.634,-38.614],[107.634,8.821],[85.539,67.588]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-0.589,5.989],[-0.358,-8.655],[4.972,-2.972],[5.035,4.521]],"o":[[0.851,-8.649],[0.238,5.752],[-4.972,2.972],[-5.035,-4.521]],"v":[[-112.11,-4.342],[114.604,-2.974],[111.923,43.148],[-112.043,43.329]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":107,"s":[{"i":[[-15.135,5.989],[-0.94,-3.218],[2.159,-5.144],[12.417,0]],"o":[[21.858,-8.649],[2.26,7.739],[-2.159,5.144],[-12.417,0]],"v":[[39.303,25.846],[142.624,-34.392],[142.624,13.043],[38.543,70.436]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[-0.589,5.989],[-0.358,-8.655],[4.972,-2.972],[5.035,4.521]],"o":[[0.851,-8.649],[0.238,5.752],[-4.972,2.972],[-5.035,-4.521]],"v":[[-112.11,-4.342],[114.604,-2.974],[111.923,43.148],[-112.043,43.329]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":133,"s":[{"i":[[-3.125,5.989],[-1.049,-8.356],[4.502,-3.334],[2.465,0.261]],"o":[[4.513,-8.649],[0.95,5.936],[-4.502,3.334],[-3.819,-1.431]],"v":[[-102.935,-2.178],[116.272,-11.443],[114.048,34.898],[-103.482,45.501]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.9,"y":0},"t":148,"s":[{"i":[[-15.135,5.989],[-0.94,-3.218],[2.159,-5.144],[12.417,0]],"o":[[21.858,-8.649],[2.26,7.739],[-2.159,5.144],[-12.417,0]],"v":[[39.541,-51.154],[142.862,-111.392],[142.862,-63.957],[38.78,-6.564]],"c":true}]},{"t":152,"s":[{"i":[[-3.159,5.989],[-0.503,-8.405],[4.55,-3.334],[2.491,0.261]],"o":[[4.562,-8.649],[0.563,5.985],[-4.55,3.334],[-3.86,-1.432]],"v":[[-103.004,-54.437],[104.791,-57.688],[101.319,-11.342],[-103.561,-6.759]],"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.286,0.765,0.961,0.5,0.229,0.678,0.98,1,0.173,0.592,1]}},"s":{"a":0,"k":[-150.506,0.942]},"e":{"a":0,"k":[152.042,0.942]},"t":1,"nm":"Gradient Fill 1578","hd":false},{"ty":"tr","p":{"a":0,"k":[257.953,274.505]},"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 23","bm":0,"hd":false}],"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":62,"ty":4,"nm":"V1","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[257.991,332.058,0]},"a":{"a":0,"k":[257.991,360.558,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-0.948,5.318],[4.415,1.071],[2.378,-5.805],[6.358,-17.081],[-1.379,-1.097],[-4.324,-0.854],[0,0],[-2.213,7.161]],"o":[[0,0],[-2.905,-0.704],[-2.378,5.805],[-2.922,7.85],[2.969,2.361],[7.057,1.394],[0,0],[2.998,-9.703]],"v":[[11.845,-75.625],[-12.059,-79.663],[-22.662,-75.266],[-38.55,-41.505],[-43.117,-25.635],[-27.968,-22.579],[-9.735,-16.614],[1.48,-44.535]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":70,"s":[{"i":[[-4.556,3.017],[-2.106,6.203],[1.706,1.273],[14.558,-7.551],[3.743,-4.639],[2.215,-4.36],[0,0],[-31.005,14.9]],"o":[[0,0],[2.138,-6.3],[-1.706,-1.273],[-18.931,9.82],[-5.203,6.449],[-3.343,6.582],[0,0],[31.005,-14.9]],"v":[[26.107,-104.515],[38.346,-126.164],[40.41,-139.43],[-13.625,-115.003],[-74.529,-84.283],[-84.368,-62.267],[-93.55,-47.427],[-29.65,-74.232]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[-5.753,2.959],[-2.828,-3.774],[3.152,-5.484],[18.33,-7.309],[9.397,2.787],[7.037,7.28],[0,0],[-32.685,12.639]],"o":[[0,0],[3.482,4.647],[-3.152,5.484],[-23.837,9.505],[-9.746,-2.891],[-7.037,-7.28],[0,0],[32.599,-12.606]],"v":[[55.474,-24.298],[83.495,2.209],[88.327,17.289],[37.843,42.191],[-51.768,74.572],[-73.79,49.765],[-93.525,30.626],[-13.746,3.322]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[{"i":[[-5.472,3.101],[-4.632,-1.291],[0.352,-5.226],[17.396,-7.957],[9.109,2.591],[6.175,2.67],[0,0],[-31.183,13.407]],"o":[[0,0],[6.058,1.689],[-0.421,6.259],[-22.623,10.348],[-4.126,-1.174],[-5.112,-2.211],[0,0],[30.672,-13.188]],"v":[[46.147,-50.213],[65.91,-50.075],[88.081,-37.823],[36.121,-12.398],[-47.925,17.861],[-66.781,8.472],[-92.851,4.015],[-18.123,-22.677]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":106,"s":[{"i":[[-5.472,3.101],[-2.814,-3.703],[2.905,-5.56],[17.484,-7.76],[9.119,2.553],[3.813,6.392],[0,0],[-31.442,12.79]],"o":[[0,0],[3.465,4.56],[-2.905,5.56],[-22.738,10.092],[-9.458,-2.648],[-3.813,-6.392],[0,0],[33.428,-13.598]],"v":[[50.115,-45.424],[70.492,-21.62],[74.258,-1.164],[26.216,24.981],[-59.341,59.571],[-73.149,34.817],[-92.851,13.089],[-15.519,-14.864]],"c":true}]},{"t":143,"s":[{"i":[[-5.472,3.101],[-2.814,-3.703],[2.905,-5.56],[17.484,-7.76],[9.119,2.553],[6.953,7.104],[0,0],[-31.442,12.79]],"o":[[0,0],[3.465,4.56],[-2.905,5.56],[-22.738,10.092],[-9.458,-2.648],[-6.953,-7.104],[0,0],[33.428,-13.598]],"v":[[50.115,-45.424],[77.742,-19.62],[82.758,-4.664],[34.716,21.481],[-50.841,56.071],[-72.649,31.817],[-92.851,13.089],[-15.519,-14.864]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.611764729023,0.870588302612,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.451,0.937,1,0.5,0.549,0.886,1,1,0.647,0.835,1]}},"s":{"a":0,"k":[88.208,20.993]},"e":{"a":0,"k":[-72.695,-44.874]},"t":1,"nm":"Gradient Fill 1245","hd":false},{"ty":"tr","p":{"a":0,"k":[352.336,331.792]},"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":[347.759,362.382]},"a":{"a":0,"k":[347.759,337.882]},"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":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[6.285,0.217],[-3.075,3.49],[-3.988,1.603],[-30.832,0.095],[-2.445,-1.717],[0.686,-5.627],[0,0],[34.559,0.9]],"o":[[0,0],[4.531,-5.142],[4.327,-1.739],[32.866,-0.101],[3.02,2.121],[-0.628,5.151],[0,0],[-35.043,-0.912]],"v":[[-25.429,-18.927],[-13.267,-33.99],[5.847,-44.842],[89.864,-40.663],[178.226,-34.278],[177.892,-22.853],[176.963,-11.119],[83.525,-14.132]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[4.556,3.017],[3.213,5.734],[-2.239,0.988],[-23.028,-13.071],[-2.035,-4.072],[-4.028,-8.066],[0,0],[26.762,12.632]],"o":[[0,0],[-3.778,-6.742],[2.239,-0.988],[23.028,13.071],[2.034,4.072],[3.24,6.487],[0,0],[-26.989,-12.739]],"v":[[-25.345,-99.4],[-39.291,-121.159],[-45.995,-142.458],[6.784,-108.983],[77.859,-76.231],[83.325,-61.739],[93.16,-42.281],[31.119,-69.511]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[5.81,2.845],[2.753,-3.829],[-2.261,-3.977],[-18.471,-6.945],[-7.29,1.133],[-6.892,7.418],[0,0],[32.352,11.727]],"o":[[0,0],[-3.389,4.715],[2.261,3.977],[24.02,9.032],[4.39,-0.682],[6.892,-7.418],[0,0],[-33.589,-12.175]],"v":[[-57.025,-18.037],[-86.286,9.8],[-91.879,24.594],[-37.402,49.613],[52.646,75.055],[74.359,54.979],[93.029,35.774],[16.17,10.218]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[5.472,3.101],[4.392,-2.615],[-1.961,-4.095],[-17.398,-7.953],[-7.076,0.73],[-7.259,4.416],[0,0],[30.993,12.208]],"o":[[0,0],[-4.921,2.93],[1.961,4.095],[22.625,10.342],[4.261,-0.439],[6.557,-3.989],[0,0],[-29.939,-11.793]],"v":[[-46.933,-45.392],[-63.144,-42.907],[-80.854,-29.956],[-32.019,-3.359],[55.484,27.008],[73.614,13.326],[93.731,9.163],[22.023,-14.699]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":105,"s":[{"i":[[5.472,3.101],[2.22,-4.087],[-2.006,-4.073],[-17.484,-7.76],[-7.067,0.808],[-3.679,6.374],[0,0],[31.167,11.756]],"o":[[0,0],[-3.21,5.909],[2.006,4.073],[22.738,10.092],[4.256,-0.486],[3.679,-6.374],[0,0],[-32.799,-12.372]],"v":[[-49.165,-42.62],[-66.779,-17.363],[-71.298,4.918],[-19.926,32.337],[65.675,61.762],[76.19,43.422],[93.731,18.237],[17.312,-8.524]],"c":true}]},{"t":141,"s":[{"i":[[5.472,3.101],[2.814,-3.703],[-2.006,-4.073],[-17.484,-7.76],[-7.067,0.808],[-6.953,7.104],[0,0],[31.167,11.756]],"o":[[0,0],[-3.465,4.56],[2.006,4.073],[22.738,10.092],[4.256,-0.486],[6.953,-7.104],[0,0],[-32.799,-12.372]],"v":[[-49.165,-42.62],[-78.529,-16.113],[-84.548,-1.582],[-33.176,25.837],[52.425,55.262],[74.19,36.172],[93.731,18.237],[17.312,-8.524]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.611764729023,0.870588302612,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.451,0.937,1,0.5,0.549,0.886,1,1,0.647,0.835,1]}},"s":{"a":0,"k":[-27.542,40.743]},"e":{"a":0,"k":[37.055,-41.124]},"t":1,"nm":"Gradient Fill 1ww","hd":false},{"ty":"tr","p":{"a":0,"k":[164.989,326.704]},"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":"tr","p":{"a":0,"k":[169.335,357.537]},"a":{"a":0,"k":[169.335,333.037]},"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}],"ip":62,"op":181,"st":-19,"bm":0},{"ddd":0,"ind":63,"ty":4,"nm":"L L","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[186.66,397.624,0]},"a":{"a":0,"k":[186.66,421.624,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-2.31,-0.085],[0.632,0.969],[8.304,-0.988],[-0.499,-1.002]],"o":[[2.31,0.085],[-2.809,-4.31],[-2.459,0.292],[0.499,1.002]],"v":[[116.942,-59.309],[126.474,-59.76],[71.136,-65.311],[61.282,-61.969]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[-1.097,0.253],[0.351,1.102],[19.541,4.952],[1.345,-1.275]],"o":[[18.216,-4.205],[-1.356,-4.261],[-9.202,-2.332],[-1.12,1.062]],"v":[[46.555,-75.752],[69.894,-68.884],[29.223,-92],[9.891,-91.894]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[-0.611,0.945],[-0.792,0.784],[9.107,1.483],[-1.377,-1.436]],"o":[[13.466,-20.818],[0.975,-0.965],[-19.454,-3.169],[1.547,1.613]],"v":[[15.485,42.476],[44.356,28.221],[4.685,14.372],[-25.769,29.511]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-1.097,0.253],[-0.857,0.713],[24.173,5.168],[1.345,-1.275]],"o":[[18.216,-4.205],[1.054,-0.877],[-14.954,-3.197],[-1.12,1.062]],"v":[[29.23,-14.545],[60.052,-8.614],[22.022,-26.668],[-7.81,-25.812]],"c":true}]},{"i":{"x":0.27,"y":1},"o":{"x":0.167,"y":0.167},"t":113,"s":[{"i":[[-0.609,0.947],[-0.835,0.739],[9.111,1.461],[-1.38,-1.432]],"o":[[13.414,-20.852],[1.027,-0.908],[-19.462,-3.12],[1.551,1.609]],"v":[[6.419,31.249],[37.264,13.65],[1.305,4.409],[-29.487,20.249]],"c":true}]},{"t":159,"s":[{"i":[[-0.69,0.889],[-0.857,0.713],[8.945,2.263],[-1.248,-1.549]],"o":[[15.211,-19.58],[1.054,-0.877],[-19.109,-4.834],[1.402,1.74]],"v":[[6.98,18.455],[38.677,5.886],[3.522,-7.418],[-27.81,4.313]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gs","o":{"a":0,"k":100},"w":{"a":0,"k":5.001},"g":{"p":3,"k":{"a":0,"k":[0,1,0.82,0.098,0.402,0.959,0.645,0.049,0.804,0.918,0.471,0]}},"s":{"a":0,"k":[-3783.583,2758.54]},"e":{"a":0,"k":[-3830.863,2636.995]},"t":1,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10},"bm":0,"nm":"Gradient Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.82,0.098,0.5,1,0.906,0.392,1,1,0.992,0.686]}},"s":{"a":0,"k":[-8.233,6.072]},"e":{"a":0,"k":[8.237,-6.376]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[142.679,353.375]},"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 24","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[148.088,382.937]},"a":{"a":0,"k":[148.088,358.437]},"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 332","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[-6.089,-2.383],[-8.821,0.943],[-0.869,-0.943],[0,0],[11.829,0.576],[0.706,1.384]],"o":[[0,0],[6.552,2.564],[7.107,-0.76],[1.48,1.605],[0,0],[-9.07,-0.442],[-0.842,-1.652]],"v":[[37.546,1.322],[45.124,7.662],[73.203,9.884],[86.91,6.999],[86.948,16.882],[61.465,17.896],[38.512,14.224]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[0,0],[-4.12,-3.732],[-7.279,-0.592],[-0.663,-0.985],[0,0],[13.044,6.388],[0.507,1.417]],"o":[[0,0],[4.12,3.732],[7.058,0.574],[1.129,1.676],[0,0],[-6.709,-3.286],[-0.604,-1.691]],"v":[[-6.442,-21.342],[-1.296,-11.738],[21.093,0.954],[27.733,-0.212],[27.24,8.625],[7.829,1.313],[-6.234,-7.9]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[-4.472,-3.302],[-7.201,-1.213],[-0.639,-1],[0,0],[13.102,6.269],[0.472,1.429]],"o":[[0,0],[4.767,3.52],[7.071,1.191],[1.089,1.703],[0,0],[-6.723,-3.217],[-0.563,-1.705]],"v":[[-18.654,-18.465],[-12.907,-9.162],[11.102,0.042],[22.247,0.132],[21.458,9.751],[-5.699,1.163],[-18.521,-6.575]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[0,0],[-4.12,-3.732],[-7.279,-0.592],[-0.663,-0.985],[0,0],[13.25,5.951],[0.507,1.417]],"o":[[0,0],[4.12,3.732],[7.058,0.574],[1.129,1.676],[0,0],[-6.798,-3.053],[-0.604,-1.691]],"v":[[-16.145,-17.005],[-10.625,-7.527],[13.39,1.541],[23.576,1.562],[23.083,10.399],[1.251,4.337],[-15.562,-3.689]],"c":true}]},{"i":{"x":0.27,"y":1},"o":{"x":0.167,"y":0.167},"t":113,"s":[{"i":[[0,0],[-4.11,-3.743],[-7.277,-0.612],[-0.661,-0.986],[0,0],[13.234,5.986],[0.503,1.419]],"o":[[0,0],[4.11,3.743],[7.056,0.593],[1.125,1.679],[0,0],[-6.79,-3.072],[-0.6,-1.693]],"v":[[-16.616,-16.453],[-11.121,-6.96],[12.869,2.172],[23.055,2.22],[22.539,11.057],[0.723,4.935],[-16.069,-3.136]],"c":true}]},{"t":159,"s":[{"i":[[0,0],[-4.11,-3.743],[-7.277,-0.612],[-0.661,-0.986],[0,0],[13.234,5.986],[0.503,1.419]],"o":[[0,0],[4.11,3.743],[7.056,0.593],[1.125,1.679],[0,0],[-6.79,-3.072],[-0.6,-1.693]],"v":[[-16.616,-16.453],[-11.121,-6.96],[12.869,2.172],[23.055,2.22],[22.539,11.057],[0.723,4.935],[-16.069,-3.136]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.800000011921,0.06274510175,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[180.393,441.516]},"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 26","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[183.834,467.818]},"a":{"a":0,"k":[183.834,443.318]},"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 331","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0.138,4.328],[1.838,3.571],[-2.278,-5.926],[2.985,-3.574]],"o":[[-2.441,-76.355],[-2.26,-4.392],[2.447,6.365],[-3.353,4.014]],"v":[[45.846,58.307],[41.463,-107.963],[99.907,-104.809],[100.716,61.64]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[-0.131,4.328],[0.297,4.005],[-1.562,-6.154],[2.637,-3.42]],"o":[[2.03,-66.951],[-0.365,-4.926],[2.646,10.427],[-2.962,3.842]],"v":[[1.812,35.019],[4.188,-126.403],[43.15,-113.923],[40.407,53.517]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[-0.145,4.327],[-2.415,1.71],[-10.458,-8.36],[2.719,-3.355]],"o":[[1.938,-57.686],[2.415,-1.71],[16.168,12.924],[-3.054,3.769]],"v":[[-10.542,36.959],[-31.167,-29.844],[21.599,-15.399],[34.704,54.785]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-0.003,4.33],[0.297,4.005],[-6.342,-11.791],[2.637,-3.42]],"o":[[0.066,-95.381],[-0.365,-4.926],[6.146,11.427],[-2.962,3.842]],"v":[[-7.516,39.23],[-12.513,-68.696],[34.121,-53.653],[36.25,55.291]],"c":true}]},{"i":{"x":0.27,"y":1},"o":{"x":0.167,"y":0.167},"t":113,"s":[{"i":[[-0.015,4.33],[0.651,3.963],[-11.156,-7.403],[2.646,-3.413]],"o":[[0.322,-95.38],[-0.8,-4.874],[23.832,15.814],[-2.972,3.834]],"v":[[-8.023,39.775],[-32.899,-39.821],[14.397,-29.752],[35.7,55.954]],"c":true}]},{"t":159,"s":[{"i":[[-0.015,4.33],[0.297,4.005],[-10.928,-7.735],[2.646,-3.413]],"o":[[0.322,-95.38],[-0.365,-4.926],[23.346,16.523],[-2.972,3.834]],"v":[[-8.023,39.775],[-30.763,-52.321],[15.746,-37.403],[35.7,55.954]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gs","o":{"a":0,"k":100},"w":{"a":0,"k":5.001},"g":{"p":3,"k":{"a":0,"k":[0,1,0.82,0.098,0.402,0.959,0.645,0.049,0.804,0.918,0.471,0]}},"s":{"a":0,"k":[3.089,-59.404]},"e":{"a":0,"k":[-3.176,60.132]},"t":1,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10},"bm":0,"nm":"Gradient Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.925,0.2,0.5,0.992,0.818,0.1,1,0.984,0.71,0]}},"s":{"a":0,"k":[12.905,54.44]},"e":{"a":0,"k":[1.762,-20.24]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[169.358,398.85]},"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 25","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[172.481,427.144]},"a":{"a":0,"k":[172.481,402.644]},"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 330","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-4.956,2.757],[-17.497,-2.352],[0.422,-3.656],[1.23,-13.58],[1.207,-13.657],[16.678,1.266]],"o":[[4.956,-2.757],[17.497,2.352],[-0.612,5.304],[-1.23,13.58],[-7.78,-0.458],[-2.048,-0.155]],"v":[[5.532,-103.178],[41.77,-104.211],[83.638,-97.2],[73.311,-70.867],[71.573,63.239],[18.543,61.91]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[-4.195,2.493],[-1.853,8.536],[0.553,-3.639],[1.356,-5.539],[1.73,-15.766],[14.529,10.691]],"o":[[7.816,-4.644],[2.844,-13.103],[-0.803,5.279],[-4.153,16.962],[-8.687,-1.764],[-1.362,-1.002]],"v":[[-30.273,-129.077],[-61.846,-169.894],[51.854,-110.761],[18.475,-98.214],[9.909,59.332],[-26.923,39.076]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[-3.703,3.178],[-8.074,-0.583],[-1.782,-3.221],[1.844,-2.516],[1.875,-17.069],[14.267,11.039]],"o":[[6.899,-5.92],[4.456,0.322],[2.704,4.886],[-2.105,2.872],[-8.641,-1.973],[-1.338,-1.035]],"v":[[-55.614,-38.382],[-32.381,-53.311],[50.813,-32.302],[12.96,20.535],[2.43,58.835],[-40.367,40.707]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-4.195,2.493],[-14.984,-0.6],[0.553,-3.639],[0.981,-5.789],[1.73,-15.766],[14.529,10.691]],"o":[[7.816,-4.644],[13.397,0.536],[-0.803,5.279],[-2.918,17.217],[-8.687,-1.764],[-1.362,-1.002]],"v":[[-45.474,-64.37],[2.404,-67.394],[51.604,-59.136],[12.32,-24.819],[7.002,61.481],[-36.251,43.288]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":105,"s":[{"i":[[-4.195,2.493],[-11.197,-9.975],[-0.814,-3.59],[2.981,-4.164],[1.773,-15.762],[14.5,10.73]],"o":[[7.816,-4.644],[3.336,2.972],[1.197,5.279],[-3.98,5.559],[-8.682,-1.787],[-1.36,-1.006]],"v":[[-47.224,-55.995],[-2.721,-41.769],[52.229,-49.136],[19.07,12.306],[6.253,60.904],[-36.749,43.854]],"c":true}]},{"t":141,"s":[{"i":[[-4.195,2.493],[-11.197,-9.975],[-2.736,-2.462],[-0.112,-7.188],[1.773,-15.762],[14.5,10.73]],"o":[[7.816,-4.644],[3.336,2.972],[4.911,4.42],[0.106,6.836],[-8.682,-1.787],[-1.36,-1.006]],"v":[[-47.224,-55.995],[-2.721,-41.769],[52.979,-49.261],[9.82,9.056],[6.253,60.904],[-36.749,43.854]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.584313750267,0.949019610882,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[205.699,391.608]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 28","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[208.096,420.179]},"a":{"a":0,"k":[208.096,395.679]},"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 229","bm":0,"hd":false}],"ip":62,"op":185,"st":-15,"bm":0},{"ddd":0,"ind":64,"ty":4,"nm":"L R","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[340.932,398.664,0]},"a":{"a":0,"k":[340.29,426.607,0]},"s":{"a":0,"k":[100.784,99.228,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0.227,-0.165],[-0.07,1.038],[-1.525,2.779],[0.105,-1.694]],"o":[[-4.492,3.268],[0.619,-9.124],[1.482,-2.699],[-0.114,1.832]],"v":[[-34.316,-70.397],[-40.527,-53.447],[-33.694,-81.951],[-28.882,-87.83]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[1.236,-0.185],[-0.384,1.166],[-8.323,3.122],[0.575,-1.904]],"o":[[-24.509,3.672],[3.379,-10.251],[8.085,-3.033],[-0.621,2.058]],"v":[[-42.389,-66.696],[-76.275,-47.651],[-38.995,-79.679],[-12.74,-86.284]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[0.265,1.194],[0.732,0.895],[-8.553,1.934],[1.307,-1.712]],"o":[[-5.681,-25.549],[-0.901,-1.1],[20.873,-4.721],[-1.468,1.923]],"v":[[-17.983,39.19],[-41.75,18.916],[-7.758,6.039],[15.746,25.31]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[1.236,-0.185],[0.801,0.93],[-29.91,8.057],[0.102,-0.918]],"o":[[-24.509,3.672],[-0.985,-1.144],[7.727,-2.081],[-0.102,0.918]],"v":[[-39.817,-19.799],[-72.821,-1.375],[-25.69,-34.552],[-8.015,-38.28]],"c":true}]},{"i":{"x":0.22,"y":1},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0.529,1.129],[0.857,0.833],[-8.945,2.644],[1.338,-1.745]],"o":[[-11.728,-25.013],[-1.054,-1.025],[19.109,-5.649],[-1.503,1.96]],"v":[[-12.381,29.494],[-40.562,8.796],[-5.159,-8.515],[23.201,14.751]],"c":true}]},{"t":149,"s":[{"i":[[0.69,1.039],[0.857,0.833],[-8.945,2.644],[1.248,-1.81]],"o":[[-15.211,-22.881],[-1.054,-1.025],[19.109,-5.649],[-1.402,2.034]],"v":[[-7.996,20.336],[-39.694,5.647],[-4.539,-9.9],[26.793,3.809]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gs","o":{"a":0,"k":100},"w":{"a":0,"k":5.001},"g":{"p":3,"k":{"a":0,"k":[0,1,0.82,0.098,0.269,0.959,0.645,0.049,0.537,0.918,0.471,0]}},"s":{"a":0,"k":[-7217.534,-3043.812]},"e":{"a":0,"k":[-7227.716,-2956.09]},"t":1,"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10},"bm":0,"nm":"Gradient Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.941,0.702,0,0.5,0.971,0.847,0.343,1,1,0.992,0.686]}},"s":{"a":0,"k":[-2.686,-8.86]},"e":{"a":0,"k":[7.847,24.845]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[391.133,361.307]},"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 20","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[384.707,390.492]},"a":{"a":0,"k":[384.707,365.992]},"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 333","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[0.52,-2.317],[0.957,-1.453],[0.062,-1.935],[0,0],[-2.311,6.76],[-0.189,2.482]],"o":[[0,0],[-0.635,2.828],[-1.119,1.699],[-0.08,2.498],[0,0],[1.011,-2.956],[0.109,-1.431]],"v":[[15.464,-32.158],[14.517,-25.739],[11.551,-16.809],[9.812,-14.265],[9.731,-4.567],[13.312,-12.054],[15.364,-21.811]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[0,0],[2.838,-2.604],[5.223,-1.632],[0.336,-2.174],[0,0],[-12.612,7.596],[-1.033,2.789]],"o":[[0,0],[-3.463,3.177],[-6.108,1.909],[-0.434,2.807],[0,0],[5.514,-3.321],[0.596,-1.608]],"v":[[7.246,-14.427],[2.078,-7.214],[-14.106,2.82],[-23.593,5.679],[-24.035,16.575],[-4.493,8.163],[6.704,-2.8]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[0,0],[6.616,-4.167],[6.913,-0.908],[2.067,0.657],[0,0],[-17.648,7.75],[-0.44,2.958]],"o":[[0,0],[-4.878,3.072],[-5.375,0.706],[-1.156,-0.367],[0,0],[7.31,-3.21],[0.44,-2.958]],"v":[[17.85,-10.436],[10.601,0.668],[-12.4,9.076],[-23.515,9.191],[-23.212,19.59],[1.454,12.07],[17.905,2.314]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[0,0],[4.482,-3.81],[7.276,-1.148],[0.336,-2.174],[0,0],[-16.913,8.704],[-1.386,2.631]],"o":[[0,0],[-4.482,3.81],[-6.321,0.998],[-0.434,2.807],[0,0],[9.746,-5.016],[0.792,-1.504]],"v":[[15.726,-10.125],[10.241,-3.097],[-13.079,7.272],[-23.459,7.844],[-23.772,19.421],[-0.313,10.995],[15.055,0.883]],"c":true}]},{"i":{"x":0.22,"y":1},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[6.333,-4.173],[6.62,-0.914],[1.98,0.655],[0,0],[-16.106,7.788],[-0.419,2.958]],"o":[[0,0],[-4.669,3.076],[-5.147,0.71],[-1.107,-0.366],[0,0],[6.938,-3.355],[0.419,-2.958]],"v":[[17.145,-12.388],[9.974,-1.214],[-12.048,7.214],[-22.992,7.154],[-22.692,17.928],[1.224,11.324],[17.448,1.49]],"c":true}]},{"t":149,"s":[{"i":[[0,0],[6.333,-4.173],[6.62,-0.914],[1.98,0.655],[0,0],[-16.106,7.788],[-0.419,2.958]],"o":[[0,0],[-4.669,3.076],[-5.147,0.71],[-1.107,-0.366],[0,0],[6.938,-3.355],[0.419,-2.958]],"v":[[17.145,-12.388],[9.974,-1.214],[-12.048,7.214],[-22.992,6.902],[-22.692,17.676],[1.224,11.324],[17.448,1.49]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.741176486015,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[341.32,436.575]},"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 22","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[338.401,463.772]},"a":{"a":0,"k":[338.401,439.272]},"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 332","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-0.042,6.012],[-1.345,5.945],[0.718,-11.78],[0.258,-25.038]],"o":[[0.237,-34.018],[-1.917,2.394],[-0.628,10.29],[-0.063,6.087]],"v":[[2.473,14.285],[3.562,-120.145],[-4.312,-88.603],[-4.227,32.937]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[-0.229,6.755],[-7.339,6.679],[3.92,-13.236],[1.407,-28.133]],"o":[[1.293,-38.224],[-10.46,2.69],[-3.424,11.562],[-0.342,6.839]],"v":[[-3.783,33.318],[2.159,-117.729],[-40.807,-82.288],[-40.342,54.276]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[0.168,6.406],[-22.278,11.282],[12.255,-7.842],[-3.418,-30.817]],"o":[[-1.332,-50.714],[-9.824,2.381],[-21.598,13.821],[0.716,6.456]],"v":[[7.4,38.409],[29.359,-33.392],[-18.551,-13.811],[-39.268,56.844]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[-0.229,6.755],[-7.339,6.679],[0.299,-16.774],[1.407,-28.133]],"o":[[1.293,-38.223],[-10.46,2.69],[-0.215,12.056],[-0.342,6.839]],"v":[[4.568,37.001],[15.464,-72.602],[-37.353,-36.012],[-40.081,56.503]],"c":true}]},{"i":{"x":0.22,"y":1},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0.167,6.406],[-22.798,13.023],[12.402,-8.795],[-2.846,-26.758]],"o":[[-1.319,-50.713],[-10.274,3.157],[-21.857,15.5],[0.687,6.456]],"v":[[6.582,37.896],[32.001,-48.003],[-16.806,-26.049],[-38.337,55.247]],"c":true}]},{"t":149,"s":[{"i":[[0.167,6.406],[-22.798,13.023],[12.402,-8.795],[-3.3,-30.814]],"o":[[-1.319,-50.713],[-10.274,3.157],[-21.857,15.5],[0.691,6.455]],"v":[[6.582,37.896],[32.621,-49.389],[-16.806,-26.049],[-38.337,54.995]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gs","o":{"a":0,"k":100},"w":{"a":0,"k":5.001},"g":{"p":3,"k":{"a":0,"k":[0,1,0.82,0.098,0.402,0.959,0.645,0.049,0.804,0.918,0.471,0]}},"s":{"a":0,"k":[-27.304,-17.216]},"e":{"a":0,"k":[27.45,16.998]},"t":1,"lc":2,"lj":2,"bm":0,"nm":"Gradient Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.925,0.2,0.5,0.992,0.784,0.1,1,0.984,0.643,0]}},"s":{"a":0,"k":[5.9,-47.864]},"e":{"a":0,"k":[-3.228,-11.93]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[354.751,400.663]},"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 21","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[351.326,428.68]},"a":{"a":0,"k":[351.326,404.18]},"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 331","bm":0,"hd":false}],"ip":62,"op":185,"st":-15,"bm":0},{"ddd":0,"ind":65,"ty":4,"nm":"Box 2","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[258.447,470.215,0]},"a":{"a":0,"k":[258.447,470.215,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[-9.642,-3.659],[-1.205,0.301],[1.936,0.977],[8.437,3.167],[-1.836,-0.557],[-20.537,-8.611],[-1.348,-0.997],[-8.196,-1.687],[-1.808,24.949]],"o":[[1.326,0.452],[0.913,-0.228],[-9.521,-4.808],[-1.868,-0.701],[14.374,4.362],[-1.594,21.419],[14.372,10.636],[-0.217,-21.568],[16.05,7.571]],"v":[[68.209,-3.92],[72.487,-3.529],[71.854,-21.29],[-71.479,-79.548],[-72.142,-65.023],[-17.692,-44.605],[-19.171,62.458],[25.543,79.573],[29.159,-20.824]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[-7.317,-0.098],[-1.205,0.301],[0.462,0.064],[8.437,3.167],[-1.12,-0.499],[-17.958,-7.117],[-1.348,-0.997],[-8.196,-1.687],[-1.808,24.948]],"o":[[1.326,0.452],[-0.113,-0.283],[-3.504,-10.074],[-1.868,-0.701],[18.207,8.112],[-1.594,21.419],[14.372,10.636],[1.906,-22.113],[10.882,3.065]],"v":[[80.381,-11.961],[84.66,-11.569],[84.027,-29.331],[-70.469,-79.27],[-70.402,-63.518],[-19.094,-41.681],[-19.171,62.458],[32.026,80.792],[39.07,-19.908]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[-6.877,-0.521],[-1.205,0.301],[0.462,0.064],[8.437,3.167],[-0.804,-0.926],[-9.211,-6.069],[-1.348,-0.997],[-8.396,-3.424],[-1.808,24.948]],"o":[[2.107,0.165],[-0.113,-0.283],[-3.504,-10.074],[-1.868,-0.701],[7.654,8.812],[-1.594,21.419],[14.372,10.636],[0.754,-22.305],[8.535,3.458]],"v":[[44.557,-15.359],[49.39,-15.796],[48.757,-33.558],[-66.258,-100.413],[-66.743,-82.801],[-33.791,-57.345],[-28.634,51.942],[16.001,81.474],[17.958,-25.119]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[-7.317,-0.098],[-1.205,0.301],[0.462,0.064],[8.437,3.167],[-1.12,-0.499],[-15.898,-4.753],[-1.348,-0.997],[-8.196,-1.687],[-1.808,24.949]],"o":[[1.326,0.452],[-0.113,-0.283],[-3.504,-10.074],[-1.868,-0.701],[18.207,8.112],[1.083,22.787],[14.372,10.636],[1.906,-22.114],[10.882,3.065]],"v":[[90.023,-7.089],[94.301,-6.697],[93.922,-26.728],[-70.469,-79.27],[-70.334,-52.869],[-20.243,-35.102],[-14.434,66.842],[36.925,83.537],[44.108,-16.92]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-6.049,-0.922],[-1.085,0.233],[0.4,3.097],[7.264,3.633],[-0.653,-0.969],[-7.765,-6.573],[-1.348,-0.997],[-8.396,-3.424],[-1.118,19.784]],"o":[[1.854,0.283],[-0.082,-0.289],[-2.464,-10.25],[-1.609,-0.805],[6.215,9.223],[0.712,20.157],[14.373,10.636],[0.754,-22.305],[7.333,3.929]],"v":[[29.603,10.986],[33.906,10.821],[33.993,-7.346],[-63.751,-81.154],[-64.606,-62.557],[-37.061,-35.305],[-28.634,51.942],[-2.13,73.349],[0.144,-5.79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[-7.317,0.038],[-1.199,0.324],[0.464,0.055],[8.494,3.01],[-1.13,-0.478],[-15.983,-4.457],[-1.348,-0.997],[-8.196,-1.687],[-0.899,22.644]],"o":[[1.334,0.427],[-0.118,-0.281],[-3.69,-10.007],[-1.881,-0.667],[18.355,7.773],[1.505,22.763],[14.372,10.636],[1.272,-22.75],[10.937,2.863]],"v":[[90.338,2.634],[94.623,2.946],[93.873,-17.074],[-71.464,-66.558],[-70.84,-40.164],[-20.428,-23.33],[-14.434,66.842],[38.699,83.906],[42.932,-5.611]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-6.049,-0.922],[-1.085,0.233],[0.4,3.097],[7.264,3.633],[-0.653,-0.969],[-7.765,-6.573],[-1.348,-0.997],[-8.396,-3.424],[-1.118,19.784]],"o":[[1.854,0.283],[-0.082,-0.289],[-2.464,-10.25],[-1.609,-0.805],[6.215,9.223],[0.712,20.157],[14.373,10.636],[0.754,-22.305],[7.333,3.929]],"v":[[29.603,10.986],[33.906,10.821],[33.993,-7.346],[-63.751,-81.154],[-64.606,-62.557],[-37.061,-35.305],[-28.634,51.942],[-2.13,73.349],[0.144,-5.79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[-7.317,0.038],[-1.199,0.324],[0.464,0.055],[8.494,3.01],[-1.159,-0.401],[-16.444,-2.676],[-1.566,-0.598],[-8.833,-0.9],[-0.899,22.644]],"o":[[1.334,0.427],[-0.118,-0.281],[-3.69,-10.007],[-1.881,-0.667],[14.698,5.089],[1.505,22.763],[19.099,7.292],[1.272,-22.75],[16.461,2.115]],"v":[[114.614,-8.606],[118.899,-8.293],[118.149,-28.314],[-75.563,-66.625],[-74.987,-38.878],[-12.987,-24.524],[-9.22,71.793],[48.751,80.952],[51.305,-14.735]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[-2.618,-1.121],[-1.085,0.233],[0.4,3.097],[7.264,3.633],[-0.653,-0.969],[-4.82,-5.428],[-1.282,-1.081],[-5.219,-4.34],[-1.118,19.784]],"o":[[1.724,0.738],[-0.082,-0.289],[-2.464,-10.25],[-1.609,-0.805],[6.215,9.223],[0.712,20.157],[8.457,7.129],[0.754,-22.305],[6.642,6.586]],"v":[[-6.685,-19.814],[-1.707,-19.324],[-1.62,-37.491],[-59.641,-99.952],[-60.496,-81.356],[-43.851,-61.117],[-41.699,48.05],[-22.072,66.634],[-20.334,-30.523]],"c":true}]},{"t":62,"s":[{"i":[[-1.884,0.038],[-0.309,0.324],[0.119,0.055],[4.822,-7.613],[-1.199,-0.258],[-16.535,-2.033],[-1.588,-0.537],[-8.861,-0.556],[-0.016,22.662]],"o":[[0.343,0.427],[-0.031,-0.281],[-0.95,-10.007],[-1.588,2.508],[12.917,2.778],[2.391,22.687],[19.368,6.542],[0.385,-22.782],[18.834,2.756]],"v":[[153.676,-16.665],[154.779,-16.353],[154.586,-36.374],[-46.53,-59.822],[-45.771,-32.552],[26.152,-21.38],[30.723,77.71],[88.593,79.727],[89.517,-18.771]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.584313750267,0.949019610882,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[188.658,376.07]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":63,"st":0,"bm":0},{"ddd":0,"ind":78,"ty":3,"nm":"NULL Layer 11","parent":83,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.87],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[-3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[-3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":52,"s":[-6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":57,"s":[2]},{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.77],"y":[0]},"t":69,"s":[2]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":79,"s":[0]},{"i":{"x":[0.29],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":89,"s":[0]},{"t":105,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[189.908,377.82,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[196.001,380.359,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[180.532,371.594,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[200.608,381.793,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[176.783,371.582,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[198.499,386.279,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[173.703,369.781,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[207.096,387.911,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[155.373,355.62,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[235.737,394.79,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[201.773,343.664,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[187.647,390.009,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[191.396,375.3,0],"to":[0,0,0],"ti":[0,0,0]},{"t":105,"s":[189.908,377.82,0]}]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.87,0.87,0.87],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[110,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[79,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[112,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[70,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[112,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[70,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":52,"s":[125,95,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[36,100,100]},{"i":{"x":[0.23,0.23,0.23],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[125,95,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.77,0.77,0.77],"y":[0,0,0]},"t":69,"s":[80,141,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":79,"s":[102,83,100]},{"i":{"x":[0.29,0.29,0.29],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":89,"s":[98,102,100]},{"t":105,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":79,"ty":4,"nm":"Layer 11","parent":78,"sr":1,"ks":{"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[188.658,376.07,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-24.015,-50.438],[-27.811,-49.515],[-29.595,-46.842],[-24.398,-43.715],[-23.169,-41.586],[-27.691,-38.117],[-24.544,-35.415],[-19.36,-33.267],[-16.266,-34.479],[-14.521,-39.66],[-15.909,-44.351],[-19.731,-49.13]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[227.687,401.384]},"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 10","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[12.485,-43.438],[8.689,-42.515],[6.905,-39.842],[12.102,-36.715],[13.331,-34.586],[8.809,-31.117],[11.956,-28.415],[17.14,-26.267],[20.234,-27.479],[21.979,-32.66],[20.591,-37.351],[16.769,-42.13]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[227.687,401.384]},"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 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[227.687,401.384]},"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":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[157.302,370.23]},"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":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[142.43,324.081]},"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":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[127.685,357.975]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[141.089,398.762]},"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 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[211.94,432.464]},"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 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-4.61],[2.899,0.924],[-2.063,-2.957],[-2.997,-0.683],[3.2,-0.241],[0.548,-2.093],[-2.936,0.716],[-2.438,-2.786],[0.952,5.32],[-1.744,1.267],[4.377,2.32],[0.899,3.053]],"o":[[-0.727,1.761],[-2.796,-0.891],[2.063,2.957],[4.747,1.082],[-4.21,0.317],[-0.635,2.426],[2.936,-0.716],[2.354,2.69],[-0.796,-4.447],[1.993,-1.448],[-3.2,-1.696],[-1.423,-4.831]],"v":[[-2.265,-8.313],[-6.061,-7.39],[-7.845,-4.717],[-2.648,-1.59],[-1.419,0.539],[-5.941,4.008],[-2.794,6.71],[2.39,8.858],[5.484,7.646],[7.229,2.465],[5.841,-2.226],[2.019,-7.005]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.92549020052,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[243.924,443.582]},"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 8","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":80,"ty":3,"nm":"G","parent":83,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[-1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[-1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":52,"s":[-1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":57,"s":[17]},{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.77],"y":[0]},"t":69,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":79,"s":[0]},{"i":{"x":[0.29],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":89,"s":[0]},{"t":105,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[331.587,378.43,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[335.471,375.042,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[319.852,377.793,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[337.659,373.915,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[312.181,395.032,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[337.782,375.674,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[312.181,395.032,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[342.311,370.537,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[297.395,385.751,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[351.022,347.499,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[319.898,337.961,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[331.587,386.639,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[330.595,376.161,0],"to":[0,0,0],"ti":[0,0,0]},{"t":105,"s":[331.587,378.43,0]}]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.87,0.87,0.87],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[88,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[110,112,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[79,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[118,96,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[79,99,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[120,96,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":52,"s":[50,99,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[135,111,100]},{"i":{"x":[0.23,0.23,0.23],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":62,"s":[8,99,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.77,0.77,0.77],"y":[0,0,0]},"t":69,"s":[79,146,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":79,"s":[100,90,100]},{"i":{"x":[0.29,0.29,0.29],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":89,"s":[98,104,100]},{"t":105,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":81,"ty":4,"nm":"Layer 10","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[331.587,375.18,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[366.946,404.005]},"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":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[388.01,360.537]},"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":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[367.329,328.941]},"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":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[303.755,397.686]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[285.18,366.473]},"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 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[271.584,407.452]},"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 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.904,-6.192],[2.899,-1.484],[-2.063,-1.244],[-2.997,1.806],[3.2,-2.899],[0.548,-2.548],[-2.936,3.154],[-2.438,-0.761],[0.952,4.529],[-1.744,2.716],[4.377,-1.315],[0.899,2.307]],"o":[[-0.727,2.365],[-2.796,1.431],[2.063,1.244],[4.747,-2.86],[-4.21,3.814],[-0.635,2.953],[2.936,-3.154],[2.354,0.735],[-0.796,-3.786],[1.993,-3.103],[-3.2,0.962],[-1.423,-3.65]],"v":[[-2.265,-6.428],[-6.061,-2.354],[-7.845,1.802],[-2.648,0.613],[-1.419,1.72],[-5.941,8.945],[-2.794,9.033],[2.39,6.877],[5.484,3.095],[7.229,-3.535],[5.841,-7.074],[2.019,-8.679]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341176480055,0.75686275959,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[286.904,441.728]},"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 8","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":82,"ty":3,"nm":"NULL Box","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[258.447,449.215,0],"to":[0,-3.458,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[258.447,428.465,0],"to":[0,0,0],"ti":[0,-3.458,0]},{"t":44,"s":[258.447,449.215,0]}]},"a":{"a":0,"k":[50,50,0]}},"ao":0,"ip":-3,"op":181,"st":0,"bm":0},{"ddd":0,"ind":83,"ty":4,"nm":"Box","parent":82,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.87],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":7,"s":[3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[-4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26,"s":[4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":33,"s":[-6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[-7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":49,"s":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":54,"s":[-6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":59,"s":[6]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":66,"s":[-3]},{"t":79,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[50,50,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[63.375,49.875,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[37,50,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[63.875,49.875,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":35,"s":[32.5,50,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":41,"s":[67.375,49.875,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":46,"s":[30.25,50,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":51,"s":[77.875,49.875,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":56,"s":[19.5,50,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":61,"s":[86.625,49.875,0],"to":[0,0,0],"ti":[0,0,0]},{"t":68,"s":[50,50,0]}]},"a":{"a":0,"k":[258.447,421.215,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.76,0.76,0.76],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":64,"s":[102,97,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[98,102,100]},{"i":{"x":[0.29,0.29,0.29],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":86,"s":[101,99,100]},{"t":100,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[19.258,0],[0,0],[-6.878,-18.75],[-22.505,-0.852],[-6.297,19.034],[0,0]],"o":[[-19.258,0],[0,0],[6.878,18.75],[22.505,0.852],[6.297,-19.034],[0,0]],"v":[[0.029,-22.714],[-143.305,-77.518],[-137.569,45.135],[-0.25,104.975],[137.627,45.135],[143.363,-77.518]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[19.258,0],[0,0],[-6.868,-14.881],[-22.657,-0.213],[-5.829,15.523],[0,0]],"o":[[-19.258,0],[0,0],[7.49,15.923],[22.657,0.213],[5.829,-15.523],[0,0]],"v":[[10.654,-23.909],[-143.343,-73.656],[-137.635,51.923],[10.635,107.438],[134.566,42.473],[140.192,-80.311]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[12.223,0.512],[0,0],[-3.322,-10.587],[-13.529,-0.634],[-4.895,10.168],[0,0]],"o":[[-12.223,-0.512],[0,0],[3.228,9.862],[17.074,0.974],[4.906,-10.188],[0,0]],"v":[[-24.202,-20.796],[-139.537,-87.94],[-135.351,35.368],[-24.096,112.334],[137.316,59.79],[142.39,-66.301]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[19.258,0],[0,0],[-6.859,-11.483],[-22.791,0.349],[-5.418,12.439],[0,0]],"o":[[-19.258,0],[0,0],[8.028,13.439],[22.791,-0.349],[5.418,-12.439],[0,0]],"v":[[19.987,-24.958],[-143.376,-70.263],[-137.694,57.885],[20.196,109.6],[131.877,40.135],[137.406,-82.763]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[9.201,0.732],[0,0],[-1.798,-8.741],[-9.607,-0.815],[-4.493,7.868],[0,0]],"o":[[-9.201,-0.732],[0,0],[1.397,7.258],[14.675,1.3],[4.509,-7.896],[0,0]],"v":[[-39.179,-19.459],[-137.902,-94.077],[-134.369,28.255],[-39.018,114.438],[138.498,67.23],[143.334,-60.281]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[19.258,0],[0,0],[-6.859,-11.483],[-22.791,0.349],[-5.418,12.439],[0,0]],"o":[[-19.258,0],[0,0],[8.028,13.439],[22.791,-0.349],[5.418,-12.439],[0,0]],"v":[[19.987,-24.958],[-143.376,-70.263],[-137.694,57.885],[20.196,109.6],[131.877,40.135],[137.406,-82.763]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[9.201,0.732],[0,0],[-1.798,-8.741],[-9.607,-0.815],[-4.493,7.868],[0,0]],"o":[[-9.201,-0.732],[0,0],[1.397,7.258],[14.675,1.3],[4.509,-7.896],[0,0]],"v":[[-39.179,-19.459],[-137.902,-94.077],[-134.369,28.255],[-39.018,114.438],[138.498,67.23],[143.334,-60.281]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[7.013,-0.984],[0,0],[-4.947,-13.251],[-19.522,-0.751],[-2.766,5.911],[0,0]],"o":[[-7.013,0.984],[0,0],[4.983,13.555],[9.858,-4.459],[2.766,-5.911],[0,0]],"v":[[45.244,-40.337],[-148.393,-69.297],[-143.779,68.599],[43.167,103.876],[118.7,45.023],[123.084,-85.007]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[8.15,0.943],[0,0],[-1.882,-9.171],[-10.038,-0.571],[-4.452,6.855],[0,0]],"o":[[-8.15,-0.943],[0,0],[2.006,10.414],[14.267,-0.25],[4.452,-6.855],[0,0]],"v":[[-75.059,-39.112],[-133.022,-101.105],[-131.904,28.811],[-73.335,98.672],[135.943,77.976],[141.084,-54.438]],"c":true}]},{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[5.469,-1.894],[0,0],[-5.408,-15.179],[-20.293,-0.835],[-1.858,5.465],[0,0]],"o":[[-5.469,1.894],[0,0],[5.403,15.039],[6.56,-6.448],[1.858,-5.465],[0,0]],"v":[[82.707,-52.729],[-119.057,-60.479],[-113.758,81.187],[79.429,94.523],[101.458,17.64],[105.171,-111.263]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[19.258,0],[0,0],[-5.708,-18.75],[-22.505,-0.852],[-5.226,19.034],[0,0]],"o":[[-19.258,0],[0,0],[5.708,18.75],[22.505,0.852],[5.226,-19.034],[0,0]],"v":[[0.058,-85.714],[-118.945,-140.518],[-114.208,45.135],[-0.25,104.975],[114.167,45.135],[118.952,-140.518]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[19.258,0],[0,0],[-7.196,-18.75],[-22.505,-0.852],[-6.588,19.034],[0,0]],"o":[[-19.258,0],[0,0],[7.196,18.75],[22.505,0.852],[6.588,-19.034],[0,0]],"v":[[-0.108,-4.714],[-150.056,-59.518],[-143.911,45.135],[-0.25,104.975],[143.996,45.135],[149.854,-59.518]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[19.258,0],[0,0],[-6.733,-18.75],[-22.505,-0.852],[-6.165,19.034],[0,0]],"o":[[-19.258,0],[0,0],[6.733,18.75],[22.505,0.852],[6.165,-19.034],[0,0]],"v":[[-0.108,-31.214],[-140.432,-86.018],[-134.683,45.135],[-0.25,104.975],[134.728,45.135],[140.21,-86.018]],"c":true}]},{"t":105,"s":[{"i":[[19.258,0],[0,0],[-6.878,-18.75],[-22.505,-0.852],[-6.297,19.034],[0,0]],"o":[[-19.258,0],[0,0],[6.878,18.75],[22.505,0.852],[6.297,-19.034],[0,0]],"v":[[0.029,-22.714],[-143.305,-77.518],[-137.569,45.135],[-0.25,104.975],[137.627,45.135],[143.363,-77.518]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588237047,0.898039221764,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[258.416,363.676]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[-1.722,-61.692],[-1.703,58.043],[1.571,58.25],[1.894,-61.268]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[8.888,-62.621],[9.182,60.506],[12.456,60.712],[12.504,-62.196]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0.212,-7.354],[0.147,-30.7],[-0.108,4.503],[0.824,19.798]],"o":[[-1.07,37.115],[-0.023,4.841],[0.422,-17.664],[-0.383,-9.206]],"v":[[-26.704,-59.848],[-26.325,65.376],[-23.126,65.583],[-23.171,-59.421]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[18.208,-63.437],[18.742,62.668],[22.017,62.875],[21.823,-63.012]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0.21,-7.372],[0.146,-30.773],[-0.106,4.513],[0.816,19.844]],"o":[[-1.059,37.203],[-0.023,4.853],[0.418,-17.705],[-0.379,-9.228]],"v":[[-41.996,-58.656],[-41.581,67.468],[-38.414,67.676],[-38.499,-58.229]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[18.208,-63.437],[18.742,62.668],[22.017,62.875],[21.823,-63.012]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[0.21,-7.372],[0.146,-30.773],[-0.106,4.513],[0.816,19.844]],"o":[[-1.059,37.203],[-0.023,4.853],[0.418,-17.705],[-0.379,-9.228]],"v":[[-41.996,-58.656],[-41.581,67.468],[-38.414,67.676],[-38.499,-58.229]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0.321,-7.334],[0.223,-30.617],[-0.163,4.49],[0.436,21.269]],"o":[[-1.62,37.014],[-0.035,4.828],[0.639,-17.616],[-0.158,-7.697]],"v":[[40.673,-79.114],[39.803,56.931],[45.362,55.008],[46.738,-79.337]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[0.275,-7.319],[0.191,-30.554],[-0.14,4.481],[0.881,20.098]],"o":[[-1.387,36.938],[-0.03,4.818],[0.547,-17.58],[-0.385,-8.777]],"v":[[-77.703,-76.927],[-75.399,51.736],[-71.059,51.391],[-72.931,-76.671]],"c":true}]},{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0.29,-7.341],[0.201,-30.647],[-0.147,4.495],[0.129,21.823]],"o":[[-1.462,37.05],[-0.032,4.833],[0.577,-17.633],[-0.042,-7.186]],"v":[[77.962,-91.96],[75.953,47.573],[81.139,44.905],[83.603,-92.409]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[-1.693,-124.692],[-1.703,58.043],[1.571,58.25],[1.923,-124.268]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[-1.859,-43.692],[-1.703,58.043],[1.571,58.25],[1.757,-43.268]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[-1.859,-70.192],[-1.703,58.043],[1.571,58.25],[1.757,-69.768]],"c":true}]},{"t":105,"s":[{"i":[[0.217,-7.314],[0.151,-30.532],[-0.11,4.478],[0.844,19.689]],"o":[[-1.095,36.911],[-0.024,4.815],[0.432,-17.567],[-0.392,-9.156]],"v":[[-1.722,-61.692],[-1.703,58.043],[1.571,58.25],[1.894,-61.268]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.945098042488,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[259.143,408.211]},"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.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[-6.525,-12.647],[-19.89,-0.239]],"o":[[-19.258,0],[0,0],[14.381,27.874],[0,0]],"v":[[71.682,-22.707],[-71.652,-77.512],[-65.916,45.142],[71.403,104.982]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-6.603,-12.607],[-21.501,0.648]],"o":[[-19.258,0],[0,0],[10.932,20.963],[12.2,-0.76]],"v":[[82.307,-23.902],[-71.69,-73.649],[-65.982,51.93],[82.288,107.444]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0,0],[0,0],[-4.003,-9.476],[-15.063,-0.651]],"o":[[-12.223,-0.512],[0,0],[5.141,12.474],[3.666,-0.228]],"v":[[47.569,-20.77],[-67.884,-87.933],[-63.65,35.671],[47.557,112.341]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[0,0],[0,0],[-6.671,-12.571],[-22.916,1.427]],"o":[[-19.258,0],[0,0],[7.903,14.893],[22.916,-1.427]],"v":[[91.64,-24.952],[-71.723,-70.257],[-66.041,57.892],[91.849,109.607]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0,0],[0,0],[-2.885,-8.131],[-12.297,-1.209]],"o":[[-9.201,-0.732],[0,0],[2.653,8.827],[0,0]],"v":[[32.643,-19.424],[-66.249,-94.07],[-62.649,28.686],[32.635,114.444]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[0,0],[-6.671,-12.571],[-22.916,1.427]],"o":[[-19.258,0],[0,0],[7.903,14.893],[22.916,-1.427]],"v":[[91.64,-24.952],[-71.723,-70.257],[-66.041,57.892],[91.849,109.607]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[0,0],[0,0],[-2.885,-8.131],[-12.297,-1.209]],"o":[[-9.201,-0.732],[0,0],[2.653,8.827],[0,0]],"v":[[32.643,-19.424],[-66.249,-94.07],[-62.649,28.686],[32.635,114.444]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[2.211,0.464],[0,0],[-5.171,-9.43],[-17.523,-0.506]],"o":[[-7.013,0.939],[0,0],[10.819,18.665],[0,0]],"v":[[116.508,-40.261],[-76.74,-69.29],[-72.092,68.755],[114.819,103.883]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[6.871,1.445],[0,0],[-2.772,-7.154],[-8.74,-0.092]],"o":[[-8.15,-1.081],[0,0],[4.724,11.064],[0,0]],"v":[[-3.51,-39.088],[-61.369,-101.099],[-60.242,28.856],[-1.682,98.678]],"c":false}]},{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[0,0],[-5.33,-10.505],[-18.324,-0.701]],"o":[[-5.469,1.894],[0,0],[11.583,22.256],[0,0]],"v":[[153.918,-52.628],[-47.404,-60.473],[-42.066,81.396],[151.082,94.529]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[0,0],[0,0],[-5.415,-12.647],[-19.89,-0.239]],"o":[[-19.258,0],[0,0],[11.934,27.874],[0,0]],"v":[[71.711,-85.707],[-47.292,-140.512],[-42.555,45.142],[71.403,104.982]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[0,0],[0,0],[-6.826,-12.647],[-19.89,-0.239]],"o":[[-19.258,0],[0,0],[15.045,27.874],[0,0]],"v":[[71.545,-4.707],[-78.403,-59.512],[-72.258,45.142],[71.403,104.982]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[0,0],[0,0],[-6.388,-12.647],[-19.89,-0.239]],"o":[[-19.258,0],[0,0],[14.078,27.874],[0,0]],"v":[[71.545,-31.207],[-68.78,-86.012],[-63.03,45.142],[71.403,104.982]],"c":false}]},{"t":105,"s":[{"i":[[0,0],[0,0],[-6.525,-12.647],[-19.89,-0.239]],"o":[[-19.258,0],[0,0],[14.381,27.874],[0,0]],"v":[[71.682,-22.707],[-71.652,-77.512],[-65.916,45.142],[71.403,104.982]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.43137255311,0.823529422283,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[186.763,362.591]},"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 21","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.87,"y":0},"t":0,"s":[{"i":[[19.258,0],[0,0],[-5.775,-13.007],[-10.653,0.196],[-8.347,15.677],[0,0]],"o":[[-19.258,0],[0,0],[5.582,12.573],[42.21,-0.775],[4.55,-8.545],[0,0]],"v":[[0,-22.708],[-143.334,-77.512],[-137.598,45.141],[-0.279,104.982],[137.598,45.141],[143.334,-77.512]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[19.258,0],[0,0],[-6.145,-12.831],[-12.856,0.477],[-6.921,14.153],[0,0]],"o":[[-19.258,0],[0,0],[5.753,12.036],[26.238,-0.68],[5.145,-10.818],[0,0]],"v":[[10.625,-23.903],[-143.372,-73.65],[-137.664,51.929],[10.606,107.444],[134.537,42.48],[140.163,-80.304]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[12.223,0.512],[0,0],[-3.492,-9.687],[-10.568,-0.056],[-5.62,9.496],[0,0]],"o":[[-12.223,-0.512],[0,0],[2.959,8.165],[18.083,0.686],[4.408,-9.764],[0,0]],"v":[[-24.231,-20.79],[-139.566,-87.934],[-135.38,35.374],[-24.125,112.34],[137.287,59.796],[142.361,-66.294]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[19.258,0],[0,0],[-6.47,-12.676],[-14.791,0.724],[-5.668,12.814],[0,0]],"o":[[-19.258,0],[0,0],[5.903,11.564],[12.209,-0.598],[5.668,-12.814],[0,0]],"v":[[19.958,-24.952],[-143.405,-70.257],[-137.723,57.891],[20.167,109.607],[131.848,40.141],[137.377,-82.757]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[9.201,0.732],[0,0],[-2.352,-8.337],[-9.585,-0.285],[-5.061,7.495],[0,0]],"o":[[-9.201,-0.732],[0,0],[1.759,6.502],[14.579,1.273],[4.092,-9.312],[0,0]],"v":[[-39.208,-19.453],[-137.931,-94.071],[-134.398,28.261],[-39.047,114.444],[138.469,67.236],[143.305,-60.275]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[19.258,0],[0,0],[-6.47,-12.676],[-14.791,0.724],[-5.668,12.814],[0,0]],"o":[[-19.258,0],[0,0],[5.903,11.564],[12.209,-0.598],[5.668,-12.814],[0,0]],"v":[[19.958,-24.952],[-143.405,-70.257],[-137.723,57.891],[20.167,109.607],[131.848,40.141],[137.377,-82.757]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[9.201,0.732],[0,0],[-2.352,-8.337],[-9.585,-0.285],[-5.061,7.495],[0,0]],"o":[[-9.201,-0.732],[0,0],[1.759,6.502],[14.579,1.273],[4.092,-9.312],[0,0]],"v":[[-39.208,-19.453],[-137.931,-94.071],[-134.398,28.261],[-39.047,114.444],[138.469,67.236],[143.305,-60.275]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[6.629,-0.854],[0,0],[-4.806,-9.865],[-11.369,0.02],[-3.347,7.278],[0,0]],"o":[[-6.629,0.854],[0,0],[4.627,9.498],[12.234,-4.154],[3.347,-7.278],[0,0]],"v":[[45.214,-40.331],[-148.422,-69.291],[-143.808,68.605],[43.137,103.882],[118.671,45.029],[123.055,-85.001]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[6.956,1.347],[0,0],[-3.261,-7.978],[-6.551,-0.16],[-4.8,7.027],[0,0]],"o":[[-6.956,-1.347],[0,0],[3.221,7.88],[18.611,-0.355],[4.8,-7.027],[0,0]],"v":[[-75.088,-39.106],[-133.051,-101.099],[-131.933,28.817],[-73.364,98.678],[135.914,77.983],[141.055,-54.431]],"c":true}]},{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[5.469,-1.894],[0,0],[-4.644,-10.772],[-11.536,0.105],[-2.484,7.396],[0,0]],"o":[[-5.469,1.894],[0,0],[4.473,10.263],[7.778,-5.948],[2.484,-7.396],[0,0]],"v":[[82.678,-52.723],[-119.086,-60.473],[-113.787,81.193],[79.4,94.529],[101.429,17.646],[105.142,-111.257]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[19.258,0],[0,0],[-4.792,-13.007],[-10.653,0.196],[-6.927,15.677],[0,0]],"o":[[-19.258,0],[0,0],[4.632,12.573],[42.21,-0.775],[3.776,-8.545],[0,0]],"v":[[0.029,-85.708],[-118.974,-140.512],[-114.237,45.141],[-0.279,104.982],[114.138,45.141],[118.923,-140.512]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[19.258,0],[0,0],[-6.041,-13.007],[-10.653,0.196],[-8.732,15.677],[0,0]],"o":[[-19.258,0],[0,0],[5.84,12.573],[42.21,-0.775],[4.76,-8.545],[0,0]],"v":[[-0.137,-4.708],[-150.085,-59.512],[-143.94,45.141],[-0.279,104.982],[143.967,45.141],[149.825,-59.512]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[19.258,0],[0,0],[-5.653,-13.007],[-10.653,0.196],[-8.171,15.677],[0,0]],"o":[[-19.258,0],[0,0],[5.465,12.573],[42.21,-0.775],[4.454,-8.545],[0,0]],"v":[[-0.137,-31.208],[-140.462,-86.012],[-134.712,45.141],[-0.279,104.982],[134.699,45.141],[140.181,-86.012]],"c":true}]},{"t":105,"s":[{"i":[[19.258,0],[0,0],[-5.775,-13.007],[-10.653,0.196],[-8.347,15.677],[0,0]],"o":[[-19.258,0],[0,0],[5.582,12.573],[42.21,-0.775],[4.55,-8.545],[0,0]],"v":[[0,-22.708],[-143.334,-77.512],[-137.598,45.141],[-0.279,104.982],[137.598,45.141],[143.334,-77.512]],"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.286,0.765,0.961,0.5,0.229,0.678,0.98,1,0.173,0.592,1]}},"s":{"a":0,"k":[-241.248,0.277]},"e":{"a":0,"k":[132.72,-2.66]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[258.445,363.669]},"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 23","bm":0,"hd":false}],"ip":-3,"op":181,"st":0,"bm":0},{"ddd":0,"ind":84,"ty":4,"nm":"Gold","parent":83,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[-3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":74,"s":[-4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":86,"s":[3]},{"i":{"x":[0.27],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[-4]},{"t":111,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":63,"s":[261.344,342.415,0],"to":[-1.151,-1.38,0],"ti":[1.687,3.011,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":71,"s":[262.651,264.152,0],"to":[-0.167,13.554,0],"ti":[0.544,-7.177,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":83,"s":[259.155,385.824,0],"to":[-0.47,-7.77,0],"ti":[1.351,13.453,0]},{"i":{"x":0.27,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[257.209,323.694,0],"to":[0.54,3.677,0],"ti":[-0.385,-4.341,0]},{"t":108,"s":[258.957,338.189,0]}]},"a":{"a":0,"k":[259.957,332.939,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":70,"s":[88,100,100]},{"t":81,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.424,2.685],[5.717,-8.219]],"o":[[-3.986,-7.515],[-2.114,3.04]],"v":[[14.121,15.499],[-15.065,9.999]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[244.659,328.315]},"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":[{"ty":"fl","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[234.351,311.096]},"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":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,0.760784327984,0.23137255013,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[298.617,326.32]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[7.91,-8.566],[-9.436,7.262]],"o":[[-7.91,8.566],[9.436,-7.262]],"v":[[1.18,10.699],[-16.819,-5.699]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.943657489851,0.309803831811,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[296.638,327.746]},"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":[[9.138,-8.69],[-8.51,10.662]],"o":[[-8.025,7.631],[8.183,-10.252]],"v":[[-0.077,12.222],[-17.897,-3.862]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.800000011921,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[294.784,329.668]},"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":[294.784,329.668]},"a":{"a":0,"k":[294.784,329.668]},"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 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.02,7.906],[4.85,-0.597],[-0.712,-1.114]],"o":[[0.004,-1.569],[-8.436,1.038],[1.861,2.91]],"v":[[9.949,6.671],[-5.273,3.372],[-17.111,10.802]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[314.119,314.52]},"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 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,0.75686275959,0.098039217293,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[244.968,332.513]},"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 9","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,0.760784327984,0.23137255013,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[243.386,327.449]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.541,4.902],[6.13,-14.012]],"o":[[6.459,-12.463],[-3.438,7.857]],"v":[[11.163,11.795],[-8.92,1.925]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[243.551,328.937]},"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":[[-7.075,11.539],[10.649,-13.115]],"o":[[7.526,-12.276],[-8.863,10.914]],"v":[[11.579,11.369],[-9.342,-0.764]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.800000011921,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[246.153,327.498]},"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":[246.153,327.498]},"a":{"a":0,"k":[246.153,327.498]},"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 10","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.092,1.314],[5.691,-0.636],[-1.658,-0.409]],"o":[[1.946,-0.625],[-10.335,1.155],[6.436,1.589]],"v":[[12.386,4.345],[1.596,3.692],[-11.267,12.32]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.870588243008,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[236.643,313.091]},"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 11","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.439,0.515],[-0.18,-0.708],[0.534,0.467],[-0.565,0.118],[0,0],[1.067,0.39]],"o":[[0.363,-0.426],[0.145,0.57],[-0.534,-0.467],[1.464,-0.305],[0,0],[-0.618,-0.226]],"v":[[-9.695,0.268],[4.098,6.481],[-8.721,13.968],[-7.677,7.752],[-1.093,6.611],[-8.016,5.095]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.760784327984,0.23137255013,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[315.801,310.229]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.014,8.954],[-5.266,-9.554]],"o":[[-8.024,-14.328],[6.897,12.514]],"v":[[-12.755,14.131],[7.237,0.232]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[314.153,308.884]},"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":[[6.434,12.064],[-9.155,-8.367]],"o":[[-7.184,-13.469],[11.135,10.175]],"v":[[-14.532,15.01],[6.283,-0.329]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.800000011921,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[312.335,306.483]},"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":[312.335,306.483]},"a":{"a":0,"k":[312.335,306.483]},"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 12","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,0.760784327984,0.23137255013,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[175.586,307.386]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-7.116,-6.451],[5.273,4.858]],"o":[[5.671,5.141],[-7.118,-6.558]],"v":[[12.705,-0.558],[-5.142,14.847]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[176.846,309.654]},"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":[[-4.984,-5.168],[7.613,7.377]],"o":[[8.195,8.496],[-4.636,-4.492]],"v":[[12.632,-1.095],[-5.599,14.962]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.800000011921,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[178.735,311.599]},"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":[178.735,311.599]},"a":{"a":0,"k":[178.735,311.599]},"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 13","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.611,0.194],[-0.398,0.242],[0.028,-0.429],[0.402,0.346],[0,0],[-0.327,-0.762]],"o":[[-0.506,-0.161],[0.321,-0.195],[-0.028,0.429],[-1.042,-0.897],[0,0],[0.189,0.441]],"v":[[-3.263,13.363],[-6.658,3.306],[5.859,10.313],[0.882,10.732],[-3.638,6.656],[-0.803,11.42]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.973856189204,0.7028286803,0.19731725057,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[264.969,284.558]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.052,-7.653],[-4.705,7.468]],"o":[[-4.052,7.653],[4.705,-7.468]],"v":[[10.225,13.577],[-10.867,3.043]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[262.975,285.193]},"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":[[3.833,-6.071],[-6.408,9.894]],"o":[[-6.277,9.94],[3.509,-5.418]],"v":[[10.626,12.948],[-11.214,2.311]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.800000011921,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[261.974,288.041]},"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":[261.974,288.041]},"a":{"a":0,"k":[261.974,288.041]},"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 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.23,2.051],[-2.982,-8.758]],"o":[[2.821,-2.595],[0.969,2.844]],"v":[[12.444,12.137],[-12.254,8.719]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784316063,0.541176497936,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.785,294.937]},"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 15","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.457,0.494],[-0.675,0.084],[0.47,-0.46],[0.077,0.565],[0,0],[0.429,-0.989]],"o":[[-0.379,-0.409],[0.544,-0.067],[-0.47,0.46],[-0.2,-1.465],[0,0],[-0.249,0.572]],"v":[[-5.391,13.543],[1.265,0.918],[7.538,14.365],[1.76,12.546],[1.079,5.988],[-0.756,12.532]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.76034821155,0.281045741661,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[233.591,298.425]},"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":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[9.607,-5.928],[-11.74,5.408]],"o":[[-9.607,5.928],[11.74,-5.408]],"v":[[7.06,18.237],[-4.811,-3.021]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[232.622,299.931]},"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":[[11.255,-5.687],[-11.463,7.267]],"o":[[-11.272,5.696],[11.079,-7.023]],"v":[[5.54,19.395],[-6.331,-1.864]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.800000011921,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[230.17,301.409]},"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":[230.17,301.409]},"a":{"a":0,"k":[230.17,301.409]},"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 16","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.419,2.614],[-2.634,-5.034],[2.975,0.392]],"o":[[7.05,-7.62],[0.833,1.592],[-2.975,-0.392]],"v":[[58.111,6.566],[81.194,7.735],[70.146,6.626]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.870588243008,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[206.693,313.665]},"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 17","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.417,1.801],[4.102,-9.062],[-4.968,0.735]],"o":[[-4.556,-5.792],[-0.823,1.818],[5.878,-0.87]],"v":[[12.861,8.168],[-13.227,10.136],[-2.115,8.542]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.870588243008,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[287.674,297.578]},"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 19","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.312,-4.556],[-1.767,4.425]],"o":[[-2.312,4.556],[1.767,-4.425]],"v":[[-9.739,11.813],[3.705,16.223]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[213.913,293.685]},"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":[213.285,296.208]},"a":{"a":0,"k":[213.285,296.208]},"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 30","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.789,-4.825],[1.831,5.1]],"o":[[1.789,4.825],[-1.831,-5.1]],"v":[[-11.418,12.805],[1.256,9.107]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.623529434204,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2.5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.95294123888,0.423529446125,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[293.172,287.007]},"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":[293.504,289.682]},"a":{"a":0,"k":[293.504,289.682]},"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 32","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-8.499,3.296],[-5.332,3.4],[-8.32,-5.338],[-24.789,-18.844],[3.374,1.911],[9.179,-0.232],[12.604,-4.119],[0,0]],"o":[[8.499,-3.296],[14.535,-9.269],[16.506,10.59],[0.349,0.265],[-31.23,-17.688],[-9.178,0.232],[-11.23,3.67],[0,0]],"v":[[-75.908,26.284],[-40.319,11.695],[6.585,-2.602],[101.755,37.145],[108.759,34.801],[-0.275,-7.717],[-59.263,14.17],[-124.961,39.828]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.870588243008,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.159,297.574]},"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 34","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[9.575,19.424],[-26.993,9.575],[-14.444,-4.645],[-38.938,-9.495],[-7.66,-4.377],[49.245,-5.472]],"o":[[0,0],[24.884,-8.827],[15.368,-7.02],[10.585,2.581],[7.66,4.377],[-49.245,5.472]],"v":[[-128.258,24.92],[-56.558,-2.518],[6.879,-19.311],[68.56,-0.147],[114.886,22.469],[1.925,35.141]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823537827,0.490196079016,0.039215687662,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.75686275959,0.098039217293,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.504,310.955]},"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 35","bm":0,"hd":false}],"ip":63,"op":184,"st":-19,"bm":0},{"ddd":0,"ind":85,"ty":4,"nm":"B Box","parent":83,"sr":1,"ks":{"p":{"a":0,"k":[259.78,279.019,0]},"a":{"a":0,"k":[259.78,307.519,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-0.164,-5.042],[-1.242,-24.338],[0.043,3.105],[0.687,20.76]],"o":[[0.919,28.34],[0.17,3.332],[-1.655,-21.242],[-0.209,-6.326]],"v":[[-65.85,-11.382],[-61.344,82.948],[-57.353,82.992],[-61.566,-11.913]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[0.108,-5.044],[0.116,-22.289],[-0.085,11.048],[0.398,18.717]],"o":[[-0.572,26.584],[-0.017,3.336],[0.359,-14.8],[-0.135,-6.328]],"v":[[1.607,-81.946],[1.284,26.011],[4.773,26.254],[5.378,-82.263]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[0.137,-5.044],[0.146,-22.289],[-0.123,3.103],[0.502,18.716]],"o":[[-0.72,26.584],[-0.022,3.336],[0.453,-14.8],[-0.17,-6.328]],"v":[[2.297,0.473],[2.341,102.785],[6.735,103.028],[7.046,0.156]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[0.166,-5.038],[0.047,-22.148],[-0.105,3.103],[0.752,17.976]],"o":[[-0.849,26.231],[-0.008,3.336],[0.352,-15.058],[-0.299,-6.317]],"v":[[-0.267,-29.466],[-0.276,69.547],[4.04,69.69],[4.308,-29.377]],"c":true}]},{"t":107,"s":[{"i":[[0.296,-5.068],[0.205,-21.156],[-0.15,3.103],[1.15,13.643]],"o":[[-1.493,25.577],[-0.032,3.336],[0.589,-12.173],[-0.535,-6.344]],"v":[[-2.503,-29.149],[-2.294,71.891],[2.171,72.034],[2.428,-28.855]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.419607847929,0.800000011921,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.425,261.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":90},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 36","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[257.368,295.792]},"a":{"a":0,"k":[257.368,271.292]},"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 443","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[22.679,-6.492],[27.851,10.451],[1.203,5.237],[-5.384,0.765],[-5.252,-5.651],[0,0]],"o":[[-16.292,4.769],[0,0],[0.342,-6.76],[11.428,-1.507],[1.225,2.759],[-20.671,33.045]],"v":[[12.901,84.614],[-97.215,58.162],[-119.143,30.318],[-64.56,-30.998],[104.354,-21.396],[100.864,9.574]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[20.664,0.002],[20.934,17.715],[-0.25,5.366],[-8.956,-0.601],[-3.06,-6.878],[0,0]],"o":[[-14.87,0.1],[0,0],[0.465,-7.766],[19.944,1.476],[0.367,2.99],[-25.376,26.078]],"v":[[14.92,24.246],[-107.956,-18.068],[-119.707,-50.873],[0.714,-103.598],[117.499,-52.491],[113.625,-23.596]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[10.156,-1.186],[9.653,7.754],[-0.315,5.366],[-11.279,-0.601],[-3.854,-6.878],[0,0]],"o":[[-9.844,-0.686],[0,0],[0.586,-7.766],[25.117,1.476],[0.462,2.99],[-9.4,7.531]],"v":[[4.195,110.79],[-135.301,64.351],[-150.101,31.546],[1.554,-21.179],[148.63,29.928],[143.751,58.823]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[30.021,0.776],[26.189,14.473],[-1.12,9.609],[-10.554,-0.285],[-3.602,-10.509],[0,0]],"o":[[-17.105,-0.309],[0,0],[1.417,-13.333],[33.634,0.821],[2.533,10.298],[-29.199,26.078]],"v":[[7.583,77.982],[-127.952,28.371],[-141.783,5.62],[-1.281,-50.981],[140.739,5.771],[136.792,28.65]],"c":true}]},{"t":107,"s":[{"i":[[37.944,1.622],[27.091,14.473],[-2.264,13.491],[-10.693,-0.188],[-1.718,-13.192],[0,0]],"o":[[-17.688,-0.756],[0,0],[2.578,-15.362],[42.366,0.744],[1.849,14.201],[-30.205,26.078]],"v":[[-1.471,85.201],[-131.473,32.582],[-144.037,8.726],[-3.722,-50.985],[143.686,8.726],[139.066,25.531]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588237047,0.898039221764,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5.001},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.078,0.659,0.949,0.5,0.09,0.557,0.894,1,0.102,0.455,0.839]}},"s":{"a":0,"k":[-3.452,-50.449]},"e":{"a":0,"k":[1.272,20.931]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[258.899,277.895]},"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 37","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[258.772,311.053]},"a":{"a":0,"k":[258.772,286.553]},"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 442","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[-5.222,-1.245],[1.405,-5.17],[3.966,-3.092],[20.386,2.06],[1.53,2.584],[-2.101,3.631],[0,0],[-22.586,-1.546]],"o":[[0,0],[-1.405,5.17],[-3.966,3.092],[-20.386,-2.06],[-1.53,-2.584],[1.951,-3.371],[0,0],[32.888,4.279]],"v":[[7.55,13.354],[3.79,24.228],[-3.698,36.685],[-84.458,29.65],[-173.083,26.591],[-167.343,14.211],[-159.747,3.747],[-73.362,5.481]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[-4.097,-2.635],[-3.085,9.925],[2.353,3.755],[14.157,8.028],[4.496,-3.177],[2.718,-7.186],[0,0],[-23.509,-11.529]],"o":[[0,0],[2.137,-6.64],[-2.165,-3.527],[-18.953,-9.751],[-2.838,2.087],[-2.874,7.598],[0,0],[26.664,13.167]],"v":[[20.863,-17.694],[29.831,-36.118],[31.503,-62.487],[-27.596,-88.366],[-81.189,-110.483],[-86.33,-89.348],[-94.56,-68.361],[-45.376,-47.538]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[-5.16,-2.635],[-2.87,-1.082],[2.859,3.835],[26.505,10.354],[4.002,1.587],[7.044,1.523],[0,0],[-29.606,-11.529]],"o":[[0,0],[4.345,1.638],[-2.628,-3.6],[-26.234,-10.248],[-4.002,-1.587],[-7.044,-1.523],[0,0],[33.58,13.167]],"v":[[52.055,64.725],[71.599,70.176],[88.777,78.753],[17.839,46.717],[-46.898,23.507],[-73.315,15.446],[-93.305,14.058],[-31.365,34.881]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[-5.128,-2.847],[-4.419,3.103],[-0.376,2.033],[21.97,9.16],[6.19,0.616],[3.956,-3.534],[0,0],[-29.054,-11.996]],"o":[[0,0],[4.419,-3.103],[0.252,-1.462],[-23.391,-9.857],[-2.849,-0.38],[-3.956,3.534],[0,0],[33.467,13.857]],"v":[[43.108,39.477],[56.773,28.291],[66.218,13.711],[-0.901,-15.216],[-66.629,-41.335],[-79.923,-26.235],[-96.139,-15.675],[-29.483,7.657]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[-5.407,-3.101],[-9.588,-1.403],[-2.255,1.561],[18.336,8.998],[6.489,2.159],[10.278,-0.218],[0,0],[-30.444,-12.646]],"o":[[0,0],[10.639,1.557],[1.581,-1.094],[-22.112,-10.851],[-3.655,-1.216],[-10.278,0.218],[0,0],[35.566,14.773]],"v":[[45.774,42.316],[64.34,41.287],[86.899,47.8],[13.944,8.526],[-41.131,-13.969],[-72.174,-19.188],[-98.413,-15.591],[-21.628,7.572]],"c":true}]},{"t":144,"s":[{"i":[[-5.407,-3.101],[-9.681,-0.415],[-2.255,1.561],[18.336,8.998],[6.489,2.159],[12.615,-1.277],[0,0],[-30.444,-12.646]],"o":[[0,0],[12.767,0.547],[1.581,-1.094],[-22.112,-10.851],[-3.655,-1.216],[-9.546,0.966],[0,0],[35.566,14.773]],"v":[[45.774,42.316],[66.465,40.037],[88.899,41.8],[15.944,2.526],[-39.131,-19.969],[-69.049,-21.063],[-98.413,-15.591],[-21.628,7.572]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.611764729023,0.870588302612,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.431372582912,0.823529481888,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[355.771,242.406]},"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 38","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[351.03,277.254]},"a":{"a":0,"k":[351.03,252.754]},"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 441","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.23,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[4.012,-4.374],[-5.685,-1.112],[-3.683,2.211],[-10.701,11.37],[0.346,2.342],[9.631,1.183],[0,0],[14.33,-15.248]],"o":[[0,0],[10.403,2.034],[4.081,-2.45],[13.162,-13.984],[-0.519,-3.512],[-9.299,-1.143],[0,0],[-14.33,15.248]],"v":[[-20.401,64.776],[2.353,68.738],[29.595,70.322],[55.723,39.268],[78.306,11.61],[57.7,6.617],[33.883,4.988],[5.545,33.274]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.77,"y":0},"t":69,"s":[{"i":[[4.433,-3.101],[1.564,5.511],[-2.155,4.146],[-23.597,9.352],[-6.626,-0.584],[-2.943,-5.807],[0,0],[25.652,-12.14]],"o":[[0,0],[-1.564,-5.511],[2.194,-4.64],[22.39,-8.791],[2.704,0.405],[3.681,7.074],[0,0],[-24.857,11.925]],"v":[[-20.644,-16.274],[-30.901,-39.827],[-31.97,-64.837],[27.809,-92.158],[85.442,-111.938],[91.507,-85.563],[99.157,-67.613],[36.996,-46.356]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[5.583,-3.101],[5.85,-0.158],[-0.381,2.525],[-29.315,10.545],[-9.223,1.811],[-5.57,-0.017],[0,0],[32.305,-12.14]],"o":[[0,0],[-4.537,0.122],[4.869,-8.6],[27.819,-9.923],[4.251,-0.835],[5.57,0.017],[0,0],[-31.305,11.925]],"v":[[-50.876,66.145],[-70.419,67.717],[-87.074,76.564],[-5.206,39.225],[55.892,19.404],[80.739,14.356],[99.997,14.806],[21.714,36.063]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":89,"s":[{"i":[[5.101,-3.101],[3.436,2.852],[0.354,3.806],[-24.697,10.458],[-6.248,0.369],[-5.674,-3.939],[0,0],[29.137,-11.661]],"o":[[0,0],[-3.436,-2.852],[-0.771,-2.822],[25.102,-10.539],[4.564,-0.245],[5.581,3.533],[0,0],[-29.676,11.829]],"v":[[-43.184,39.86],[-56.859,28.411],[-67.556,14.086],[3.824,-18.784],[67.641,-39.176],[83.175,-26.389],[97.67,-15.855],[26.952,8.79]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[5.277,-3.101],[9.396,-1.096],[2.553,2.918],[-16.861,7.76],[-6.363,2.064],[-12.311,-1.277],[0,0],[30.057,-11.756]],"o":[[0,0],[-10.943,1.277],[-2.969,-3.394],[21.927,-10.092],[4.499,-1.459],[9.316,0.966],[0,0],[-31.631,12.372]],"v":[[-44.749,42.811],[-64.194,41.526],[-83.986,48.168],[-12.855,8.955],[39.612,-11.473],[68.888,-17.411],[94.721,-15],[18.292,9.709]],"c":true}]},{"t":144,"s":[{"i":[[5.277,-3.101],[9.396,-1.096],[2.553,2.918],[-16.861,7.76],[-6.363,2.064],[-12.311,-1.277],[0,0],[30.057,-11.756]],"o":[[0,0],[-10.943,1.277],[-2.969,-3.394],[21.927,-10.092],[4.499,-1.459],[9.316,0.966],[0,0],[-31.631,12.372]],"v":[[-44.749,42.811],[-64.694,38.526],[-85.486,40.168],[-14.355,0.955],[38.112,-19.473],[68.388,-21.661],[94.721,-15],[18.292,9.709]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.611764729023,0.870588302612,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.431372582912,0.823529481888,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[160.456,241.91]},"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 39","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[165.018,276.782]},"a":{"a":0,"k":[165.018,252.282]},"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 440","bm":0,"hd":false}],"ip":62,"op":184,"st":-19,"bm":0},{"ddd":0,"ind":87,"ty":4,"nm":"Cap 3","sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.49],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":67,"s":[8.502]},{"t":95,"s":[230.502]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[269.546,158.532,0],"to":[-0.263,-21.554,0],"ti":[1.563,10.357,0]},{"i":{"x":0.26,"y":1},"o":{"x":0.333,"y":0},"t":75,"s":[265.769,95.507,0],"to":[-12.708,52.262,0],"ti":[0.263,-108.502,0]},{"t":95,"s":[245.546,371.282,0]}]},"a":{"a":0,"k":[257.154,274.845,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[-5.33,6.942],[-26.2,0.524],[-2.127,-5.32],[1.945,-1.163],[18.882,0.48],[1.637,3.097]],"o":[[3.734,-4.961],[17.219,-0.312],[5.369,10.135],[-1.945,1.163],[-18.882,-0.48],[-4.002,-7.569]],"v":[[-146.983,-19.934],[21.602,-42.669],[146.315,-29.782],[146.181,15.641],[22.386,9.524],[-146.924,26.425]],"c":true}]},{"t":83,"s":[{"i":[[-1.036,2.793],[-6.483,0.252],[-1.17,-2.237],[0.786,-0.676],[4.581,-0.502],[0.456,1.891]],"o":[[1.51,-2.883],[4.385,-0.17],[1.022,2.393],[-0.786,0.676],[-4.313,0.472],[-0.392,-1.625]],"v":[[-58.814,-5.848],[2.988,-58.206],[60.754,-12.506],[65.814,9.175],[2.255,-37.327],[-63.988,16.547]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588237047,0.898039221764,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.397,274.507]},"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.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[4.643,1.051],[7.427,-0.539],[31.374,-5.13],[25.896,-7.967],[-7.859,-9.865],[-8.192,3.032],[-27.643,3.772],[-2.662,-2.819],[0.414,-14.756],[0.028,1.725],[-3.312,2.045]],"o":[[0,0],[-4.643,-1.051],[-7.427,0.539],[-31.374,5.13],[-3.42,4.937],[0.273,0.343],[7.953,-2.944],[30.268,-4.13],[2.662,2.819],[-0.11,1.842],[-0.214,-13.412],[4.919,-3.037]],"v":[[148.199,-27.923],[146.122,-30.969],[23.412,-41.119],[-62.33,-33.479],[-147.108,-19.05],[-144.021,25.348],[-139.004,-16.969],[-63.634,-29.748],[19.018,-36.037],[22.363,8.18],[25.972,7.577],[27.794,-36.793]],"c":true}]},{"t":83,"s":[{"i":[[0,0],[1.327,1.715],[3.578,-0.314],[12.057,-11.394],[5.332,-8.543],[-1.334,-1.47],[-1.263,1.579],[-10.797,9.658],[-1.065,0.164],[-0.203,-8.782],[-0.001,1.003],[-0.971,0.062]],"o":[[0,0],[-1.892,-2.446],[-3.578,0.314],[-12.057,11.394],[-0.464,2.148],[0.147,0.162],[1.263,-1.579],[11.822,-10.575],[0.835,-0.129],[-0.053,1.07],[0.009,-8.133],[2.598,-0.165]],"v":[[62.227,-11.807],[61.388,-13.577],[4.155,-58.323],[-29.765,-32.632],[-58.153,-5.715],[-62.103,15.539],[-54.418,-5.923],[-29.185,-28.868],[2.093,-54.068],[2.863,-38.489],[4.56,-38.538],[5.771,-54.344]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.945098042488,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.201,275.417]},"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.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0.617,1.684],[-5.704,9.329],[-17.58,-8.564],[1.556,-4.306]],"o":[[-1.511,-4.124],[18.164,-9.231],[2.166,6.021],[-0.728,1.931]],"v":[[-72.405,0.874],[-74.454,-45.289],[94.457,-63.286],[95.583,-16.663]],"c":true}]},{"t":83,"s":[{"i":[[0.249,0.979],[-0.347,2.966],[-8.47,-4.977],[0.75,-2.503]],"o":[[-0.611,-2.397],[7.344,-5.366],[1.044,3.499],[-4.417,0.911]],"v":[[10.163,-9.551],[14.532,-31.831],[76.463,-82.007],[75.817,-63.794]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.43137255311,0.823529422283,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[183.495,301.363]},"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 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[1.89,7.493],[-19.741,-0.277],[-2.217,-5.495],[6.059,0]],"o":[[-1.009,-4.001],[17.755,0.169],[2.392,5.928],[-4.78,0]],"v":[[-149.008,4.749],[20.898,-19.78],[145.611,-6.893],[21.625,-15.204]],"c":true}]},{"t":83,"s":[{"i":[[0.764,4.355],[-4.819,0.351],[-1.14,-2.414],[2.919,0]],"o":[[-0.408,-2.326],[3.196,-0.544],[1.493,3.161],[-2.303,0]],"v":[[-60.053,18.084],[2.284,-35.316],[60.049,10.383],[2.31,-33.294]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.43137255311,0.823529422283,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[258.101,251.618]},"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 22","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[-12.858,5.989],[-3.459,-5.827],[1.887,-0.973],[10.549,0]],"o":[[18.57,-8.649],[3.541,7.108],[-1.887,0.973],[-10.549,0]],"v":[[19.564,-39.148],[145.759,-29.779],[145.625,15.644],[21.984,9.558]],"c":true}]},{"t":83,"s":[{"i":[[-6.028,3.885],[-1.027,-2.289],[0.763,-0.565],[5.082,0]],"o":[[5.001,-3.223],[1.013,2.103],[-0.763,0.565],[-5.082,0]],"v":[[1.394,-56.795],[60.197,-12.504],[65.257,9.178],[1.773,-37.306]],"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.286,0.765,0.961,0.5,0.229,0.678,0.98,1,0.173,0.592,1]}},"s":{"a":0,"k":[-150.506,0.942]},"e":{"a":0,"k":[152.042,0.942]},"t":1,"nm":"Gradient Fill 1578","hd":false},{"ty":"tr","p":{"a":0,"k":[257.953,274.505]},"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 23","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[0.043,-10.712]],"o":[[0,0],[0.153,10.831]],"v":[[248.736,264.869],[249.836,304.105]],"c":false}]},{"t":83,"s":[{"i":[[0,0],[0.021,-6.226]],"o":[[0,0],[0.073,6.295]],"v":[[258.435,311.75],[259.043,333.788]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588265213,0.898039275525,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.616107117896,0.976470588235,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":"Shape 8","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0,0.470588265213,0.898039275525,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.616107117896,0.976470588235,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":"Shape 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[-3.236,-1.342],[-3.236,0.244],[-1.301,2.451],[0,0],[2.88,-1.944],[2.24,0.488]],"o":[[3.236,1.342],[3.236,-0.244],[1.301,-2.451],[0,0],[-1.984,1.411],[-2.24,-0.488]],"v":[[113.029,302.389],[249.853,305.378],[403.123,289.495],[402.816,248.483],[249.358,264.381],[111.564,259.674]],"c":true}]},{"t":83,"s":[{"i":[[-0.999,-1.443],[-2.244,0.017],[-1.481,4.36],[0,0],[2.901,-0.436],[0.906,0.284]],"o":[[2.072,2.993],[2.244,-0.017],[0.492,-1.449],[0,0],[-2.901,0.436],[-0.906,-0.284]],"v":[[193.731,291.418],[259.052,334.528],[323.026,283.303],[318.159,263.053],[258.735,311.466],[199.047,271.624]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588265213,0.898039275525,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.616107117896,0.976470588235,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":"Shape 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[1.853,2.084],[1.846,-1.287],[-2.6,-2.887],[-1.618,0.732]],"o":[[-1.853,-2.084],[-1.846,1.287],[2.659,2.953],[1.618,-0.732]],"v":[[402.065,247.784],[278.57,235.045],[110.32,259.308],[248.114,265.479]],"c":true}]},{"t":83,"s":[{"i":[[0.749,1.211],[0.89,-0.748],[-1.051,-1.678],[-0.78,0.425]],"o":[[-0.749,-1.211],[-0.89,0.748],[1.075,1.717],[0.78,-0.425]],"v":[[318.135,262.719],[259.854,217.528],[198.544,271.411],[258.135,312.104]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.470588265213,0.898039275525,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.616107117896,0.976470588235,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":"Shape 5","bm":0,"hd":false}],"ip":67,"op":124,"st":-2,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/premium_object_smile1.svg b/TMessagesProj/src/main/res/raw/premium_object_smile1.svg new file mode 100644 index 000000000..e5bddaf50 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/premium_object_smile1.svg @@ -0,0 +1,7 @@ + + + premium_object_smile1 + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/premium_object_smile2.svg b/TMessagesProj/src/main/res/raw/premium_object_smile2.svg new file mode 100644 index 000000000..e34abcc20 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/premium_object_smile2.svg @@ -0,0 +1,7 @@ + + + premium_object_smile2 + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/smile_to_gif.json b/TMessagesProj/src/main/res/raw/smile_to_gif.json new file mode 100644 index 000000000..fda599e8e --- /dev/null +++ b/TMessagesProj/src/main/res/raw/smile_to_gif.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"smile_to_gif","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"gif","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"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":[5,5,100]},{"t":10,"s":[10,10,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]],"o":[[0,0],[0,0]],"v":[[535,435],[615,435]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.523,0],[0,0]],"o":[[0,0],[0,-5.523],[0,0],[0,0]],"v":[[-50,95],[-50,-85],[-40,-95],[50,-95]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[585,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[445,335],[445,525]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-11.046],[0,0],[16.568,0],[0,0],[0,38.66],[0,0],[-35.438,0],[0,0],[-11.046,-14.109]],"o":[[0,0],[11.046,0],[0,0],[0,16.569],[0,0],[-38.66,0],[0,0],[0,-35.438],[0,0],[17.919,0],[0,0]],"v":[[23.333,5.588],[50,5.588],[70,25.588],[70,65],[40,95],[0,95],[-70,25],[-70,-30.833],[-5.833,-95],[18.278,-95],[64.167,-72.647]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[285,430],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 5","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":6,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":0.4},"o":{"x":0.6,"y":0.6},"t":0,"s":[42,42,0],"to":[0,0,0],"ti":[0,0,0]},{"t":10,"s":[42,42,0]}],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"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":[10,10,100]},{"t":10,"s":[5,5,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-53.333,0],[-33.333,46.667]],"o":[[33.333,46.667],[53.333,0],[0,0]],"v":[[-115,-37.5],[15,32.5],[145,-37.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[106.089,-10],[137.204,-30.002],[144.978,-60],[137.221,-89.97],[106.089,-110],[74.971,-89.994],[67.2,-60],[74.999,-29.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-106.111,-10],[-74.997,-30],[-67.222,-60],[-74.995,-89.997],[-106.111,-110],[-137.248,-89.961],[-145,-60],[-137.216,-29.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[-0.1,-315],[0.1,-315],[315,-0.1],[315,0.1],[0.1,315],[-0.1,315],[-315,0.1],[-315,-0.1]],"c":true}]},{"t":10,"s":[{"i":[[-102.2,0],[0,0],[0,-102.2],[0,0],[102.2,0],[0,0],[0,102.2],[0,0]],"o":[[0,0],[102.2,0],[0,0],[0,102.2],[0,0],[-102.2,0],[0,0],[0,-102.2]],"v":[[-170,-295],[170,-295],[355,-110],[355,110],[170,295],[-170,295],[-355,110],[-355,-110]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/smile_to_keyboard.json b/TMessagesProj/src/main/res/raw/smile_to_keyboard.json new file mode 100644 index 000000000..99bbe6c6f --- /dev/null +++ b/TMessagesProj/src/main/res/raw/smile_to_keyboard.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"smile_to_keyboard","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,450],"to":[0,0],"ti":[0,5.333]},{"t":10,"s":[420,419.5]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[50,50]},{"t":10,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[-0.1,-315],[0.1,-315],[315,-0.1],[315,0.1],[0.1,315],[-0.1,315],[-315,0.1],[-315,-0.1]],"c":true}]},{"t":10,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[-230,-245],[230,-245],[325,-150],[325,150],[230,245],[-230,245],[-325,150],[-325,-150]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-53.333,0],[-33.333,46.667]],"o":[[33.333,46.667],[53.333,0],[0,0]],"v":[[-115,-37.5],[15,32.5],[145,-37.5]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[-46.667,0],[-16.667,0]],"o":[[16.667,0],[46.667,0],[0,0]],"v":[[-80,7.5],[15,7.5],[110,7.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[106.089,-10],[137.204,-30.002],[144.978,-60],[137.221,-89.97],[106.089,-110],[74.971,-89.994],[67.2,-60],[74.999,-29.958]],"c":true}]},{"t":10,"s":[{"i":[[-5,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5],[-5,0]],"o":[[5,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5],[5,0]],"v":[[200,-60],[210,-70],[210,-110],[200,-120],[160,-120],[150,-110],[150,-70],[160,-60]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-106.111,-10],[-74.997,-30],[-67.222,-60],[-74.995,-89.997],[-106.111,-110],[-137.248,-89.961],[-145,-60],[-137.216,-29.984]],"c":true}]},{"t":10,"s":[{"i":[[-5,0],[-6.128,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5]],"o":[[5,0],[6.129,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5]],"v":[[-200,-60],[-160,-60],[-150,-70],[-150,-110],[-160,-120],[-200,-120],[-210,-110],[-210,-70]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/smile_to_sticker.json b/TMessagesProj/src/main/res/raw/smile_to_sticker.json new file mode 100644 index 000000000..96a235eb1 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/smile_to_sticker.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"smile_to_sticker","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,450],"to":[0,0],"ti":[0,5.333]},{"t":10,"s":[420,450]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[50,50]},{"t":10,"s":[50,50]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":0,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[420.4,105.5],[420.6,105.5],[735.5,420.4],[735.5,420.6],[420.6,735.5],[420.4,735.5],[105.5,420.6],[105.5,420.4]],"c":true}]},{"t":10,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[290.5,105.5],[550.5,105.5],[735.5,290.5],[735.5,420.5],[420.5,735.5],[290.5,735.5],[105.5,550.5],[105.5,290.5]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[51.1,317.676],[71.1,317.676],[141.1,247.676],[141.1,197.676],[261.1,77.676],[311.1,77.676],[381.099,7.676],[381.099,-42.324]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[-165,180],[-145,180],[-75,110],[-75,60],[45,-60],[95,-60],[165,-130],[165,-180]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[570,555],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"c","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[-0.1,-315],[0.1,-315],[315,-0.1],[315,0.1],[0.1,315],[-0.1,315],[-315,0.1],[-315,-0.1]],"c":true}]},{"t":10,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[-130,-315],[130,-315],[315,-130],[315,0],[0,315],[-130,315],[-315,130],[-315,-130]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-53.333,0],[-33.333,46.667]],"o":[[33.333,46.667],[53.333,0],[0,0]],"v":[[-115,-37.5],[15,32.5],[145,-37.5]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[-46.667,0],[-20,20]],"o":[[40,43.333],[46.667,0],[0,0]],"v":[[-115,-32.5],[15,32.5],[115,2.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[106.089,-10],[137.204,-30.002],[144.978,-60],[137.221,-89.97],[106.089,-110],[74.971,-89.994],[67.2,-60],[74.999,-29.958]],"c":true}]},{"t":10,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[108.889,-10],[140.004,-30.002],[147.778,-60],[140.021,-89.97],[108.889,-110],[77.771,-89.994],[70,-60],[77.799,-29.958]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-106.111,-10],[-74.997,-30],[-67.222,-60],[-74.995,-89.997],[-106.111,-110],[-137.248,-89.961],[-145,-60],[-137.216,-29.984]],"c":true}]},{"t":10,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-111.111,-10],[-79.997,-30],[-72.222,-60],[-79.995,-89.997],[-111.111,-110],[-142.248,-89.961],[-150,-60],[-142.216,-29.984]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/sticker_to_keyboard.json b/TMessagesProj/src/main/res/raw/sticker_to_keyboard.json new file mode 100644 index 000000000..36caff27f --- /dev/null +++ b/TMessagesProj/src/main/res/raw/sticker_to_keyboard.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"sticker_to_keyboard","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,450],"to":[0,-5.333],"ti":[0,5.333]},{"t":10,"s":[420,419.5]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[50,50]},{"t":10,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[290.5,105.5],[550.5,105.5],[735.5,290.5],[735.5,420.5],[420.5,735.5],[290.5,735.5],[105.5,550.5],[105.5,290.5]],"c":true}]},{"t":10,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[190.5,175.5],[650.5,175.5],[745.5,270.5],[745.5,570.5],[650.5,665.5],[190.5,665.5],[95.5,570.5],[95.5,270.5]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[-165,180],[-145,180],[-75,110],[-75,60],[45,-60],[95,-60],[165,-130],[165,-180]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[51.1,317.676],[71.1,317.676],[141.1,247.676],[141.1,197.676],[261.1,77.676],[311.1,77.676],[381.099,7.676],[381.099,-42.324]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[570,555],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"c","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[-130,-315],[130,-315],[315,-130],[315,0],[0,315],[-130,315],[-315,130],[-315,-130]],"c":true}]},{"t":10,"s":[{"i":[[-55.2,0],[0,0],[0,-55.2],[0,0],[55.2,0],[0,0],[0,55.2],[0,0]],"o":[[0,0],[55.2,0],[0,0],[0,55.2],[0,0],[-55.2,0],[0,0],[0,-55.2]],"v":[[-230,-245],[230,-245],[325,-150],[325,150],[230,245],[-230,245],[-325,150],[-325,-150]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-46.667,0],[-20,20]],"o":[[40,43.333],[46.667,0],[0,0]],"v":[[-115,-32.5],[15,32.5],[115,2.5]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[-46.667,0],[-16.667,0]],"o":[[16.667,0],[46.667,0],[0,0]],"v":[[-80,7.5],[15,7.5],[110,7.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[108.889,-10],[140.004,-30.002],[147.778,-60],[140.021,-89.97],[108.889,-110],[77.771,-89.994],[70,-60],[77.799,-29.958]],"c":true}]},{"t":10,"s":[{"i":[[-5,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5],[-5,0]],"o":[[5,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5],[5,0]],"v":[[200,-60],[210,-70],[210,-110],[200,-120],[160,-120],[150,-110],[150,-70],[160,-60]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-111.111,-10],[-79.997,-30],[-72.222,-60],[-79.995,-89.997],[-111.111,-110],[-142.248,-89.961],[-150,-60],[-142.216,-29.984]],"c":true}]},{"t":10,"s":[{"i":[[-5,0],[-6.128,0],[0,5],[0,5],[5,0],[5,0],[0,-5],[0,-5]],"o":[[5,0],[6.129,0],[0,-5],[0,-5],[-5,0],[-5,0],[0,5],[0,5]],"v":[[-200,-60],[-160,-60],[-150,-70],[-150,-110],[-160,-120],[-200,-120],[-210,-110],[-210,-70]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/sticker_to_smile.json b/TMessagesProj/src/main/res/raw/sticker_to_smile.json new file mode 100644 index 000000000..fa82f66a4 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/sticker_to_smile.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"sticker_to_smile","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon 3","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[420,420,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,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":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-29.5],[110,-29.5],[120,-19.5],[120,20.5],[110,30.5],[70,30.5],[60,20.5],[60,-19.5]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[160,-29.5],[200,-29.5],[210,-19.5],[210,20.5],[200,30.5],[160,30.5],[150,20.5],[150,-19.5]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[70,-119.5],[110,-119.5],[120,-109.5],[120,-69.5],[110,-59.5],[70,-59.5],[60,-69.5],[60,-109.5]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-29.5],[20,-29.5],[30,-19.5],[30,20.5],[20,30.5],[-20,30.5],[-30,20.5],[-30,-19.5]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-20,-119.5],[20,-119.5],[30,-109.5],[30,-69.5],[20,-59.5],[-20,-59.5],[-30,-69.5],[-30,-109.5]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-29.5],[-70,-29.5],[-60,-19.5],[-60,20.5],[-70,30.5],[-110,30.5],[-120,20.5],[-120,-19.5]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-110,-119.5],[-70,-119.5],[-60,-109.5],[-60,-69.5],[-70,-59.5],[-110,-59.5],[-120,-69.5],[-120,-109.5]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[-5.523,0],[0,0],[0,-5.523],[0,0],[5.523,0],[0,0],[0,5.523],[0,0]],"o":[[0,0],[5.523,0],[0,0],[0,5.523],[0,0],[-5.523,0],[0,0],[0,-5.523]],"v":[[-200,-29.5],[-160,-29.5],[-150,-19.5],[-150,20.5],[-160,30.5],[-200,30.5],[-210,20.5],[-210,-19.5]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[420,450],"to":[0,-5.333],"ti":[0,0]},{"t":10,"s":[420,450]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4],"y":[1,1]},"o":{"x":[0.6,0.6],"y":[0,0]},"t":0,"s":[50,50]},{"t":10,"s":[50,50]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":4,"s":[0]},{"t":10,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"icon 2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[420,420,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[290.5,105.5],[550.5,105.5],[735.5,290.5],[735.5,420.5],[420.5,735.5],[290.5,735.5],[105.5,550.5],[105.5,290.5]],"c":true}]},{"t":10,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[420.4,105.5],[420.6,105.5],[735.5,420.4],[735.5,420.6],[420.6,735.5],[420.4,735.5],[105.5,420.6],[105.5,420.4]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[-165,180],[-145,180],[-75,110],[-75,60],[45,-60],[95,-60],[165,-130],[165,-180]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[0,0],[0,38.66],[0,0],[-66.274,0],[0,0],[0,38.66],[0,0]],"o":[[0,0],[38.66,0],[0,0],[0,-66.274],[0,0],[38.66,0],[0,0],[0,0]],"v":[[51.1,317.676],[71.1,317.676],[141.1,247.676],[141.1,197.676],[261.1,77.676],[311.1,77.676],[381.099,7.676],[381.099,-42.324]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[570,555],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"c","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[173.97,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,173.97],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[-130,-315],[130,-315],[315,-130],[315,0],[0,315],[-130,315],[-315,130],[-315,-130]],"c":true}]},{"t":10,"s":[{"i":[[-179.9,0],[0,0],[0,-164.9],[0,0],[164.9,0],[0,0],[0,184.9],[0,0]],"o":[[0,0],[184.9,0],[0,0],[0,184.9],[0,0],[-159.9,0],[0,0],[0,-164.9]],"v":[[-0.1,-315],[0.1,-315],[315,-0.1],[315,0.1],[0.1,315],[-0.1,315],[-315,0.1],[-315,-0.1]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"rect","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[-46.667,0],[-20,20]],"o":[[40,43.333],[46.667,0],[0,0]],"v":[[-115,-32.5],[15,32.5],[115,2.5]],"c":false}]},{"t":10,"s":[{"i":[[0,0],[-53.333,0],[-33.333,46.667]],"o":[[33.333,46.667],[53.333,0],[0,0]],"v":[[-115,-37.5],[15,32.5],[145,-37.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[405,537.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"smile","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[108.889,-10],[140.004,-30.002],[147.778,-60],[140.021,-89.97],[108.889,-110],[77.771,-89.994],[70,-60],[77.799,-29.958]],"c":true}]},{"t":10,"s":[{"i":[[-12.709,0],[-7.095,12.146],[0,11.255],[4.871,8.351],[12.734,0],[7.095,-12.148],[0,-11.253],[-4.897,-8.364]],"o":[[12.724,0],[4.881,-8.356],[0,-11.242],[-7.094,-12.162],[-12.725,0],[-4.88,8.355],[0,11.275],[7.096,12.121]],"v":[[106.089,-10],[137.204,-30.002],[144.978,-60],[137.221,-89.97],[106.089,-110],[74.971,-89.994],[67.2,-60],[74.999,-29.958]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeR","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-111.111,-10],[-79.997,-30],[-72.222,-60],[-79.995,-89.997],[-111.111,-110],[-142.248,-89.961],[-150,-60],[-142.216,-29.984]],"c":true}]},{"t":10,"s":[{"i":[[-12.717,0],[-7.095,12.145],[0,11.256],[4.881,8.356],[12.724,0],[7.094,-12.166],[0,-11.239],[-4.888,-8.359]],"o":[[12.723,0],[4.882,-8.357],[0,-11.254],[-7.095,-12.146],[-12.737,0],[-4.868,8.35],[0,11.263],[7.096,12.135]],"v":[[-106.111,-10],[-74.997,-30],[-67.222,-60],[-74.995,-89.997],[-106.111,-110],[-137.248,-89.961],[-145,-60],[-137.216,-29.984]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420,420],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"eyeL","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/video_to_voice.json b/TMessagesProj/src/main/res/raw/video_to_voice.json new file mode 100644 index 000000000..464e253e4 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/video_to_voice.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"video_to_voice","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[102.173,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,102.173],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[-130,-310],[130,-310],[315,-125],[315,135],[130,320],[-130,320],[-315,135],[-315,-125]],"c":true}]},{"t":10,"s":[{"i":[[-76.224,0],[0,0],[0,-76.224],[0,0],[110,0],[0,0],[0,108.016],[0,0]],"o":[[0,0],[76.224,0],[0,0],[0,148.016],[0,0],[-135,0],[0,0],[0,-76.224]],"v":[[-96.984,-235],[96.984,-235],[235,-96.984],[235,6.984],[5,235],[-5,235],[-235,16.984],[-235,-96.984]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[0]},{"t":10,"s":[26.8]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":10,"s":[73.1]}],"ix":2},"o":{"a":0,"k":22.5,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,415],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[420,660],[420,750]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[91]},{"t":10,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[91]},{"t":10,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[0]},{"t":4,"s":[60]}],"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-80,0],[0,-75],[0,0],[80,0],[0,69.036],[0,0]],"o":[[80,0],[0,0],[0,69.036],[-80,0],[0,0],[0,-75]],"v":[[-5,-35],[135,110],[135,115],[-5,255],[-145,115],[-145,110]],"c":true}]},{"t":10,"s":[{"i":[[-69.036,0],[0,-69.036],[0,0],[69.036,0],[0,69.036],[0,0]],"o":[[69.036,0],[0,0],[0,69.036],[-69.036,0],[0,0],[0,-69.036]],"v":[[0,-225],[125,-100],[125,100],[0,225],[-125,100],[-125,-100]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,310],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/voice_to_video.json b/TMessagesProj/src/main/res/raw/voice_to_video.json new file mode 100644 index 000000000..3a7721c0f --- /dev/null +++ b/TMessagesProj/src/main/res/raw/voice_to_video.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":12,"w":84,"h":84,"nm":"voice_to_video","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42,42,0],"ix":2,"l":2},"a":{"a":0,"k":[420,420,0],"ix":1,"l":2},"s":{"a":0,"k":[10,10,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-76.224,0],[0,0],[0,-76.224],[0,0],[110,0],[0,0],[0,108.016],[0,0]],"o":[[0,0],[76.224,0],[0,0],[0,148.016],[0,0],[-135,0],[0,0],[0,-76.224]],"v":[[-96.984,-235],[96.984,-235],[235,-96.984],[235,6.984],[5,235],[-5,235],[-235,16.984],[-235,-96.984]],"c":true}]},{"t":10,"s":[{"i":[[-102.173,0],[0,0],[0,-102.173],[0,0],[102.173,0],[0,0],[0,102.173],[0,0]],"o":[[0,0],[102.173,0],[0,0],[0,102.173],[0,0],[-102.173,0],[0,0],[0,-102.173]],"v":[[-130,-310],[130,-310],[315,-125],[315,135],[130,320],[-130,320],[-315,135],[-315,-125]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[26.8]},{"t":10,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[73.1]},{"t":10,"s":[100]}],"ix":2},"o":{"a":0,"k":22.5,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,415],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[420,660],[420,750]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[0]},{"t":10,"s":[91]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":0,"s":[100]},{"t":10,"s":[91]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":6,"s":[60]},{"t":10,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":10,"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":[100,100],"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":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-69.036,0],[0,-69.036],[0,0],[69.036,0],[0,69.036],[0,0]],"o":[[69.036,0],[0,0],[0,69.036],[-69.036,0],[0,0],[0,-69.036]],"v":[[0,-225],[125,-100],[125,100],[0,225],[-125,100],[-125,-100]],"c":true}]},{"t":10,"s":[{"i":[[-80,0],[0,-75],[0,0],[80,0],[0,69.036],[0,0]],"o":[[80,0],[0,0],[0,69.036],[-80,0],[0,0],[0,-75]],"v":[[-5,-35],[135,110],[135,115],[-5,255],[-145,115],[-145,110]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[420,310],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index f7a1a8a4e..09132f967 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -996,7 +996,7 @@ حظر المستخدم إبلاغ عن إزعاج حذف جميع مشاركات %1$s - مسح الرموز التعبيرية الأخيرة؟ + مسح الرموز التعبيرية الأخيرة الابتسامات والناس حيوانات وطبيعة أطعمة وأشربة diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index b41963379..1b7dc9c8a 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -996,7 +996,7 @@ Expulsar usuario Reportar spam Eliminar todo lo de %1$s - ¿Borrar los emojis recientes? + Borrar los emojis recientes Emoticonos y personas Animales y naturaleza Comida y bebida diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index edbecaa82..0a6d1d15a 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -996,7 +996,7 @@ Rimuovi utente Segnala come spam Elimina tutto da %1$s - Cancellare le emoji recenti? + Cancellare le emoji recenti Emoticon e persone Animali e natura Cibo e bevande diff --git a/TMessagesProj/src/main/res/values-ko/strings.xml b/TMessagesProj/src/main/res/values-ko/strings.xml index 292f0c310..3ea761c0a 100644 --- a/TMessagesProj/src/main/res/values-ko/strings.xml +++ b/TMessagesProj/src/main/res/values-ko/strings.xml @@ -996,7 +996,7 @@ 사용자 차단 스팸 신고 %1$s 님의 메시지 모두 삭제 - 최근에 사용한 이모지를 비울까요? + 최근에 사용한 이모지를 비울까요 스마일리와 사람 동물과 자연 음식과 음료 diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 68271c906..cf2c1033c 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -996,7 +996,7 @@ Blokkeer gebruiker Spam melden Alles verwijderen van %1$s - Recente emoji\'s wissen? + Recente emoji\'s wissen Smiley\'s en mensen Dieren en natuur Eten en drinken diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index 9d056ce5e..81c30b69e 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -996,7 +996,7 @@ Banir usuário Denunciar spam Apagar tudo de %1$s - Limpar emojis recentes? + Limpar emojis recentes Carinhas e pessoas Animais e natureza Comidas e bebidas diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index a83da7720..ce3720013 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -477,6 +477,11 @@ Choose a link Please choose a link for your public channel, so that people can find it in search and share with others.\n\nIf you\'re not interested, we suggest creating a private channel instead. Channel created + un1 sent you a gift for **un2** + You have sent a gift for **un2** + Telegram Premium + for %1$s + View Channel photo changed Channel video changed Channel photo removed @@ -932,6 +937,7 @@ Remove Group Sticker Set No results found for \"%1$s\" My sticker sets + My emoji packs invisible support @@ -1078,7 +1084,8 @@ Translation failed. Try again later. Translation failed. Delete all from %1$s - Clear recent emoji? + Clear recent emoji + Do you want to clear all your recent emoji? Smileys and people Animals and nature Food and drink @@ -1165,6 +1172,8 @@ The admins of this group have restricted you from sending stickers. The admins of this group have restricted you from sending GIFs. The admins of this group have restricted you from writing here. + **%1$s** doesn\'t accept voice messages. + **%1$s** doesn\'t accept video messages. Sending media isn\'t allowed in this group. Inline bots aren\'t allowed in this group. Stickers aren\'t allowed in this group. @@ -1189,6 +1198,7 @@ Yandex No previews Install Google Maps? + Install Petal Maps? SCAM FAKE via @@ -1645,8 +1655,8 @@ Animated stickers will play in chat continuously. Animated Stickers Add Stickers - ADD %1$s - REMOVE %1$s + Add %1$s + Remove %1$s Add Masks Add to Stickers Add to Favorites @@ -1662,18 +1672,37 @@ Clear recent stickers Add to Masks Stickers not found + Emoji pack not found. Stickers removed. %1$s is no longer in your stickers. Masks removed. %1$s is no longer in your masks. + Emoji removed. + %1$s is no longer in your emoji packs. + %1$d emoji packs is no longer in your emoji. + %1$d emoji pack is no longer in your emoji. + %1$d emoji packs are no longer in your emoji. + %1$d emoji packs are no longer in your emoji. + %1$d emoji packs are no longer in your emoji. + %1$d emoji packs are no longer in your emoji. Stickers archived. %1$s has been moved to your archive. + Emoji archived. + %1$s has been moved to your archive. Masks archived. %1$s has been moved to your archive. Stickers added. %1$s has been added to your stickers. Masks added. %1$s has been added to your masks. + Emoji added. + %1$s has been added to your emoji packs. + %1$d emoji pack has been added to your emoji. + %1$d emoji pack has 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. + %1$d emoji packs have been added to your emoji. + %1$d emoji packs have been added to your emoji. Archive Share Copy link @@ -1691,18 +1720,25 @@ Masks You can add masks to photos you send. To do this, open the photo editor before sending a photo. Trending Stickers + Trending Emoji Packs Trending GIFs Show More Stickers + Show More Emoji Suggest stickers by emoji All Sets My Sets None + Suggest Animated Emoji + Each time you enter an emoji you can replace it with an alternative animated emoji. These stickers are currently trending on Telegram. You can add custom stickers via the @stickers bot. Artists are welcome to add their own sticker sets using our @stickers bot. + Artists are welcome to add their own emoji packs using our @stickers bot. Archived Stickers Archived Masks + Archived Emoji Packs No archived stickers No archived masks + No archived emoji packs You can add up to 200 sticker sets.\nUnused sets are archived when you add more. You can have up to 200 sets of masks.\nUnused sets are archived when you add more. SEND STICKER @@ -3099,6 +3135,11 @@ Privacy and Security Privacy Last Seen & Online + Voice Messages + Who can send me voice messages? + You can restrict who can send you voice messages with granular precision. + You can add users or entire groups as exceptions that will override the settings above. + Only subscribers of *Telegram Premium* can restrict receiving voice messages. Profile Photo Who can see my profile photo? You can restrict who can see your profile photo with granular precision. @@ -3231,6 +3272,8 @@ Delete bot Allow Don\'t Allow + Changes that you made may not be saved. + Close anyway Done Open @@ -3239,6 +3282,7 @@ Close Change Add + Added Edit Send Call @@ -3493,6 +3537,9 @@ Sorry, sending stickers is not allowed in this group. Sorry, sending media is not allowed in this group. Sorry, sending polls is not allowed in this group. + Sorry, you can\'t send voice messages to this user because of their privacy settings. + Sorry, you can\'t send video messages to this user because of their privacy settings. + Unable to forward We\'re very sorry, but this means you can\'t sign up for Telegram.\n\nUnlike others, we don\'t use your data for ad targeting or other commercial purposes. Telegram only stores the information it needs to function as a feature-rich cloud service. You can adjust how we use your data (e.g., delete synced contacts) in Privacy & Security settings.\n\nBut if you\'re generally not OK with Telegram\'s modest requirements, it won\'t be possible for us to provide you with this service. Age Verification Privacy Policy and Terms of Service @@ -4342,6 +4389,24 @@ %1$d masks %1$d masks %1$d masks + %1$d emoji + %1$d emoji + %1$d emoji + %1$d emoji + %1$d emoji + %1$d emoji + %1$d Emoji + %1$d Emoji + %1$d Emoji + %1$d Emoji + %1$d Emoji + %1$d Emoji + %1$d Emoji Packs + %1$d Emoji Pack + %1$d Emoji Packs + %1$d Emoji Packs + %1$d Emoji Packs + %1$d Emoji Packs %1$d subscribers %1$d subscriber %1$d subscribers @@ -5085,6 +5150,11 @@ Сopying and forwarding is not allowed in this channel. Сopying and forwarding is not allowed in this group. Copying and forwarding is not allowed from this bot. + This message contains emoji from %s pack. + This message contains emoji from **%d Packs**. + This message contains emoji from **%d Packs**. + This message contains emoji from **%d Packs**. + This message contains emoji from **%d Packs**. Send message as... VIEW POST Saving content @@ -5322,6 +5392,7 @@ Private Chats Groups Channels + Unlock Premium Emoji Unlock Premium Stickers Unlock Premium Reactions Unlock additional reactions by subscribing to Telegram Premium. @@ -5354,6 +5425,8 @@ Unique Reactions Premium Stickers Exclusive enlarged stickers featuring additional effects, updated monthly. + Animated Emoji + Include animated emoji from different emoji sets in any message you send. Profile Badge A badge next to your name showing that you are helping support Telegram. Animated Profile Pictures @@ -5364,6 +5437,13 @@ **Official app needed** You need an official Telegram app to subscribe to **Telegram Premium**.\n\nOnce subscribed, you will be able to use the benefits of Telegram Premium in any apps that support it, including unofficial ones. Install official app + Gift Subscription for %1$s + -%1$d%% + %1$s / month + You can review the list of features and terms of use for Telegram Premium *here*. + Gift Premium + Gift Telegram Premium + Let **%1$s** enjoy exclusive features of Telegram with **Telegram Premium**. Telegram Premium Go **beyond the limits**, get exclusive features and support us by subscribing to **Telegram Premium**. You are all set! @@ -5408,7 +5488,6 @@ An older GIF was replaced with this one. This pack contains premium stickers like this one. View - **%s** is a subscriber of Telegram Premium. Hide Bio Add more symbols and use links in your bio. @@ -5446,7 +5525,19 @@ Are you sure you want to leave the selected chats?]]> Additional animated reactions on messages, available only to Premium subscribers. Tools to set the default folder, auto-archive and hide new chats from non-contacts. - Owners of **Telegram Premium** accounts have exclusive acces to multiple additional features. + **%s** is a subscriber of Telegram Premium. + Owners of **Telegram Premium** accounts have exclusive access to multiple additional features. + **%1$s** has gifted you a %2$d-month subscription for Telegram Premium. + You now have access to additional features. + You gifted **%1$s** a %2$d-month subscription for Telegram Premium. + **%1$s** now have access to additional features. Remove ads such as this one by subscribing to Telegram Premium. Trending Premium Stickers + Unlock %1$s + Subscribe to **Telegram Premium** to unlock this emoji. + Try sending these emoji in **Saved Messages** for free to test. + More + Unlock + Restore + This emoji pack is available only to subscribers of **Telegram Premium.** diff --git a/TMessagesProj_App/.gitignore b/TMessagesProj_App/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/TMessagesProj_App/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/TMessagesProj_App/build.gradle b/TMessagesProj_App/build.gradle new file mode 100644 index 000000000..b1465beef --- /dev/null +++ b/TMessagesProj_App/build.gradle @@ -0,0 +1,219 @@ +apply plugin: 'com.android.application' + +repositories { + mavenCentral() + google() +} + +configurations { + compile.exclude module: 'support-v4' +} + +configurations.all { + exclude group: 'com.google.firebase', module: 'firebase-core' + exclude group: 'androidx.recyclerview', module: 'recyclerview' +} + +dependencies { + implementation project(':TMessagesProj') + implementation 'androidx.multidex:multidex:2.0.1' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' + implementation files('../TMessagesProj/libs/libgsaverification-client.aar') +} + +android { + compileSdkVersion 31 + buildToolsVersion '31.0.0' + + defaultConfig.applicationId = APP_PACKAGE + + sourceSets.main.jniLibs.srcDirs = ['../TMessagesProj/jni/'] + + lintOptions { + disable 'MissingTranslation' + disable 'ExtraTranslation' + disable 'BlockedPrivateApi' + } + + dexOptions { + jumboMode = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + + coreLibraryDesugaringEnabled true + } + + signingConfigs { + debug { + storeFile file("../TMessagesProj/config/release.keystore") + storePassword RELEASE_STORE_PASSWORD + keyAlias RELEASE_KEY_ALIAS + keyPassword RELEASE_KEY_PASSWORD + } + + release { + storeFile file("../TMessagesProj/config/release.keystore") + storePassword RELEASE_STORE_PASSWORD + keyAlias RELEASE_KEY_ALIAS + keyPassword RELEASE_KEY_PASSWORD + } + } + + buildTypes { + debug { + debuggable true + jniDebuggable true + signingConfig signingConfigs.debug + applicationIdSuffix ".beta" + minifyEnabled false + shrinkResources false + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + + HA { + debuggable false + jniDebuggable false + signingConfig signingConfigs.debug + applicationIdSuffix ".beta" + minifyEnabled true + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + + standalone { + debuggable false + jniDebuggable false + signingConfig signingConfigs.release + applicationIdSuffix ".web" + minifyEnabled true + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + + release { + debuggable false + jniDebuggable false + signingConfig signingConfigs.release + minifyEnabled true + shrinkResources false + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + } + + sourceSets.debug { + manifest.srcFile '../TMessagesProj/config/debug/AndroidManifest.xml' + } + + sourceSets.HA { + manifest.srcFile '../TMessagesProj/config/debug/AndroidManifest.xml' + } + + sourceSets.standalone { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest.xml' + } + + sourceSets.release { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest.xml' + } + + flavorDimensions "minApi" + + productFlavors { + bundleAfat { + ndk { + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + } + ext { + abiVersionCode = 1 + } + } + bundleAfat_SDK23 { + ndk { + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + } + sourceSets.debug { + manifest.srcFile '../TMessagesProj/config/debug/AndroidManifest_SDK23.xml' + } + sourceSets.release { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest_SDK23.xml' + } + sourceSets.standalone { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest_standalone.xml' + } + minSdkVersion 23 + ext { + abiVersionCode = 2 + } + } + afat { + ndk { + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + } + sourceSets.debug { + manifest.srcFile '../TMessagesProj/config/debug/AndroidManifest_SDK23.xml' + } + sourceSets.release { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest_SDK23.xml' + } + sourceSets.standalone { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest_standalone.xml' + } + ext { + abiVersionCode = 9 + } + } + } + + defaultConfig.versionCode = Integer.parseInt(APP_VERSION_CODE) + + applicationVariants.all { variant -> + variant.outputs.all { output -> + outputFileName = "app.apk" + output.versionCodeOverride = defaultConfig.versionCode * 10 + variant.productFlavors.get(0).abiVersionCode + } + } + + variantFilter { variant -> + def names = variant.flavors*.name + if (variant.buildType.name != "release" && !names.contains("afat")) { + setIgnore(true) + } + } + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionName APP_VERSION_NAME + ndkVersion "21.4.7075529" + + multiDexEnabled true + + vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] + + externalNativeBuild { + cmake { + version '3.10.2' + arguments '-DANDROID_STL=c++_static', '-DANDROID_PLATFORM=android-16', "-j=16" + } + } + } + + buildFeatures { + buildConfig = true + } + + lintOptions { + checkReleaseBuilds false + } +} + +apply plugin: 'com.google.gms.google-services' diff --git a/TMessagesProj/google-services.json b/TMessagesProj_App/google-services.json old mode 100755 new mode 100644 similarity index 100% rename from TMessagesProj/google-services.json rename to TMessagesProj_App/google-services.json diff --git a/TMessagesProj_App/src/main/AndroidManifest.xml b/TMessagesProj_App/src/main/AndroidManifest.xml new file mode 100644 index 000000000..0e501a7e8 --- /dev/null +++ b/TMessagesProj_App/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TMessagesProj_App/src/main/java/org/telegram/messenger/ApplicationLoaderImpl.java b/TMessagesProj_App/src/main/java/org/telegram/messenger/ApplicationLoaderImpl.java new file mode 100644 index 000000000..7b80edfd4 --- /dev/null +++ b/TMessagesProj_App/src/main/java/org/telegram/messenger/ApplicationLoaderImpl.java @@ -0,0 +1,10 @@ +package org.telegram.messenger; + +import org.telegram.messenger.regular.BuildConfig; + +public class ApplicationLoaderImpl extends ApplicationLoader { + @Override + protected String onGetApplicationId() { + return BuildConfig.APPLICATION_ID; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java b/TMessagesProj_App/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java similarity index 100% rename from TMessagesProj/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java rename to TMessagesProj_App/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java b/TMessagesProj_App/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java similarity index 100% rename from TMessagesProj/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java rename to TMessagesProj_App/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java diff --git a/TMessagesProj_AppHuawei/.gitignore b/TMessagesProj_AppHuawei/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/TMessagesProj_AppHuawei/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/TMessagesProj_AppHuawei/agconnect-services.json b/TMessagesProj_AppHuawei/agconnect-services.json new file mode 100644 index 000000000..acd65107c --- /dev/null +++ b/TMessagesProj_AppHuawei/agconnect-services.json @@ -0,0 +1,92 @@ +{ + "agcgw":{ + "backurl":"connect-dre.hispace.hicloud.com", + "url":"connect-dre.dbankcloud.cn", + "websocketbackurl":"connect-ws-dre.hispace.dbankcloud.com", + "websocketurl":"connect-ws-dre.hispace.dbankcloud.cn" + }, + "agcgw_all":{ + "CN":"connect-drcn.dbankcloud.cn", + "CN_back":"connect-drcn.hispace.hicloud.com", + "DE":"connect-dre.dbankcloud.cn", + "DE_back":"connect-dre.hispace.hicloud.com", + "RU":"connect-drru.hispace.dbankcloud.ru", + "RU_back":"connect-drru.hispace.dbankcloud.cn", + "SG":"connect-dra.dbankcloud.cn", + "SG_back":"connect-dra.hispace.hicloud.com" + }, + "websocketgw_all":{ + "CN":"connect-ws-drcn.hispace.dbankcloud.cn", + "CN_back":"connect-ws-drcn.hispace.dbankcloud.com", + "DE":"connect-ws-dre.hispace.dbankcloud.cn", + "DE_back":"connect-ws-dre.hispace.dbankcloud.com", + "RU":"connect-ws-drru.hispace.dbankcloud.ru", + "RU_back":"connect-ws-drru.hispace.dbankcloud.cn", + "SG":"connect-ws-dra.hispace.dbankcloud.cn", + "SG_back":"connect-ws-dra.hispace.dbankcloud.com" + }, + "client":{ + "cp_id":"890971000000000430", + "product_id":"9105385871708127577", + "client_id":"199221217075397696", + "client_secret":"1BA95A459EAFAD0B04A8F5138E5BE9533DAEF4CADCF49AAB67ABF6502D68BAC8", + "project_id":"9105385871708127577", + "app_id":"101184875", + "api_key":"DAEDAEehEkTAPVhW2szdQNNLzBVS1Re7Pw98QkLMvgGZaEEUc8JLBVi2qhMh2vWw9h/Yq2PwtSGxZzFrSmLAQIysf7Tvo4BAadcblA==", + "package_name":"org.telegram.messenger" + }, + "oauth_client":{ + "client_id":"101184875", + "client_type":1 + }, + "app_info":{ + "app_id":"101184875", + "package_name":"org.telegram.messenger" + }, + "service":{ + "analytics":{ + "collector_url":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", + "collector_url_ru":"datacollector-drru.dt.dbankcloud.ru,datacollector-drru.dt.hicloud.com", + "collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn", + "collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", + "collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", + "resource_id":"p1", + "channel_id":"" + }, + "search":{ + "url":"https://search-dre.cloud.huawei.com" + }, + "cloudstorage":{ + "storage_url_sg_back":"https://agc-storage-dra.cloud.huawei.asia", + "storage_url_ru_back":"https://agc-storage-drru.cloud.huawei.ru", + "storage_url_ru":"https://agc-storage-drru.cloud.huawei.ru", + "storage_url_de_back":"https://agc-storage-dre.cloud.huawei.eu", + "storage_url_de":"https://ops-dre.agcstorage.link", + "storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn", + "storage_url_sg":"https://ops-dra.agcstorage.link", + "storage_url_cn_back":"https://agc-storage-drcn.cloud.huawei.com.cn", + "storage_url_cn":"https://agc-storage-drcn.platform.dbankcloud.cn" + }, + "ml":{ + "mlservice_url":"ml-api-dre.ai.dbankcloud.com,ml-api-dre.ai.dbankcloud.cn" + } + }, + "region":"DE", + "configuration_version":"3.0", + "appInfos":[ + { + "package_name":"org.telegram.messenger", + "client":{ + "app_id":"101184875" + }, + "app_info":{ + "package_name":"org.telegram.messenger", + "app_id":"101184875" + }, + "oauth_client":{ + "client_type":1, + "client_id":"101184875" + } + } + ] +} \ No newline at end of file diff --git a/TMessagesProj_AppHuawei/build.gradle b/TMessagesProj_AppHuawei/build.gradle new file mode 100644 index 000000000..9589d9b8c --- /dev/null +++ b/TMessagesProj_AppHuawei/build.gradle @@ -0,0 +1,165 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.huawei.agconnect' + +repositories { + mavenCentral() + google() + maven { url 'https://developer.huawei.com/repo/' } +} + +configurations { + compile.exclude module: 'support-v4' +} + +configurations.all { + exclude group: 'com.google.firebase', module: 'firebase-core' + exclude group: 'androidx.recyclerview', module: 'recyclerview' +} + +dependencies { + implementation project(':TMessagesProj') + implementation 'androidx.multidex:multidex:2.0.1' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' + implementation files('../TMessagesProj/libs/libgsaverification-client.aar') + + implementation 'com.google.firebase:firebase-messaging:22.0.0' + implementation 'com.huawei.hms:push:6.5.0.300' + implementation 'com.huawei.hms:maps:6.6.0.300' + implementation 'com.huawei.hms:location:6.4.0.300' +} + +android { + compileSdkVersion 31 + buildToolsVersion '31.0.0' + + defaultConfig.applicationId = APP_PACKAGE + + sourceSets.main.jniLibs.srcDirs = ['../TMessagesProj/jni/'] + + lintOptions { + disable 'MissingTranslation' + disable 'ExtraTranslation' + disable 'BlockedPrivateApi' + } + + dexOptions { + jumboMode = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + + coreLibraryDesugaringEnabled true + } + + signingConfigs { + debug { + storeFile file("../TMessagesProj/config/release.keystore") + storePassword RELEASE_STORE_PASSWORD + keyAlias RELEASE_KEY_ALIAS + keyPassword RELEASE_KEY_PASSWORD + } + + release { + storeFile file("../TMessagesProj/config/release.keystore") + storePassword RELEASE_STORE_PASSWORD + keyAlias RELEASE_KEY_ALIAS + keyPassword RELEASE_KEY_PASSWORD + } + } + + buildTypes { + debug { + debuggable true + jniDebuggable true + signingConfig signingConfigs.debug + minifyEnabled false + shrinkResources false + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + release { + debuggable false + jniDebuggable false + signingConfig signingConfigs.release + minifyEnabled true + shrinkResources false + multiDexEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro' + ndk.debugSymbolLevel = 'FULL' + } + } + + sourceSets.debug { + manifest.srcFile '../TMessagesProj/config/debug/AndroidManifest.xml' + } + + sourceSets.release { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest.xml' + } + + flavorDimensions "minApi" + + productFlavors { + afat { + ndk { + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + } + sourceSets.debug { + manifest.srcFile '../TMessagesProj/config/debug/AndroidManifest_SDK23.xml' + } + sourceSets.release { + manifest.srcFile '../TMessagesProj/config/release/AndroidManifest_SDK23.xml' + } + ext { + abiVersionCode = 9 + } + } + } + + defaultConfig.versionCode = Integer.parseInt(APP_VERSION_CODE) + + applicationVariants.all { variant -> + variant.outputs.all { output -> + outputFileName = "app-huawei.apk" + output.versionCodeOverride = defaultConfig.versionCode * 10 + variant.productFlavors.get(0).abiVersionCode + } + } + + variantFilter { variant -> + def names = variant.flavors*.name + if (variant.buildType.name != "release" && !names.contains("afat")) { + setIgnore(true) + } + } + + defaultConfig { + minSdkVersion 19 + targetSdkVersion 30 + versionName APP_VERSION_NAME + ndkVersion "21.4.7075529" + + multiDexEnabled true + + vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] + + externalNativeBuild { + cmake { + version '3.10.2' + arguments '-DANDROID_STL=c++_static', '-DANDROID_PLATFORM=android-16', "-j=16" + } + } + } + + buildFeatures { + buildConfig = true + } + + lintOptions { + checkReleaseBuilds false + } +} + +apply plugin: 'com.google.gms.google-services' diff --git a/TMessagesProj_AppHuawei/google-services.json b/TMessagesProj_AppHuawei/google-services.json new file mode 100644 index 000000000..640e841b2 --- /dev/null +++ b/TMessagesProj_AppHuawei/google-services.json @@ -0,0 +1,98 @@ +{ + "project_info": { + "project_number": "760348033671", + "firebase_url": "https://tmessages2.firebaseio.com", + "project_id": "tmessages2", + "storage_bucket": "tmessages2.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:760348033671:android:f6afd7b67eae3860", + "android_client_info": { + "package_name": "org.telegram.messenger" + } + }, + "oauth_client": [ + { + "client_id": "760348033671-2hh8ebmuflsnjoc0kldkfells9rhtfni.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "760348033671-2hh8ebmuflsnjoc0kldkfells9rhtfni.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:760348033671:android:dc022572c167a16c", + "android_client_info": { + "package_name": "org.telegram.messenger.beta" + } + }, + "oauth_client": [ + { + "client_id": "760348033671-2hh8ebmuflsnjoc0kldkfells9rhtfni.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "760348033671-2hh8ebmuflsnjoc0kldkfells9rhtfni.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:760348033671:android:7396e651423888c3f66e22", + "android_client_info": { + "package_name": "org.telegram.messenger.web" + } + }, + "oauth_client": [ + { + "client_id": "760348033671-2hh8ebmuflsnjoc0kldkfells9rhtfni.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "760348033671-2hh8ebmuflsnjoc0kldkfells9rhtfni.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/TMessagesProj_AppHuawei/src/main/AndroidManifest.xml b/TMessagesProj_AppHuawei/src/main/AndroidManifest.xml new file mode 100644 index 000000000..f341ae0bc --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java new file mode 100644 index 000000000..aa38318ed --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/GoogleVoiceClientActivity.java @@ -0,0 +1,19 @@ +/* + * This is the source code of Telegram for Android v. 5.x.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2018. + */ + +package org.telegram.messenger; + +import com.google.android.search.verification.client.SearchActionVerificationClientActivity; +import com.google.android.search.verification.client.SearchActionVerificationClientService; + +public class GoogleVoiceClientActivity extends SearchActionVerificationClientActivity { + + public Class getServiceClass() { + return GoogleVoiceClientService.class; + } +} diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java new file mode 100644 index 000000000..a0e8e81fb --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/GoogleVoiceClientService.java @@ -0,0 +1,55 @@ +/* + * This is the source code of Telegram for Android v. 5.x.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2018. + */ + +package org.telegram.messenger; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; + +import com.google.android.search.verification.client.SearchActionVerificationClientService; + +import org.telegram.tgnet.TLRPC; + +public class GoogleVoiceClientService extends SearchActionVerificationClientService { + + @Override + public void performAction(Intent intent, boolean isVerified, Bundle options) { + if (!isVerified) { + return; + } + AndroidUtilities.runOnUIThread(() -> { + try { + int currentAccount = UserConfig.selectedAccount; + ApplicationLoader.postInitApplication(); + if (AndroidUtilities.needShowPasscode() || SharedConfig.isWaitingForPasscodeEnter) { + return; + } + String text = intent.getStringExtra("android.intent.extra.TEXT"); + if (!TextUtils.isEmpty(text)) { + String contactUri = intent.getStringExtra("com.google.android.voicesearch.extra.RECIPIENT_CONTACT_URI"); + String id = intent.getStringExtra("com.google.android.voicesearch.extra.RECIPIENT_CONTACT_CHAT_ID"); + long uid = Long.parseLong(id); + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(uid); + if (user == null) { + user = MessagesStorage.getInstance(currentAccount).getUserSync(uid); + if (user != null) { + MessagesController.getInstance(currentAccount).putUser(user, true); + } + } + if (user != null) { + ContactsController.getInstance(currentAccount).markAsContacted(contactUri); + SendMessagesHelper.getInstance(currentAccount).sendMessage(text, user.id, null, null, null, true, null, null, null, true, 0, null); + } + } + } catch (Exception e) { + FileLog.e(e); + } + }); + } +} diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiApplicationLoader.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiApplicationLoader.java new file mode 100644 index 000000000..a91c811d6 --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiApplicationLoader.java @@ -0,0 +1,46 @@ +package org.telegram.messenger; + +import com.google.firebase.messaging.FirebaseMessaging; +import com.huawei.hms.push.HmsMessaging; + +import org.telegram.messenger.huawei.BuildConfig; + +public class HuaweiApplicationLoader extends ApplicationLoader { + @Override + protected boolean isHuaweiBuild() { + return true; + } + + @Override + protected PushListenerController.IPushListenerServiceProvider onCreatePushProvider() { + if (PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices()) { + HmsMessaging.getInstance(this).setAutoInitEnabled(false); + FirebaseMessaging.getInstance().setAutoInitEnabled(true); + return PushListenerController.GooglePushListenerServiceProvider.INSTANCE; + } + HmsMessaging.getInstance(this).setAutoInitEnabled(true); + FirebaseMessaging.getInstance().setAutoInitEnabled(false); + return HuaweiPushListenerProvider.INSTANCE; + } + + @Override + protected ILocationServiceProvider onCreateLocationServiceProvider() { + if (PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices()) { + return new GoogleLocationProvider(); + } + return new HuaweiLocationProvider(); + } + + @Override + protected IMapsProvider onCreateMapsProvider() { + if (PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices()) { + return new GoogleMapsProvider(); + } + return new HuaweiMapsProvider(); + } + + @Override + protected String onGetApplicationId() { + return BuildConfig.APPLICATION_ID; + } +} diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiLocationProvider.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiLocationProvider.java new file mode 100644 index 000000000..17f7756b4 --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiLocationProvider.java @@ -0,0 +1,163 @@ +package org.telegram.messenger; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.location.Location; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.core.util.Consumer; + +import com.huawei.hms.api.HuaweiApiClient; +import com.huawei.hms.common.ApiException; +import com.huawei.hms.location.FusedLocationProviderClient; +import com.huawei.hms.location.LocationCallback; +import com.huawei.hms.location.LocationRequest; +import com.huawei.hms.location.LocationResult; +import com.huawei.hms.location.LocationServices; +import com.huawei.hms.location.LocationSettingsRequest; +import com.huawei.hms.location.LocationSettingsStatusCodes; +import com.huawei.hms.location.SettingsClient; + +@SuppressLint("MissingPermission") +public class HuaweiLocationProvider implements ILocationServiceProvider { + private FusedLocationProviderClient locationProviderClient; + private SettingsClient settingsClient; + + @Override + public void init(Context context) { + locationProviderClient = LocationServices.getFusedLocationProviderClient(context); + settingsClient = new SettingsClient(context); + } + + @Override + public ILocationRequest onCreateLocationRequest() { + return new GoogleLocationRequest(LocationRequest.create()); + } + + @Override + public void getLastLocation(Consumer callback) { + locationProviderClient.getLastLocation().addOnCompleteListener(task -> callback.accept(task.getResult())); + } + + @Override + public void requestLocationUpdates(ILocationRequest request, ILocationListener locationListener) { + locationProviderClient.requestLocationUpdates(((GoogleLocationRequest) request).request, new LocationCallback() { + @Override + public void onLocationResult(@NonNull LocationResult locationResult) { + locationListener.onLocationChanged(locationResult.getLastLocation()); + } + }, Looper.getMainLooper()); + } + + @Override + public void removeLocationUpdates(ILocationListener locationListener) { + locationProviderClient.removeLocationUpdates(new LocationCallback() { + @Override + public void onLocationResult(@NonNull LocationResult locationResult) { + locationListener.onLocationChanged(locationResult.getLastLocation()); + } + }); + } + + @Override + public void checkLocationSettings(ILocationRequest request, Consumer callback) { + LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(((GoogleLocationRequest) request).request); + + settingsClient.checkLocationSettings(builder.build()).addOnCompleteListener(task -> { + try { + task.getResultThrowException(ApiException.class); + callback.accept(STATUS_SUCCESS); + } catch (ApiException exception) { + switch (exception.getStatusCode()) { + case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: + callback.accept(STATUS_RESOLUTION_REQUIRED); + break; + case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: + callback.accept(STATUS_SETTINGS_CHANGE_UNAVAILABLE); + break; + } + } + }); + } + + @Override + public IMapApiClient onCreateLocationServicesAPI(Context context, IAPIConnectionCallbacks connectionCallbacks, IAPIOnConnectionFailedListener failedListener) { + return new GoogleApiClientImpl(new HuaweiApiClient.Builder(ApplicationLoader.applicationContext) + .addConnectionCallbacks(new HuaweiApiClient.ConnectionCallbacks() { + @Override + public void onConnected() { + connectionCallbacks.onConnected(null); + } + + @Override + public void onConnectionSuspended(int i) { + connectionCallbacks.onConnectionSuspended(i); + } + }) + .addOnConnectionFailedListener(connectionResult -> failedListener.onConnectionFailed()) + .build()); + } + + @Override + public boolean checkServices() { + return PushListenerController.GooglePushListenerServiceProvider.INSTANCE.hasServices(); + } + + public final static class GoogleLocationRequest implements ILocationRequest { + private LocationRequest request; + + private GoogleLocationRequest(LocationRequest request) { + this.request = request; + } + + @Override + public void setPriority(int priority) { + int outPriority; + switch (priority) { + default: + case PRIORITY_HIGH_ACCURACY: + outPriority = LocationRequest.PRIORITY_HIGH_ACCURACY; + break; + case PRIORITY_BALANCED_POWER_ACCURACY: + outPriority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; + break; + case PRIORITY_LOW_POWER: + outPriority = LocationRequest.PRIORITY_LOW_POWER; + break; + case PRIORITY_NO_POWER: + outPriority = LocationRequest.PRIORITY_NO_POWER; + break; + } + request.setPriority(outPriority); + } + + @Override + public void setInterval(long interval) { + request.setInterval(interval); + } + + @Override + public void setFastestInterval(long interval) { + request.setFastestInterval(interval); + } + } + + public final static class GoogleApiClientImpl implements IMapApiClient { + private HuaweiApiClient apiClient; + + private GoogleApiClientImpl(HuaweiApiClient apiClient) { + this.apiClient = apiClient; + } + + @Override + public void connect() { + apiClient.connect(null); + } + + @Override + public void disconnect() { + apiClient.disconnect(); + } + } +} diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiMapsProvider.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiMapsProvider.java new file mode 100644 index 000000000..60e75f6e1 --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiMapsProvider.java @@ -0,0 +1,618 @@ +package org.telegram.messenger; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.location.Location; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; + +import androidx.core.util.Consumer; + +import com.huawei.hms.maps.CameraUpdate; +import com.huawei.hms.maps.CameraUpdateFactory; +import com.huawei.hms.maps.HuaweiMap; +import com.huawei.hms.maps.MapView; +import com.huawei.hms.maps.MapsInitializer; +import com.huawei.hms.maps.Projection; +import com.huawei.hms.maps.UiSettings; +import com.huawei.hms.maps.model.BitmapDescriptorFactory; +import com.huawei.hms.maps.model.Circle; +import com.huawei.hms.maps.model.CircleOptions; +import com.huawei.hms.maps.model.Dash; +import com.huawei.hms.maps.model.Gap; +import com.huawei.hms.maps.model.LatLngBounds; +import com.huawei.hms.maps.model.MapStyleOptions; +import com.huawei.hms.maps.model.Marker; +import com.huawei.hms.maps.model.MarkerOptions; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class HuaweiMapsProvider implements IMapsProvider { + + @Override + public void initializeMaps(Context context) { + MapsInitializer.initialize(context); + } + + @Override + public IMapView onCreateMapView(Context context) { + return new HuaweiMapView(context); + } + + @Override + public ICameraUpdate newCameraUpdateLatLng(LatLng latLng) { + return new HuaweiCameraUpdate(CameraUpdateFactory.newLatLng(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude))); + } + + @Override + public ICameraUpdate newCameraUpdateLatLngZoom(LatLng latLng, float zoom) { + return new HuaweiCameraUpdate(CameraUpdateFactory.newLatLngZoom(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude), zoom)); + } + + @Override + public ICameraUpdate newCameraUpdateLatLngBounds(ILatLngBounds bounds, int padding) { + return new HuaweiCameraUpdate(CameraUpdateFactory.newLatLngBounds(((HuaweiLatLngBounds) bounds).bounds, padding)); + } + + @Override + public ILatLngBoundsBuilder onCreateLatLngBoundsBuilder() { + return new HuaweiLatLngBoundsBuilder(); + } + + @Override + public IMapStyleOptions loadRawResourceStyle(Context context, int resId) { + return new HuaweiMapStyleOptions(MapStyleOptions.loadRawResourceStyle(context, resId)); + } + + @Override + public IMarkerOptions onCreateMarkerOptions() { + return new HuaweiMarkerOptions(); + } + + @Override + public ICircleOptions onCreateCircleOptions() { + return new HuaweiCircleOptions(); + } + + @Override + public String getMapsAppPackageName() { + return "com.huawei.maps.app"; + } + + @Override + public int getInstallMapsString() { + return R.string.InstallHuaweiMaps; + } + + public final static class HuaweiMapImpl implements IMap { + private HuaweiMap huaweiMap; + + private Map implToAbsMarkerMap = new HashMap<>(); + private Map implToAbsCircleMap = new HashMap<>(); + + private HuaweiMapImpl(HuaweiMap googleMap) { + this.huaweiMap = googleMap; + } + + @Override + public void setMapType(int mapType) { + switch (mapType) { + case MAP_TYPE_NORMAL: + huaweiMap.setMapType(HuaweiMap.MAP_TYPE_NORMAL); + break; + case MAP_TYPE_SATELLITE: + huaweiMap.setMapType(HuaweiMap.MAP_TYPE_SATELLITE); + break; + case MAP_TYPE_HYBRID: + huaweiMap.setMapType(HuaweiMap.MAP_TYPE_HYBRID); + break; + } + } + + @Override + public float getMaxZoomLevel() { + return huaweiMap.getMaxZoomLevel(); + } + + @SuppressLint("MissingPermission") + @Override + public void setMyLocationEnabled(boolean enabled) { + huaweiMap.setMyLocationEnabled(enabled); + } + + @Override + public IUISettings getUiSettings() { + return new HuaweiUISettings(huaweiMap.getUiSettings()); + } + + @Override + public void setOnCameraMoveStartedListener(OnCameraMoveStartedListener onCameraMoveStartedListener) { + huaweiMap.setOnCameraMoveStartedListener(reason -> { + int outReason; + switch (reason) { + default: + case HuaweiMap.OnCameraMoveStartedListener.REASON_GESTURE: + outReason = OnCameraMoveStartedListener.REASON_GESTURE; + break; + case HuaweiMap.OnCameraMoveStartedListener.REASON_API_ANIMATION: + outReason = OnCameraMoveStartedListener.REASON_API_ANIMATION; + break; + case HuaweiMap.OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION: + outReason = OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION; + break; + } + onCameraMoveStartedListener.onCameraMoveStarted(outReason); + }); + } + + @Override + public CameraPosition getCameraPosition() { + com.huawei.hms.maps.model.CameraPosition pos = huaweiMap.getCameraPosition(); + return new CameraPosition(new LatLng(pos.target.latitude, pos.target.longitude), pos.zoom); + } + + @Override + public void setOnMapLoadedCallback(Runnable callback) { + huaweiMap.setOnMapLoadedCallback(callback::run); + } + + @Override + public IProjection getProjection() { + return new HuaweiProjection(huaweiMap.getProjection()); + } + + @Override + public void setPadding(int left, int top, int right, int bottom) { + huaweiMap.setPadding(left, top, right, bottom); + } + + @Override + public void setMapStyle(IMapStyleOptions style) { + huaweiMap.setMapStyle(style == null ? null : ((HuaweiMapStyleOptions) style).mapStyleOptions); + } + + @Override + public IMarker addMarker(IMarkerOptions markerOptions) { + Marker impl = huaweiMap.addMarker(((HuaweiMarkerOptions) markerOptions).markerOptions); + HuaweiMarker abs = new HuaweiMarker(impl); + implToAbsMarkerMap.put(impl, abs); + return abs; + } + + @Override + public ICircle addCircle(ICircleOptions circleOptions) { + Circle impl = huaweiMap.addCircle(((HuaweiCircleOptions) circleOptions).circleOptions); + HuaweiCircle abs = new HuaweiCircle(impl); + implToAbsCircleMap.put(impl, abs); + return abs; + } + + @Override + public void setOnMyLocationChangeListener(Consumer callback) {} + + @Override + public void setOnMarkerClickListener(OnMarkerClickListener markerClickListener) { + huaweiMap.setOnMarkerClickListener(marker -> { + HuaweiMarker abs = implToAbsMarkerMap.get(marker); + if (abs == null) { + abs = new HuaweiMarker(marker); + implToAbsMarkerMap.put(marker, abs); + } + return markerClickListener.onClick(abs); + }); + } + + @Override + public void setOnCameraMoveListener(Runnable callback) { + huaweiMap.setOnCameraMoveListener(callback::run); + } + + @Override + public void animateCamera(ICameraUpdate update) { + huaweiMap.animateCamera(((HuaweiCameraUpdate) update).cameraUpdate); + } + + @Override + public void animateCamera(ICameraUpdate update, ICancelableCallback callback) { + huaweiMap.animateCamera(((HuaweiCameraUpdate) update).cameraUpdate, callback == null ? null : new HuaweiMap.CancelableCallback() { + @Override + public void onFinish() { + callback.onFinish(); + } + + @Override + public void onCancel() { + callback.onCancel(); + } + }); + } + + @Override + public void animateCamera(ICameraUpdate update, int duration, ICancelableCallback callback) { + huaweiMap.animateCamera(((HuaweiCameraUpdate) update).cameraUpdate, duration, callback == null ? null : new HuaweiMap.CancelableCallback() { + @Override + public void onFinish() { + callback.onFinish(); + } + + @Override + public void onCancel() { + callback.onCancel(); + } + }); + } + + @Override + public void moveCamera(ICameraUpdate update) { + huaweiMap.moveCamera(((HuaweiCameraUpdate) update).cameraUpdate); + } + + public final class HuaweiMarker implements IMarker { + private Marker marker; + + private HuaweiMarker(Marker marker) { + this.marker = marker; + } + + @Override + public Object getTag() { + return marker.getTag(); + } + + @Override + public void setTag(Object tag) { + marker.setTag(tag); + } + + @Override + public LatLng getPosition() { + com.huawei.hms.maps.model.LatLng latLng = marker.getPosition(); + return new LatLng(latLng.latitude, latLng.longitude); + } + + @Override + public void setPosition(LatLng latLng) { + marker.setPosition(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + } + + @Override + public void setRotation(int rotation) { + marker.setRotation(rotation); + } + + @Override + public void setIcon(Bitmap bitmap) { + marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap)); + } + + @Override + public void setIcon(int resId) { + marker.setIcon(BitmapDescriptorFactory.fromResource(resId)); + } + + @Override + public void remove() { + marker.remove(); + implToAbsMarkerMap.remove(marker); + } + } + + public final class HuaweiCircle implements ICircle { + private Circle circle; + + private HuaweiCircle(Circle circle) { + this.circle = circle; + } + + @Override + public void setStrokeColor(int color) { + circle.setStrokeColor(color); + } + + @Override + public void setFillColor(int color) { + circle.setFillColor(color); + } + + @Override + public void setRadius(double radius) { + circle.setRadius(radius); + } + + @Override + public double getRadius() { + return circle.getRadius(); + } + + @Override + public void setCenter(LatLng latLng) { + circle.setCenter(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + } + + @Override + public void remove() { + circle.remove(); + implToAbsCircleMap.remove(circle); + } + } + } + + public final static class HuaweiProjection implements IProjection { + private Projection projection; + + private HuaweiProjection(Projection projection) { + this.projection = projection; + } + + @Override + public Point toScreenLocation(LatLng latLng) { + return projection.toScreenLocation(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + } + } + + public final static class HuaweiUISettings implements IUISettings { + private UiSettings uiSettings; + + private HuaweiUISettings(UiSettings settings) { + uiSettings = settings; + } + + @Override + public void setMyLocationButtonEnabled(boolean enabled) { + uiSettings.setMyLocationButtonEnabled(enabled); + } + + @Override + public void setZoomControlsEnabled(boolean enabled) { + uiSettings.setZoomControlsEnabled(enabled); + } + + @Override + public void setCompassEnabled(boolean enabled) { + uiSettings.setCompassEnabled(enabled); + } + } + + public final static class HuaweiCircleOptions implements ICircleOptions { + private CircleOptions circleOptions; + + private HuaweiCircleOptions() { + circleOptions = new CircleOptions(); + } + + @Override + public ICircleOptions center(LatLng latLng) { + circleOptions.center(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + return this; + } + + @Override + public ICircleOptions radius(double radius) { + circleOptions.radius(radius); + return this; + } + + @Override + public ICircleOptions strokeColor(int color) { + circleOptions.strokeColor(color); + return this; + } + + @Override + public ICircleOptions fillColor(int color) { + circleOptions.fillColor(color); + return this; + } + + @Override + public ICircleOptions strokePattern(List patternItems) { + List pattern = new ArrayList<>(); + for (PatternItem item : patternItems) { + if (item instanceof PatternItem.Gap) { + pattern.add(new Gap(((PatternItem.Gap) item).length)); + } else if (item instanceof PatternItem.Dash) { + pattern.add(new Dash(((PatternItem.Dash) item).length)); + } + } + circleOptions.strokePattern(pattern); + return this; + } + + @Override + public ICircleOptions strokeWidth(int width) { + circleOptions.strokeWidth(width); + return this; + } + } + + public final static class HuaweiMarkerOptions implements IMarkerOptions { + private MarkerOptions markerOptions; + + private HuaweiMarkerOptions() { + this.markerOptions = new MarkerOptions(); + } + + @Override + public IMarkerOptions position(LatLng latLng) { + markerOptions.position(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + return this; + } + + @Override + public IMarkerOptions icon(Bitmap bitmap) { + markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); + return this; + } + + @Override + public IMarkerOptions icon(int resId) { + markerOptions.icon(BitmapDescriptorFactory.fromResource(resId)); + return this; + } + + @Override + public IMarkerOptions anchor(float lat, float lng) { + markerOptions.anchor(lat, lng); + return this; + } + + @Override + public IMarkerOptions title(String title) { + markerOptions.title(title); + return this; + } + + @Override + public IMarkerOptions snippet(String snippet) { + markerOptions.snippet(snippet); + return this; + } + + @Override + public IMarkerOptions flat(boolean flat) { + markerOptions.flat(flat); + return this; + } + } + + public final static class HuaweiLatLngBoundsBuilder implements ILatLngBoundsBuilder { + private LatLngBounds.Builder builder; + + private HuaweiLatLngBoundsBuilder() { + builder = new LatLngBounds.Builder(); + } + + @Override + public ILatLngBoundsBuilder include(LatLng latLng) { + builder.include(new com.huawei.hms.maps.model.LatLng(latLng.latitude, latLng.longitude)); + return this; + } + + @Override + public ILatLngBounds build() { + return new HuaweiLatLngBounds(builder.build()); + } + } + + public final static class HuaweiLatLngBounds implements ILatLngBounds { + private LatLngBounds bounds; + + private HuaweiLatLngBounds(LatLngBounds bounds) { + this.bounds = bounds; + } + + @Override + public LatLng getCenter() { + com.huawei.hms.maps.model.LatLng latLng = bounds.getCenter(); + return new LatLng(latLng.latitude, latLng.longitude); + } + } + + public final static class HuaweiMapView implements IMapView { + private MapView mapView; + + private ITouchInterceptor dispatchInterceptor; + private ITouchInterceptor interceptInterceptor; + private Runnable onLayoutListener; + + private HuaweiMapView(Context context) { + mapView = new MapView(context) { + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (dispatchInterceptor != null) { + return dispatchInterceptor.onInterceptTouchEvent(ev, super::dispatchTouchEvent); + } + return super.dispatchTouchEvent(ev); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (interceptInterceptor != null) { + return interceptInterceptor.onInterceptTouchEvent(ev, super::onInterceptTouchEvent); + } + return super.onInterceptTouchEvent(ev); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (onLayoutListener != null) { + onLayoutListener.run(); + } + } + }; + } + + @Override + public void setOnDispatchTouchEventInterceptor(ITouchInterceptor touchInterceptor) { + dispatchInterceptor = touchInterceptor; + } + + @Override + public void setOnInterceptTouchEventInterceptor(ITouchInterceptor touchInterceptor) { + interceptInterceptor = touchInterceptor; + } + + @Override + public void setOnLayoutListener(Runnable callback) { + onLayoutListener = callback; + } + + @Override + public View getView() { + return mapView; + } + + @Override + public void getMapAsync(Consumer callback) { + mapView.getMapAsync(googleMap -> callback.accept(new HuaweiMapImpl(googleMap))); + } + + @Override + public void onPause() { + mapView.onPause(); + } + + @Override + public void onResume() { + mapView.onResume(); + } + + @Override + public void onCreate(Bundle savedInstance) { + mapView.onCreate(savedInstance); + } + + @Override + public void onDestroy() { + mapView.onDestroy(); + } + + @Override + public void onLowMemory() { + mapView.onLowMemory(); + } + } + + public final static class HuaweiCameraUpdate implements ICameraUpdate { + private CameraUpdate cameraUpdate; + + private HuaweiCameraUpdate(CameraUpdate update) { + this.cameraUpdate = update; + } + } + + public final static class HuaweiMapStyleOptions implements IMapStyleOptions { + private MapStyleOptions mapStyleOptions; + + private HuaweiMapStyleOptions(MapStyleOptions mapStyleOptions) { + this.mapStyleOptions = mapStyleOptions; + } + } +} diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiPushListenerProvider.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiPushListenerProvider.java new file mode 100644 index 000000000..ee895e494 --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiPushListenerProvider.java @@ -0,0 +1,66 @@ +package org.telegram.messenger; + +import android.content.pm.PackageManager; +import android.os.SystemClock; +import android.text.TextUtils; + +import com.huawei.hms.aaid.HmsInstanceId; +import com.huawei.hms.common.ApiException; + +public class HuaweiPushListenerProvider implements PushListenerController.IPushListenerServiceProvider { + public final static HuaweiPushListenerProvider INSTANCE = new HuaweiPushListenerProvider(); + + private Boolean hasServices; + + private HuaweiPushListenerProvider() {} + + @Override + public boolean hasServices() { + if (hasServices == null) { + try { + ApplicationLoader.applicationContext.getPackageManager().getPackageInfo("com.huawei.hwid", 0); + hasServices = true; + } catch (PackageManager.NameNotFoundException ignored) { + hasServices = false; + } catch (Exception e) { + FileLog.e(e); + hasServices = false; + } + } + return hasServices; + } + + @Override + public String getLogTitle() { + return "HMS Core"; + } + + @Override + public void onRequestPushToken() { + Utilities.globalQueue.postRunnable(() -> { + try { + String token = HmsInstanceId.getInstance(ApplicationLoader.applicationContext).getToken(BuildVars.HUAWEI_APP_ID, "HCM"); + SharedConfig.pushStringGetTimeEnd = SystemClock.elapsedRealtime(); + + if (!TextUtils.isEmpty(token)) { + PushListenerController.sendRegistrationToServer(getPushType(), token); + } + } catch (ApiException e) { + FileLog.e(e); + + SharedConfig.pushStringGetTimeEnd = SystemClock.elapsedRealtime(); + + if (BuildVars.LOGS_ENABLED) { + FileLog.d("Failed to get regid"); + } + SharedConfig.pushStringStatus = "__HUAWEI_FAILED__"; + PushListenerController.sendRegistrationToServer(getPushType(), null); + } + }); + } + + @Override + public int getPushType() { + return PushListenerController.PUSH_TYPE_HUAWEI; + } +} diff --git a/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiPushListenerService.java b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiPushListenerService.java new file mode 100644 index 000000000..90ae18b4a --- /dev/null +++ b/TMessagesProj_AppHuawei/src/main/java/org/telegram/messenger/HuaweiPushListenerService.java @@ -0,0 +1,34 @@ +package org.telegram.messenger; + +import com.huawei.hms.push.HmsMessageService; +import com.huawei.hms.push.RemoteMessage; + +import java.util.Map; + +public class HuaweiPushListenerService extends HmsMessageService { + @Override + public void onMessageReceived(RemoteMessage remoteMessage) { + Utilities.globalQueue.postRunnable(() -> { + String from = remoteMessage.getFrom(); + String data = remoteMessage.getData(); + long time = remoteMessage.getSentTime(); + + if (BuildVars.LOGS_ENABLED) { + FileLog.d("HCM received data: " + data + " from: " + from); + } + + PushListenerController.processRemoteMessage(PushListenerController.PUSH_TYPE_HUAWEI, data, time); + }); + } + + @Override + public void onNewToken(String token) { + AndroidUtilities.runOnUIThread(() -> { + if (BuildVars.LOGS_ENABLED) { + FileLog.d("Refreshed HCM token: " + token); + } + ApplicationLoader.postInitApplication(); + PushListenerController.sendRegistrationToServer(PushListenerController.PUSH_TYPE_HUAWEI, token); + }); + } +} diff --git a/build.gradle b/build.gradle index 7dd3a03d7..a92fb55dd 100644 --- a/build.gradle +++ b/build.gradle @@ -3,10 +3,12 @@ buildscript { repositories { mavenCentral() google() + maven { url 'https://developer.huawei.com/repo/' } } dependencies { classpath 'com.android.tools.build:gradle:7.0.3' classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.huawei.agconnect:agcp:1.6.0.300' } } repositories { diff --git a/gradle.properties b/gradle.properties index 8b5e603fe..29f7e68e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,10 @@ # This option should only be used with decoupled projects. More details, visit # 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_NAME=8.9.0 +APP_VERSION_CODE=2751 +APP_PACKAGE=org.telegram.messenger RELEASE_KEY_PASSWORD=android RELEASE_KEY_ALIAS=androidkey RELEASE_STORE_PASSWORD=android @@ -21,3 +25,4 @@ org.gradle.parallel=true org.gradle.configureondemand=false android.useAndroidX=true android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 867a4183d..93d1f4b8e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,3 @@ include ':TMessagesProj' +include ':TMessagesProj_App' +include ':TMessagesProj_AppHuawei'