diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index ad4fa662..ab347d7c 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -18,7 +18,7 @@ tasks.withType(JavaCompile) { dependencies { compile 'com.android.support:support-v4:19.0.+' - compile 'com.google.android.gms:play-services:4.1.+' + compile 'com.google.android.gms:play-services:3.2.+' compile 'net.hockeyapp.android:HockeySDK:3.0.1' compile 'com.googlecode.mp4parser:isoparser:1.0.+' } @@ -83,7 +83,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 19 - versionCode 288 - versionName "1.6.1" + versionCode 307 + versionName "1.7.0" } } diff --git a/TMessagesProj/config/debug/AndroidManifest.xml b/TMessagesProj/config/debug/AndroidManifest.xml index 6a08d6c1..dc448b5f 100644 --- a/TMessagesProj/config/debug/AndroidManifest.xml +++ b/TMessagesProj/config/debug/AndroidManifest.xml @@ -28,7 +28,6 @@ android:largeHeap="true"> - diff --git a/TMessagesProj/config/release/AndroidManifest.xml b/TMessagesProj/config/release/AndroidManifest.xml index a1ee70d3..46361638 100644 --- a/TMessagesProj/config/release/AndroidManifest.xml +++ b/TMessagesProj/config/release/AndroidManifest.xml @@ -28,7 +28,6 @@ android:largeHeap="true"> - diff --git a/TMessagesProj/jni/Android.mk b/TMessagesProj/jni/Android.mk index 33857ab9..1a148166 100755 --- a/TMessagesProj/jni/Android.mk +++ b/TMessagesProj/jni/Android.mk @@ -8,6 +8,7 @@ LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT LOCAL_CPPFLAGS := -DBSD=1 -ffast-math -O2 -funroll-loops #LOCAL_LDLIBS := -llog +LOCAL_LDLIBS := -ljnigraphics LOCAL_SRC_FILES := \ ./opus/src/opus.c \ diff --git a/TMessagesProj/jni/fake.c b/TMessagesProj/jni/fake.c index 95b86f6f..b484b63f 100644 --- a/TMessagesProj/jni/fake.c +++ b/TMessagesProj/jni/fake.c @@ -2,5 +2,5 @@ void fakeFunction() { printf("some androids has buggy native loader, so i should check size of libs in java to know that native library is correct. So each changed native library should has diffrent size in different app versions. This function will increase lib size for few bytes :)"); - printf("bla blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla"); + printf("bla blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla"); } diff --git a/TMessagesProj/jni/gif.c b/TMessagesProj/jni/gif.c index b7881194..06b7a628 100644 --- a/TMessagesProj/jni/gif.c +++ b/TMessagesProj/jni/gif.c @@ -1,4 +1,4 @@ -//tanks to https://github.com/koral--/android-gif-drawable +//thanks to https://github.com/koral--/android-gif-drawable /* MIT License Copyright (c) @@ -73,7 +73,7 @@ typedef struct { typedef struct { unsigned int duration; - short transpIndex; + int transpIndex; unsigned char disposalMethod; } FrameInfo; @@ -121,19 +121,20 @@ void gifOnJNIUnload(JavaVM *vm, void *reserved) { } static int fileReadFunc(GifFileType *gif, GifByteType *bytes, int size) { - FILE *file = (FILE *)gif->UserData; + FILE *file = (FILE *)gif->UserData; return fread(bytes, 1, size, file); } static int fileRewindFun(GifInfo *info) { - return fseek(info->gifFilePtr->UserData, info->startPos, SEEK_SET); + return fseek(info->gifFilePtr->UserData, info->startPos, SEEK_SET); } static unsigned long getRealTime() { struct timespec ts; const clockid_t id = CLOCK_MONOTONIC; - if (id != (clockid_t) - 1 && clock_gettime(id, &ts) != -1) - return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + if (id != (clockid_t) - 1 && clock_gettime(id, &ts) != -1) { + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + } return -1; } @@ -195,7 +196,7 @@ static void packARGB32(argb *pixel, GifByteType alpha, GifByteType red, GifByteT } static void getColorFromTable(int idx, argb *dst, const ColorMapObject *cmap) { - char colIdx = idx >= cmap->ColorCount ? 0 : idx; + int colIdx = (idx >= cmap->ColorCount) ? 0 : idx; GifColorType *col = &cmap->Colors[colIdx]; packARGB32(dst, 0xFF, col->Red, col->Green, col->Blue); } @@ -218,7 +219,7 @@ static inline bool setupBackupBmp(GifInfo *info, short transpIndex) { if (transpIndex == -1) { getColorFromTable(fGIF->SBackGroundColor, &paintingColor, fGIF->SColorMap); } else { - packARGB32(&paintingColor,0,0,0,0); + packARGB32(&paintingColor, 0, 0, 0, 0); } eraseColor(info->backupPtr, fGIF->SWidth, fGIF->SHeight, paintingColor); return true; @@ -231,14 +232,15 @@ static int readExtensions(int ExtFunction, GifByteType *ExtData, GifInfo *info) if (ExtFunction == GRAPHICS_EXT_FUNC_CODE && ExtData[0] == 4) { FrameInfo *fi = &info->infos[info->gifFilePtr->ImageCount]; fi->transpIndex = -1; - char *b = (char *)ExtData + 1; + char *b = (char*) ExtData + 1; short delay = ((b[2] << 8) | b[1]); fi->duration = delay > 1 ? delay * 10 : 100; fi->disposalMethod = ((b[0] >> 2) & 7); - if (ExtData[1] & 1) - fi->transpIndex = (short) b[3]; + if (ExtData[1] & 1) { + fi->transpIndex = 0xff & b[3]; + } if (fi->disposalMethod == 3 && info->backupPtr == NULL) { - if (!setupBackupBmp(info,fi->transpIndex)) { + if (!setupBackupBmp(info, fi->transpIndex)) { return GIF_ERROR; } } @@ -260,7 +262,7 @@ static int readExtensions(int ExtFunction, GifByteType *ExtData, GifInfo *info) return GIF_OK; } -static int DDGifSlurp(GifFileType *GifFile, GifInfo *info, bool shouldDecode) { +static int DDGifSlurp(GifFileType *GifFile, GifInfo* info, bool shouldDecode) { GifRecordType RecordType; GifByteType *ExtData; int codeSize; @@ -268,103 +270,109 @@ static int DDGifSlurp(GifFileType *GifFile, GifInfo *info, bool shouldDecode) { size_t ImageSize; do { if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { - return GIF_ERROR; + return (GIF_ERROR); } switch (RecordType) { - case IMAGE_DESC_RECORD_TYPE: { - if (DGifGetImageDesc(GifFile, !shouldDecode) == GIF_ERROR) { - return GIF_ERROR; - } - int i = shouldDecode ? info->currentIndex : GifFile->ImageCount - 1; - SavedImage *sp = &GifFile->SavedImages[i]; - ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; - - if (sp->ImageDesc.Width < 1 || sp->ImageDesc.Height < 1 || ImageSize > (SIZE_MAX / sizeof(GifPixelType))) { - GifFile->Error = D_GIF_ERR_INVALID_IMG_DIMS; - return GIF_ERROR; - } - if (sp->ImageDesc.Width > GifFile->SWidth || sp->ImageDesc.Height > GifFile->SHeight) { - GifFile->Error = D_GIF_ERR_IMG_NOT_CONFINED; - return GIF_ERROR; - } - if (shouldDecode) { - sp->RasterBits = info->rasterBits; - if (sp->ImageDesc.Interlace) { - int i, j; - int InterlacedOffset[] = { 0, 4, 2, 1 }; - int InterlacedJumps[] = { 8, 8, 4, 2 }; - for (i = 0; i < 4; i++) { - for (j = InterlacedOffset[i]; j < sp->ImageDesc.Height; j += InterlacedJumps[i]) { - if (DGifGetLine(GifFile, sp->RasterBits + j * sp->ImageDesc.Width, sp->ImageDesc.Width) == GIF_ERROR) { - return GIF_ERROR; - } + case IMAGE_DESC_RECORD_TYPE: + + if (DGifGetImageDesc(GifFile, !shouldDecode) == GIF_ERROR) { + return (GIF_ERROR); + } + int i = shouldDecode ? info->currentIndex : GifFile->ImageCount - 1; + SavedImage *sp = &GifFile->SavedImages[i]; + ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; + + if (sp->ImageDesc.Width < 1 || sp->ImageDesc.Height < 1 || ImageSize > (SIZE_MAX / sizeof(GifPixelType))) { + GifFile->Error = D_GIF_ERR_INVALID_IMG_DIMS; + return GIF_ERROR; + } + if (sp->ImageDesc.Width > GifFile->SWidth || sp->ImageDesc.Height > GifFile->SHeight) { + GifFile->Error = D_GIF_ERR_IMG_NOT_CONFINED; + return GIF_ERROR; + } + if (shouldDecode) { + sp->RasterBits = info->rasterBits; + if (sp->ImageDesc.Interlace) { + int i, j; + int InterlacedOffset[] = { 0, 4, 2, 1 }; + int InterlacedJumps[] = { 8, 8, 4, 2 }; + for (i = 0; i < 4; i++) { + for (j = InterlacedOffset[i]; j < sp->ImageDesc.Height; j += InterlacedJumps[i]) { + if (DGifGetLine(GifFile, sp->RasterBits + j * sp->ImageDesc.Width, sp->ImageDesc.Width) == GIF_ERROR) { + return GIF_ERROR; } } - } else { - if (DGifGetLine(GifFile, sp->RasterBits, ImageSize) == GIF_ERROR) { - return GIF_ERROR; - } } - if (info->currentIndex >= GifFile->ImageCount - 1) { - if (info->loopCount > 0) + } else { + if (DGifGetLine(GifFile, sp->RasterBits, ImageSize) == GIF_ERROR) { + return (GIF_ERROR); + } + } + if (info->currentIndex >= GifFile->ImageCount - 1) { + if (info->loopCount > 0) { info->currentLoop++; - if (fileRewindFun(info) != 0) { - info->gifFilePtr->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - } - return GIF_OK; - } else { - if (DGifGetCode(GifFile, &codeSize, &ExtData) == GIF_ERROR) { - return GIF_ERROR; - } - while (ExtData) { - if (DGifGetCodeNext(GifFile, &ExtData) == GIF_ERROR) { - return GIF_ERROR; - } } + if (fileRewindFun(info) != 0) { + info->gifFilePtr->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } + return GIF_OK; + } else { + if (DGifGetCode(GifFile, &codeSize, &ExtData) == GIF_ERROR) { + return (GIF_ERROR); } - break; + while (ExtData != NULL) { + if (DGifGetCodeNext(GifFile, &ExtData) == GIF_ERROR) { + return (GIF_ERROR); + } + } + } + break; + + case EXTENSION_RECORD_TYPE: + if (DGifGetExtension(GifFile, &ExtFunction, &ExtData) == GIF_ERROR) { + return (GIF_ERROR); } - case EXTENSION_RECORD_TYPE: { - if (DGifGetExtension(GifFile, &ExtFunction, &ExtData) == GIF_ERROR) { + if (!shouldDecode) { + FrameInfo *tmpInfos = realloc(info->infos, (GifFile->ImageCount + 1) * sizeof(FrameInfo)); + if (tmpInfos == NULL) { return GIF_ERROR; } + info->infos = tmpInfos; + if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR) { + return GIF_ERROR; + } + } + while (ExtData != NULL) { + if (DGifGetExtensionNext(GifFile, &ExtData, &ExtFunction) == GIF_ERROR) { + return (GIF_ERROR); + } + if (!shouldDecode) { + if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR) { + return GIF_ERROR; + } + } + } + break; - if (!shouldDecode) { - info->infos = realloc(info->infos, (GifFile->ImageCount + 1) * sizeof(FrameInfo)); - if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR) { - return GIF_ERROR; - } - } - while (ExtData) { - if (DGifGetExtensionNext(GifFile, &ExtData, &ExtFunction) == GIF_ERROR) { - return GIF_ERROR; - } - if (!shouldDecode) { - if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR) { - return GIF_ERROR; - } - } - } - break; - } case TERMINATE_RECORD_TYPE: + break; + default: break; } } while (RecordType != TERMINATE_RECORD_TYPE); - bool ok = true; if (shouldDecode) { ok = (fileRewindFun(info) == 0); } if (ok) { - return GIF_OK; + return (GIF_OK); } else { info->gifFilePtr->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; + return (GIF_ERROR); } } @@ -381,7 +389,7 @@ static argb *getAddr(argb *bm, int width, int left, int top) { } static void blitNormal(argb *bm, int width, int height, const SavedImage *frame, const ColorMapObject *cmap, int transparent) { - const unsigned char *src = (unsigned char *)frame->RasterBits; + const unsigned char* src = (unsigned char*) frame->RasterBits; argb *dst = getAddr(bm, width, frame->ImageDesc.Left, frame->ImageDesc.Top); GifWord copyWidth = frame->ImageDesc.Width; if (frame->ImageDesc.Left + copyWidth > width) { @@ -393,9 +401,6 @@ static void blitNormal(argb *bm, int width, int height, const SavedImage *frame, copyHeight = height - frame->ImageDesc.Top; } - int srcPad, dstPad; - dstPad = width - copyWidth; - srcPad = frame->ImageDesc.Width - copyWidth; for (; copyHeight > 0; copyHeight--) { copyLine(dst, src, cmap, transparent, copyWidth); src += frame->ImageDesc.Width; @@ -404,7 +409,7 @@ static void blitNormal(argb *bm, int width, int height, const SavedImage *frame, } static void fillRect(argb *bm, int bmWidth, int bmHeight, GifWord left, GifWord top, GifWord width, GifWord height, argb col) { - uint32_t *dst = (uint32_t *)getAddr(bm, bmWidth, left, top); + uint32_t* dst = (uint32_t*) getAddr(bm, bmWidth, left, top); GifWord copyWidth = width; if (left + copyWidth > bmWidth) { copyWidth = bmWidth - left; @@ -414,7 +419,7 @@ static void fillRect(argb *bm, int bmWidth, int bmHeight, GifWord left, GifWord if (top + copyHeight > bmHeight) { copyHeight = bmHeight - top; } - uint32_t *pColor = (uint32_t *)(&col); + uint32_t* pColor = (uint32_t *) (&col); for (; copyHeight > 0; copyHeight--) { memset(dst, *pColor, copyWidth * sizeof(argb)); dst += bmWidth; @@ -424,12 +429,11 @@ static void fillRect(argb *bm, int bmWidth, int bmHeight, GifWord left, GifWord static void drawFrame(argb *bm, int bmWidth, int bmHeight, const SavedImage *frame, const ColorMapObject *cmap, short transpIndex) { if (frame->ImageDesc.ColorMap != NULL) { cmap = frame->ImageDesc.ColorMap; - if (cmap == NULL || cmap->ColorCount != (1 << cmap->BitsPerPixel)) { + if (cmap->ColorCount != (1 << cmap->BitsPerPixel)) { cmap = defaultCmap; } } - - blitNormal(bm, bmWidth, bmHeight, frame, cmap, (int) transpIndex); + blitNormal(bm, bmWidth, bmHeight, frame, cmap, transpIndex); } static bool checkIfCover(const SavedImage *target, const SavedImage *covered) { @@ -445,30 +449,28 @@ static bool checkIfCover(const SavedImage *target, const SavedImage *covered) { } static inline void disposeFrameIfNeeded(argb *bm, GifInfo *info, unsigned int idx) { - argb *backup = info->backupPtr; + argb* backup = info->backupPtr; argb color; packARGB32(&color, 0, 0, 0, 0); GifFileType *fGif = info->gifFilePtr; - SavedImage *cur = &fGif->SavedImages[idx - 1]; - SavedImage *next = &fGif->SavedImages[idx]; + SavedImage* cur = &fGif->SavedImages[idx - 1]; + SavedImage* next = &fGif->SavedImages[idx]; bool curTrans = info->infos[idx - 1].transpIndex != -1; int curDisposal = info->infos[idx - 1].disposalMethod; bool nextTrans = info->infos[idx].transpIndex != -1; int nextDisposal = info->infos[idx].disposalMethod; - argb *tmp; if ((curDisposal == 2 || curDisposal == 3) && (nextTrans || !checkIfCover(next, cur))) { switch (curDisposal) { - case 2: { - fillRect(bm, fGif->SWidth, fGif->SHeight, cur->ImageDesc.Left, cur->ImageDesc.Top, cur->ImageDesc.Width, cur->ImageDesc.Height, color); - } + case 2: + + fillRect(bm, fGif->SWidth, fGif->SHeight, cur->ImageDesc.Left, cur->ImageDesc.Top, cur->ImageDesc.Width, cur->ImageDesc.Height, color); break; - case 3: { - tmp = bm; - bm = backup; - backup = tmp; - } + case 3: + tmp = bm; + bm = backup; + backup = tmp; break; } } @@ -478,27 +480,25 @@ static inline void disposeFrameIfNeeded(argb *bm, GifInfo *info, unsigned int id } } -static jboolean reset(GifInfo *info) { +static void reset(GifInfo *info) { if (fileRewindFun(info) != 0) { - return JNI_FALSE; + return; } info->nextStartTime = 0; info->currentLoop = -1; info->currentIndex = -1; - return JNI_TRUE; } static void getBitmap(argb *bm, GifInfo *info) { - GifFileType *fGIF = info->gifFilePtr; + GifFileType* fGIF = info->gifFilePtr; argb paintingColor; int i = info->currentIndex; if (DDGifSlurp(fGIF, info, true) == GIF_ERROR) { - return; //TODO add leniency support + return; } - SavedImage *cur = &fGIF->SavedImages[i]; - - short transpIndex = info->infos[i].transpIndex; + SavedImage* cur = &fGIF->SavedImages[i]; + int transpIndex = info->infos[i].transpIndex; if (i == 0) { if (transpIndex == -1) { getColorFromTable(fGIF->SBackGroundColor, &paintingColor, fGIF->SColorMap); @@ -513,11 +513,14 @@ static void getBitmap(argb *bm, GifInfo *info) { } static void setMetaData(int width, int height, int ImageCount, int errorCode, JNIEnv *env, jintArray metaData) { - jint *ints = (*env)->GetIntArrayElements(env, metaData, 0); - *ints++ = width; - *ints++ = height; - *ints++ = ImageCount; - *ints = errorCode; + jint *const ints = (*env)->GetIntArrayElements(env, metaData, 0); + if (ints == NULL) { + return; + } + ints[0] = width; + ints[1] = height; + ints[2] = ImageCount; + ints[3] = errorCode; (*env)->ReleaseIntArrayElements(env, metaData, ints, 0); } @@ -554,9 +557,6 @@ static jint open(GifFileType *GifFileIn, int Error, int startPos, JNIEnv *env, j info->speedFactor = 1.0; info->rasterBits = calloc(GifFileIn->SHeight * GifFileIn->SWidth, sizeof(GifPixelType)); info->infos = malloc(sizeof(FrameInfo)); - info->infos->duration = 0; - info->infos->disposalMethod = 0; - info->infos->transpIndex = -1; info->backupPtr = NULL; if (info->rasterBits == NULL || info->infos == NULL) { @@ -564,15 +564,18 @@ static jint open(GifFileType *GifFileIn, int Error, int startPos, JNIEnv *env, j setMetaData(width, height, 0, D_GIF_ERR_NOT_ENOUGH_MEM, env, metaData); return (jint) NULL; } - - if (DDGifSlurp(GifFileIn, info, false) == GIF_ERROR) { - Error = GifFileIn->Error; - } + info->infos->duration = 0; + info->infos->disposalMethod = 0; + info->infos->transpIndex = -1; if (GifFileIn->SColorMap == NULL || GifFileIn->SColorMap->ColorCount != (1 << GifFileIn->SColorMap->BitsPerPixel)) { GifFreeMapObject(GifFileIn->SColorMap); GifFileIn->SColorMap = defaultCmap; } + + DDGifSlurp(GifFileIn, info, false); + int imgCount = GifFileIn->ImageCount; + if (imgCount < 1) { Error = D_GIF_ERR_NO_FRAMES; } @@ -583,7 +586,6 @@ static jint open(GifFileType *GifFileIn, int Error, int startPos, JNIEnv *env, j cleanUp(info); } setMetaData(width, height, imgCount, Error, env, metaData); - return (jint)(Error == 0 ? info : NULL); } @@ -600,12 +602,12 @@ JNIEXPORT jlong JNICALL Java_org_telegram_ui_Views_GifDrawable_getAllocationByte return sum; } -JNIEXPORT jboolean JNICALL Java_org_telegram_ui_Views_GifDrawable_reset(JNIEnv *env, jclass class, jobject gifInfo) { +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_reset(JNIEnv *env, jclass class, jobject gifInfo) { GifInfo *info = (GifInfo *)gifInfo; if (info == NULL) { - return JNI_FALSE; + return; } - return reset(info); + reset(info); } JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_setSpeedFactor(JNIEnv *env, jclass class, jobject gifInfo, jfloat factor) { @@ -618,7 +620,7 @@ JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_setSpeedFactor(JNI JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToTime(JNIEnv *env, jclass class, jobject gifInfo, jint desiredPos, jintArray jPixels) { GifInfo *info = (GifInfo *)gifInfo; - if (info == NULL) { + if (info == NULL || jPixels == NULL) { return; } int imgCount = info->gifFilePtr->ImageCount; @@ -643,25 +645,29 @@ JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToTime(JNIEnv if (i == imgCount - 1 && lastFrameRemainder > info->infos[i].duration) { lastFrameRemainder = info->infos[i].duration; } - info->lastFrameReaminder = lastFrameRemainder; if (i > info->currentIndex) { - jint *pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + jint *const pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + if (pixels == NULL) { + return; + } while (info->currentIndex <= i) { info->currentIndex++; - getBitmap((argb *)pixels, info); + getBitmap((argb*) pixels, info); } (*env)->ReleaseIntArrayElements(env, jPixels, pixels, 0); } + info->lastFrameReaminder = lastFrameRemainder; + if (info->speedFactor == 1.0) { info->nextStartTime = getRealTime() + lastFrameRemainder; - } else { + } else { info->nextStartTime = getRealTime() + lastFrameRemainder * info->speedFactor; } } JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToFrame(JNIEnv *env, jclass class, jobject gifInfo, jint desiredIdx, jintArray jPixels) { GifInfo *info = (GifInfo *)gifInfo; - if (info == NULL) { + if (info == NULL|| jPixels==NULL) { return; } if (desiredIdx <= info->currentIndex) { @@ -673,15 +679,19 @@ JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToFrame(JNIEnv return; } + jint *const pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + if (pixels == NULL) { + return; + } + + info->lastFrameReaminder = 0; if (desiredIdx >= imgCount) { desiredIdx = imgCount - 1; } - info->lastFrameReaminder = 0; - jint *pixels = (*env)->GetIntArrayElements(env, jPixels, 0); while (info->currentIndex < desiredIdx) { info->currentIndex++; - getBitmap((argb *)pixels, info); + getBitmap((argb *) pixels, info); } (*env)->ReleaseIntArrayElements(env, jPixels, pixels, 0); if (info->speedFactor == 1.0) { @@ -689,16 +699,13 @@ JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToFrame(JNIEnv } else { info->nextStartTime = getRealTime() + info->infos[info->currentIndex].duration * info->speedFactor; } - } JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_renderFrame(JNIEnv *env, jclass class, jintArray jPixels, jobject gifInfo, jintArray metaData) { - GifInfo *info = (GifInfo *)gifInfo; - if (info == NULL) { + if (info == NULL || jPixels == NULL) { return; } - bool needRedraw = false; unsigned long rt = getRealTime(); @@ -708,24 +715,40 @@ JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_renderFrame(JNIEnv } needRedraw = true; } - jint *rawMetaData = (*env)->GetIntArrayElements(env, metaData, 0); + jint *const rawMetaData = (*env)->GetIntArrayElements(env, metaData, 0); + if (rawMetaData == NULL) { + return; + } - if (needRedraw) { - jint *pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + if (needRedraw) { + jint *const pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + if (pixels == NULL) { + (*env)->ReleaseIntArrayElements(env, metaData, rawMetaData, 0); + return; + } getBitmap((argb *)pixels, info); rawMetaData[3] = info->gifFilePtr->Error; (*env)->ReleaseIntArrayElements(env, jPixels, pixels, 0); - - int scaledDuration = info->infos[info->currentIndex].duration; + unsigned int scaledDuration = info->infos[info->currentIndex].duration; if (info->speedFactor != 1.0) { - scaledDuration /= info->speedFactor; - } + scaledDuration /= info->speedFactor; + if (scaledDuration<=0) { + scaledDuration=1; + } else if (scaledDuration > INT_MAX) { + scaledDuration = INT_MAX; + } + } info->nextStartTime = rt + scaledDuration; rawMetaData[4] = scaledDuration; } else { - rawMetaData[4] = (int) (rt - info->nextStartTime); - } + long delay = info->nextStartTime-rt; + if (delay < 0) { + rawMetaData[4] = -1; + } else { + rawMetaData[4] = (int) delay; + } + } (*env)->ReleaseIntArrayElements(env, metaData, rawMetaData, 0); } @@ -794,9 +817,6 @@ JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_saveRemainder(JNIE return; } info->lastFrameReaminder = getRealTime() - info->nextStartTime; - if (info->lastFrameReaminder > 0) { - info->lastFrameReaminder = 0; - } } JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_restoreRemainder(JNIEnv *env, jclass class, jobject gifInfo) { @@ -814,7 +834,7 @@ JNIEXPORT jint JNICALL Java_org_telegram_ui_Views_GifDrawable_openFile(JNIEnv *e return (jint) NULL; } - const char *fname = (*env)->GetStringUTFChars(env, jfname, 0); + const char *const fname = (*env)->GetStringUTFChars(env, jfname, 0); FILE *file = fopen(fname, "rb"); (*env)->ReleaseStringUTFChars(env, jfname, fname); if (file == NULL) { diff --git a/TMessagesProj/jni/image.c b/TMessagesProj/jni/image.c index 1482314d..ef63bfbf 100644 --- a/TMessagesProj/jni/image.c +++ b/TMessagesProj/jni/image.c @@ -2,8 +2,101 @@ #include #include #include +#include #include "utils.h" +static inline uint64_t get_colors (const uint8_t *p) { + return p[0] + (p[1] << 16) + ((uint64_t)p[2] << 32); +} + +static void fastBlur(int imageWidth, int imageHeight, int imageStride, void *pixels) { + uint8_t *pix = (uint8_t *)pixels; + const int w = imageWidth; + const int h = imageHeight; + const int stride = imageStride; + const int radius = 3; + const int r1 = radius + 1; + const int div = radius * 2 + 1; + + if (radius > 15 || div >= w || div >= h) { + return; + } + + uint64_t rgb[imageStride * imageHeight]; + + int x, y, i; + + int yw = 0; + const int we = w - r1; + for (y = 0; y < h; y++) { + uint64_t cur = get_colors (&pix[yw]); + uint64_t rgballsum = -radius * cur; + uint64_t rgbsum = cur * ((r1 * (r1 + 1)) >> 1); + + for (i = 1; i <= radius; i++) { + uint64_t cur = get_colors (&pix[yw + i * 4]); + rgbsum += cur * (r1 - i); + rgballsum += cur; + } + + x = 0; + + #define update(start, middle, end) \ + rgb[y * w + x] = (rgbsum >> 4) & 0x00FF00FF00FF00FFLL; \ + rgballsum += get_colors (&pix[yw + (start) * 4]) - 2 * get_colors (&pix[yw + (middle) * 4]) + get_colors (&pix[yw + (end) * 4]); \ + rgbsum += rgballsum; \ + x++; \ + + while (x < r1) { + update (0, x, x + r1); + } + while (x < we) { + update (x - r1, x, x + r1); + } + while (x < w) { + update (x - r1, x, w - 1); + } + + #undef update + + yw += stride; + } + + const int he = h - r1; + for (x = 0; x < w; x++) { + uint64_t rgballsum = -radius * rgb[x]; + uint64_t rgbsum = rgb[x] * ((r1 * (r1 + 1)) >> 1); + for (i = 1; i <= radius; i++) { + rgbsum += rgb[i * w + x] * (r1 - i); + rgballsum += rgb[i * w + x]; + } + + y = 0; + int yi = x * 4; + + #define update(start, middle, end) \ + int64_t res = rgbsum >> 4; \ + pix[yi] = res; \ + pix[yi + 1] = res >> 16; \ + pix[yi + 2] = res >> 32; \ + rgballsum += rgb[x + (start) * w] - 2 * rgb[x + (middle) * w] + rgb[x + (end) * w]; \ + rgbsum += rgballsum; \ + y++; \ + yi += stride; + + while (y < r1) { + update (0, y, y + r1); + } + while (y < he) { + update (y - r1, y, y + r1); + } + while (y < h) { + update (y - r1, y, h - 1); + } + #undef update + } +} + typedef struct my_error_mgr { struct jpeg_error_mgr pub; jmp_buf setjmp_buffer; @@ -16,6 +109,15 @@ METHODDEF(void) my_error_exit(j_common_ptr cinfo) { longjmp(myerr->setjmp_buffer, 1); } +JNIEXPORT void Java_org_telegram_messenger_Utilities_blurBitmap(JNIEnv *env, jclass class, jobject bitmap, int width, int height, int stride) { + void *pixels = 0; + if (AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0) { + return; + } + fastBlur(width, height, stride, pixels); + AndroidBitmap_unlockPixels(env, bitmap); +} + JNIEXPORT void Java_org_telegram_messenger_Utilities_loadBitmap(JNIEnv *env, jclass class, jstring path, jintArray bitmap, int scale, int format, int width, int height) { int i; diff --git a/TMessagesProj/libs/armeabi-v7a/libtmessages.so b/TMessagesProj/libs/armeabi-v7a/libtmessages.so index 8ffd1fbc..a5f1bd92 100755 Binary files a/TMessagesProj/libs/armeabi-v7a/libtmessages.so and b/TMessagesProj/libs/armeabi-v7a/libtmessages.so differ diff --git a/TMessagesProj/libs/armeabi/libtmessages.so b/TMessagesProj/libs/armeabi/libtmessages.so index f2406513..7a0c442c 100755 Binary files a/TMessagesProj/libs/armeabi/libtmessages.so and b/TMessagesProj/libs/armeabi/libtmessages.so differ diff --git a/TMessagesProj/libs/x86/libtmessages.so b/TMessagesProj/libs/x86/libtmessages.so index f251e232..ff282dc0 100755 Binary files a/TMessagesProj/libs/x86/libtmessages.so and b/TMessagesProj/libs/x86/libtmessages.so differ diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index 65752a19..37ca98a8 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -221,4 +221,8 @@ public class AndroidUtilities { FileLog.e("tmessages", e); } } + + public static long makeBroadcastId(int id) { + return 0x0000000100000000L | ((long)id & 0x00000000FFFFFFFFL); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java index 33d2b4bf..9da8a3b5 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java @@ -47,10 +47,7 @@ public class ContactsController { private final Integer observerLock = 1; public boolean contactsLoaded = false; private boolean contactsBookLoaded = false; - private int lastContactsPhonesCount = -1; - private int lastContactsPhonesMaxId = -1; - private int lastContactsNamesCount = -1; - private int lastContactsNamesMaxId = -1; + private String lastContactsVersions = ""; private ArrayList delayedContactsUpdate = new ArrayList(); public static class Contact { @@ -119,10 +116,7 @@ public class ContactsController { contactsSyncInProgress = false; contactsLoaded = false; contactsBookLoaded = false; - lastContactsPhonesCount = -1; - lastContactsPhonesMaxId = -1; - lastContactsNamesCount = -1; - lastContactsNamesMaxId = -1; + lastContactsVersions = ""; } public void checkAppAccount() { @@ -191,70 +185,17 @@ public class ContactsController { ContentResolver cr = ApplicationLoader.applicationContext.getContentResolver(); Cursor pCur = null; try { - pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone._ID}, null, null, ContactsContract.CommonDataKinds.Phone._ID + " desc LIMIT 1"); - if (pCur != null) { - if (pCur.getCount() > 0 && pCur.moveToFirst()) { - int value = pCur.getInt(0); - if (lastContactsPhonesMaxId != -1 && value != lastContactsPhonesMaxId) { - reload = true; - } - lastContactsPhonesMaxId = value; - } + pCur = cr.query(ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts.VERSION}, null, null, null); + StringBuilder currentVersion = new StringBuilder(); + while (pCur.moveToNext()) { + int col = pCur.getColumnIndex(ContactsContract.RawContacts.VERSION); + currentVersion.append(pCur.getString(col)); } - } catch (Exception e) { - FileLog.e("tmessages", e); - } finally { - if (pCur != null) { - pCur.close(); - } - } - try { - pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone._COUNT}, null, null, null); - if (pCur != null) { - if (pCur.getCount() > 0 && pCur.moveToFirst()) { - int value = pCur.getInt(0); - if (lastContactsPhonesCount != -1 && value != lastContactsPhonesCount) { - reload = true; - } - lastContactsPhonesCount = value; - } - } - } catch (Exception e) { - FileLog.e("tmessages", e); - } finally { - if (pCur != null) { - pCur.close(); - } - } - try { - pCur = cr.query(ContactsContract.Data.CONTENT_URI, new String[]{ContactsContract.Data._COUNT}, ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'", null, null); - if (pCur != null) { - if (pCur.getCount() > 0 && pCur.moveToFirst()) { - int value = pCur.getInt(0); - if (lastContactsNamesCount != -1 && value != lastContactsNamesCount) { - reload = true; - } - lastContactsNamesCount = value; - } - } - } catch (Exception e) { - FileLog.e("tmessages", e); - } finally { - if (pCur != null) { - pCur.close(); - } - } - try { - pCur = cr.query(ContactsContract.Data.CONTENT_URI, new String[]{ContactsContract.Data._ID}, ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'", null, ContactsContract.Data._ID + " desc LIMIT 1"); - if (pCur != null) { - if (pCur.getCount() > 0 && pCur.moveToFirst()) { - int value = pCur.getInt(0); - if (lastContactsNamesMaxId != -1 && value != lastContactsNamesMaxId) { - reload = true; - } - lastContactsNamesMaxId = value; - } + String newContactsVersion = currentVersion.toString(); + if (lastContactsVersions.length() != 0 && !lastContactsVersions.equals(newContactsVersion)) { + reload = true; } + lastContactsVersions = newContactsVersion; } catch (Exception e) { FileLog.e("tmessages", e); } finally { @@ -368,7 +309,7 @@ public class ContactsController { String sname2 = pCur.getString(3); String mname = pCur.getString(4); Contact contact = contactsMap.get(id); - if (contact != null) { + if (contact != null && contact.first_name.length() == 0 && contact.last_name.length() == 0) { contact.first_name = fname; contact.last_name = sname; if (contact.first_name == null) { @@ -535,7 +476,8 @@ public class ContactsController { } } - if (existing == null || existing != null && (!existing.first_name.equals(value.first_name) || !existing.last_name.equals(value.last_name))) { + boolean nameChanged = existing != null && (!existing.first_name.equals(value.first_name) || !existing.last_name.equals(value.last_name)); + if (existing == null || nameChanged) { for (int a = 0; a < value.phones.size(); a++) { String sphone = value.shortPhones.get(a); contactsBookShort.put(sphone, value); @@ -550,7 +492,7 @@ public class ContactsController { } } if (request) { - if (contactsByPhone.containsKey(sphone)) { + if (!nameChanged && contactsByPhone.containsKey(sphone)) { continue; } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index 0505dd7a..0d65004b 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -92,6 +92,11 @@ public class MessagesController implements NotificationCenter.NotificationCenter public boolean enableJoined = true; public int fontSize = AndroidUtilities.dp(16); + public int maxGroupCount = 200; + public int maxBroadcastCount = 100; + + private TLRPC.ChatParticipants currentChatInfo = null; + private int chatParticipantsId = 0; private class UserActionUpdates extends TLRPC.Updates { @@ -118,7 +123,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } private class DelayedMessage { - public TLRPC.TL_messages_sendMedia sendRequest; + public TLObject sendRequest; public TLRPC.TL_decryptedMessage sendEncryptedRequest; public int type; public String originalPath; @@ -182,14 +187,32 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage storage = MessagesStorage.getInstance(); NotificationCenter.getInstance().addObserver(this, FileLoader.FileDidUpload); NotificationCenter.getInstance().addObserver(this, FileLoader.FileDidFailUpload); - NotificationCenter.getInstance().addObserver(this, 10); + NotificationCenter.getInstance().addObserver(this, chatInfoDidLoaded); + NotificationCenter.getInstance().addObserver(this, messageReceivedByServer); addSupportUser(); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); enableJoined = preferences.getBoolean("EnableContactJoined", true); preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + maxGroupCount = preferences.getInt("maxGroupCount", 200); + maxBroadcastCount = preferences.getInt("maxBroadcastCount", 100); fontSize = preferences.getInt("fons_size", 16); } + public void updateConfig(final TLRPC.TL_config config) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + maxBroadcastCount = config.broadcast_size_max; + maxGroupCount = config.chat_size_max; + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("maxGroupCount", maxGroupCount); + editor.putInt("maxBroadcastCount", maxBroadcastCount); + editor.commit(); + } + }); + } + public void addSupportUser() { TLRPC.TL_userForeign user = new TLRPC.TL_userForeign(); user.phone = "333"; @@ -282,28 +305,35 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (arr != null) { for (int a = 0; a < arr.size(); a++) { DelayedMessage message = arr.get(a); - if (file != null && message.sendRequest != null) { + TLRPC.InputMedia media = null; + if (message.sendRequest instanceof TLRPC.TL_messages_sendMedia) { + media = ((TLRPC.TL_messages_sendMedia)message.sendRequest).media; + } else if (message.sendRequest instanceof TLRPC.TL_messages_sendBroadcast) { + media = ((TLRPC.TL_messages_sendBroadcast)message.sendRequest).media; + } + + if (file != null && media != null) { if (message.type == 0) { - message.sendRequest.media.file = file; + media.file = file; performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } else if (message.type == 1) { - if (message.sendRequest.media.thumb == null) { - message.sendRequest.media.thumb = file; + if (media.thumb == null) { + media.thumb = file; performSendDelayedMessage(message); } else { - message.sendRequest.media.file = file; + media.file = file; performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } } else if (message.type == 2) { - if (message.sendRequest.media.thumb == null && message.location != null) { - message.sendRequest.media.thumb = file; + if (media.thumb == null && message.location != null) { + media.thumb = file; performSendDelayedMessage(message); } else { - message.sendRequest.media.file = file; + media.file = file; performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } } else if (message.type == 3) { - message.sendRequest.media.file = file; + media.file = file; performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } arr.remove(a); @@ -380,6 +410,11 @@ public class MessagesController implements NotificationCenter.NotificationCenter } NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); } + } else if (id == chatInfoDidLoaded) { + int chatId = (Integer)args[0]; + if (chatParticipantsId == chatId) { + currentChatInfo = (TLRPC.ChatParticipants)args[1]; + } } } @@ -388,6 +423,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter super.finalize(); NotificationCenter.getInstance().removeObserver(this, FileLoader.FileDidUpload); NotificationCenter.getInstance().removeObserver(this, FileLoader.FileDidFailUpload); + NotificationCenter.getInstance().removeObserver(this, chatInfoDidLoaded); NotificationCenter.getInstance().removeObserver(this, messageReceivedByServer); } @@ -432,6 +468,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter startingSecretChat = false; statusRequest = 0; statusSettingState = 0; + currentChatInfo = null; + chatParticipantsId = 0; addSupportUser(); } @@ -689,6 +727,23 @@ public class MessagesController implements NotificationCenter.NotificationCenter public void run(TLObject response, TLRPC.TL_error error) { if (error == null) { final TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; + MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); + + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + for (TLRPC.User user : res.users) { + users.put(user.id, user); + if (user.id == UserConfig.getClientUserId()) { + UserConfig.setCurrentUser(user); + } + } + for (TLRPC.Chat chat : res.chats) { + chats.put(chat.id, chat); + } + } + }); + if (res instanceof TLRPC.TL_messages_messagesSlice) { processLoadedMediaCount(res.count, uid, classGuid, false); } else { @@ -746,6 +801,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter TLRPC.TL_dialog dialog = dialogs_dict.get(did); if (dialog != null) { int lower_part = (int)did; + int high_id = (int)(did >> 32); if (offset == 0) { if (!onlyHistory) { @@ -753,13 +809,33 @@ public class MessagesController implements NotificationCenter.NotificationCenter dialogsServerOnly.remove(dialog); dialogs_dict.remove(did); totalDialogsCount--; + } else { + dialog.unread_count = 0; } dialogMessage.remove(dialog.top_message); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + NotificationsController.getInstance().processReadMessages(null, did, 0, Integer.MAX_VALUE); + HashMap dialogsToUpdate = new HashMap(); + dialogsToUpdate.put(did, 0); + NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate, true); + } + }); + } + }); MessagesStorage.getInstance().deleteDialog(did, onlyHistory); NotificationCenter.getInstance().postNotificationName(removeAllMessagesFromDialog, did); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); } + if (high_id == 1) { + return; + } + if (lower_part != 0) { TLRPC.TL_messages_deleteHistory req = new TLRPC.TL_messages_deleteHistory(); req.offset = offset; @@ -806,19 +882,20 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); } else { - int encId = (int)(did >> 32); if (onlyHistory) { - TLRPC.EncryptedChat encryptedChat = encryptedChats.get(encId); + TLRPC.EncryptedChat encryptedChat = encryptedChats.get(high_id); sendClearHistoryMessage(encryptedChat); } else { - declineSecretChat(encId); + declineSecretChat(high_id); } } } } - public void loadChatInfo(final int chat_id) { - MessagesStorage.getInstance().loadChatInfo(chat_id); + public void loadChatInfo(final int chat_id, Semaphore semaphore) { + currentChatInfo = null; + chatParticipantsId = chat_id; + MessagesStorage.getInstance().loadChatInfo(chat_id, semaphore); } public void processChatInfo(final int chat_id, final TLRPC.ChatParticipants info, final ArrayList usersArr, final boolean fromCache) { @@ -877,7 +954,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter checkDeletingTask(); if (UserConfig.isClientActivated()) { - if (ConnectionsManager.getInstance().getPauseTime() == 0 && ApplicationLoader.isScreenOn) { + if (ConnectionsManager.getInstance().getPauseTime() == 0 && ApplicationLoader.isScreenOn && !ApplicationLoader.mainInterfacePaused) { if (statusSettingState != 1 && (lastStatusUpdateTime == 0 || lastStatusUpdateTime <= System.currentTimeMillis() - 55000 || offlineSent)) { statusSettingState = 1; @@ -927,7 +1004,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 < currentTime) { FileLog.e("tmessages", "UPDATES WAIT TIMEOUT - CHECK QUEUE"); - processUpdatesQueue(false); + processUpdatesQueue(0); } } if (!printingUsers.isEmpty() || lastPrintingStringCount != printingUsers.size()) { @@ -1017,7 +1094,12 @@ public class MessagesController implements NotificationCenter.NotificationCenter return; } int lower_part = (int)dialog_id; + int high_id = (int)(dialog_id >> 32); if (lower_part != 0) { + if (high_id == 1) { + return; + } + TLRPC.TL_messages_setTyping req = new TLRPC.TL_messages_setTyping(); if (lower_part < 0) { req.peer = new TLRPC.TL_inputPeerChat(); @@ -1046,8 +1128,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors); ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid); } else { - int encId = (int)(dialog_id >> 32); - TLRPC.EncryptedChat chat = encryptedChats.get(encId); + TLRPC.EncryptedChat chat = encryptedChats.get(high_id); if (chat.auth_key != null && chat.auth_key.length > 1 && chat instanceof TLRPC.TL_encryptedChat) { TLRPC.TL_messages_setEncryptedTyping req = new TLRPC.TL_messages_setEncryptedTyping(); req.peer = new TLRPC.TL_inputEncryptedChat(); @@ -1065,10 +1146,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - public void loadMessages(final long dialog_id, final int offset, final int count, final int max_id, boolean fromCache, int midDate, final int classGuid, boolean from_unread, boolean forward) { + public void loadMessages(final long dialog_id, final int count, final int max_id, boolean fromCache, int midDate, final int classGuid, boolean from_unread, boolean forward) { int lower_part = (int)dialog_id; if (fromCache || lower_part == 0) { - MessagesStorage.getInstance().getMessages(dialog_id, offset, count, max_id, midDate, classGuid, from_unread, forward); + MessagesStorage.getInstance().getMessages(dialog_id, count, max_id, midDate, classGuid, from_unread, forward); } else { TLRPC.TL_messages_getHistory req = new TLRPC.TL_messages_getHistory(); if (lower_part < 0) { @@ -1085,7 +1166,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter req.peer.user_id = user.id; } } - req.offset = offset; + req.offset = 0; req.limit = count; req.max_id = max_id; long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { @@ -1093,7 +1174,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter public void run(TLObject response, TLRPC.TL_error error) { if (error == null) { final TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; - processLoadedMessages(res, dialog_id, offset, count, max_id, false, classGuid, 0, 0, 0, 0, false); + processLoadedMessages(res, dialog_id, count, max_id, false, classGuid, 0, 0, 0, 0, false); } } }); @@ -1101,7 +1182,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - public void processLoadedMessages(final TLRPC.messages_Messages messagesRes, final long dialog_id, final int offset, final int count, final int max_id, final boolean isCache, final int classGuid, final int first_unread, final int last_unread, final int unread_count, final int last_date, final boolean isForward) { + public void processLoadedMessages(final TLRPC.messages_Messages messagesRes, final long dialog_id, final int count, final int max_id, final boolean isCache, final int classGuid, final int first_unread, final int last_unread, final int unread_count, final int last_date, final boolean isForward) { Utilities.stageQueue.postRunnable(new Runnable() { @Override public void run() { @@ -1113,7 +1194,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter Utilities.RunOnUIThread(new Runnable() { @Override public void run() { - loadMessages(dialog_id, offset, count, max_id, false, 0, classGuid, false, false); + loadMessages(dialog_id, count, max_id, false, 0, classGuid, false, false); } }); return; @@ -1125,7 +1206,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter final ArrayList objects = new ArrayList(); for (TLRPC.Message message : messagesRes.messages) { message.dialog_id = dialog_id; - objects.add(new MessageObject(message, usersLocal)); + objects.add(new MessageObject(message, usersLocal, 2)); } Utilities.RunOnUIThread(new Runnable() { @Override @@ -1151,7 +1232,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter chats.put(c.id, c); } } - NotificationCenter.getInstance().postNotificationName(messagesDidLoaded, dialog_id, offset, count, objects, isCache, first_unread, last_unread, unread_count, last_date, isForward); + NotificationCenter.getInstance().postNotificationName(messagesDidLoaded, dialog_id, count, objects, isCache, first_unread, last_unread, unread_count, last_date, isForward); } }); } @@ -1234,7 +1315,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } for (TLRPC.Message m : dialogsRes.messages) { - new_dialogMessage.put(m.id, new MessageObject(m, usersLocal)); + new_dialogMessage.put(m.id, new MessageObject(m, usersLocal, 0)); } for (TLRPC.TL_dialog d : dialogsRes.dialogs) { if (d.last_message_date == 0) { @@ -1309,7 +1390,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); for (TLRPC.TL_dialog d : dialogs) { - if ((int)d.id != 0) { + int high_id = (int)(d.id >> 32); + if ((int)d.id != 0 && high_id != 1) { dialogsServerOnly.add(d); } } @@ -1374,7 +1456,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } for (TLRPC.Message m : dialogsRes.messages) { - new_dialogMessage.put(m.id, new MessageObject(m, usersLocal)); + new_dialogMessage.put(m.id, new MessageObject(m, usersLocal, 0)); } for (TLRPC.TL_dialog d : dialogsRes.dialogs) { if (d.last_message_date == 0) { @@ -1473,7 +1555,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); for (TLRPC.TL_dialog d : dialogs) { - if ((int)d.id != 0) { + int high_id = (int)(d.id >> 32); + if ((int)d.id != 0 && high_id != 1) { dialogsServerOnly.add(d); } } @@ -1522,10 +1605,12 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - public void markDialogAsRead(final long dialog_id, final int max_id, final int max_positive_id, final int offset, final int max_date, final boolean was) { + public void markDialogAsRead(final long dialog_id, final int max_id, final int max_positive_id, final int offset, final int max_date, final boolean was, final boolean popup) { int lower_part = (int)dialog_id; + int high_id = (int)(dialog_id >> 32); + if (lower_part != 0) { - if (max_id == 0 && offset == 0) { + if (max_id == 0 && offset == 0 || high_id == 1) { return; } TLRPC.TL_messages_readHistory req = new TLRPC.TL_messages_readHistory(); @@ -1546,7 +1631,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter req.max_id = max_positive_id; req.offset = offset; if (offset == 0) { - NotificationsController.getInstance().processReadMessages(null, dialog_id, 0, max_positive_id); MessagesStorage.getInstance().processPendingRead(dialog_id, max_positive_id, max_date, false); MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { @Override @@ -1559,9 +1643,12 @@ public class MessagesController implements NotificationCenter.NotificationCenter dialog.unread_count = 0; NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); } - HashMap dialogsToUpdate = new HashMap(); - dialogsToUpdate.put(dialog_id, 0); - NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate, true); + if (!popup) { + NotificationsController.getInstance().processReadMessages(null, dialog_id, 0, max_positive_id); + HashMap dialogsToUpdate = new HashMap(); + dialogsToUpdate.put(dialog_id, 0); + NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate, true); + } } }); } @@ -1575,7 +1662,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage.getInstance().processPendingRead(dialog_id, max_positive_id, max_date, true); TLRPC.TL_messages_affectedHistory res = (TLRPC.TL_messages_affectedHistory) response; if (res.offset > 0) { - markDialogAsRead(dialog_id, 0, max_positive_id, res.offset, max_date, was); + markDialogAsRead(dialog_id, 0, max_positive_id, res.offset, max_date, was, popup); } if (MessagesStorage.lastSeqValue + 1 == res.seq) { @@ -1615,9 +1702,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (max_date == 0) { return; } - NotificationsController.getInstance().processReadMessages(null, dialog_id, max_date, 0); - int encId = (int)(dialog_id >> 32); - TLRPC.EncryptedChat chat = encryptedChats.get(encId); + TLRPC.EncryptedChat chat = encryptedChats.get(high_id); if (chat.auth_key != null && chat.auth_key.length > 1 && chat instanceof TLRPC.TL_encryptedChat) { TLRPC.TL_messages_readEncryptedHistory req = new TLRPC.TL_messages_readEncryptedHistory(); req.peer = new TLRPC.TL_inputEncryptedChat(); @@ -1640,6 +1725,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter Utilities.RunOnUIThread(new Runnable() { @Override public void run() { + NotificationsController.getInstance().processReadMessages(null, dialog_id, max_date, 0); TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id); if (dialog != null) { dialog.unread_count = 0; @@ -1795,7 +1881,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter objArr.add(newMsgObj); ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); updateInterfaceWithMessages(newMsg.dialog_id, objArr); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); @@ -1844,7 +1930,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter objArr.add(newMsgObj); ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); updateInterfaceWithMessages(newMsg.dialog_id, objArr); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); @@ -1942,33 +2028,51 @@ public class MessagesController implements NotificationCenter.NotificationCenter newMsg.unread = true; newMsg.dialog_id = peer; int lower_id = (int)peer; + int high_id = (int)(peer >> 32); TLRPC.EncryptedChat encryptedChat = null; TLRPC.InputPeer sendToPeer = null; + ArrayList sendToPeers = null; if (lower_id != 0) { - if (lower_id < 0) { - newMsg.to_id = new TLRPC.TL_peerChat(); - newMsg.to_id.chat_id = -lower_id; - sendToPeer = new TLRPC.TL_inputPeerChat(); - sendToPeer.chat_id = -lower_id; - } else { - newMsg.to_id = new TLRPC.TL_peerUser(); - newMsg.to_id.user_id = lower_id; - - TLRPC.User sendToUser = users.get(lower_id); - if (sendToUser == null) { + if (high_id == 1) { + if (currentChatInfo == null) { return; } - if (sendToUser instanceof TLRPC.TL_userForeign || sendToUser instanceof TLRPC.TL_userRequest) { - sendToPeer = new TLRPC.TL_inputPeerForeign(); - sendToPeer.user_id = sendToUser.id; - sendToPeer.access_hash = sendToUser.access_hash; + sendToPeers = new ArrayList(); + for (TLRPC.TL_chatParticipant participant : currentChatInfo.participants) { + TLRPC.User sendToUser = users.get(participant.user_id); + TLRPC.InputUser peerUser = getInputUser(sendToUser); + if (peerUser != null) { + sendToPeers.add(peerUser); + } + } + newMsg.to_id = new TLRPC.TL_peerChat(); + newMsg.to_id.chat_id = high_id; + } else { + if (lower_id < 0) { + newMsg.to_id = new TLRPC.TL_peerChat(); + newMsg.to_id.chat_id = -lower_id; + sendToPeer = new TLRPC.TL_inputPeerChat(); + sendToPeer.chat_id = -lower_id; } else { - sendToPeer = new TLRPC.TL_inputPeerContact(); - sendToPeer.user_id = sendToUser.id; + newMsg.to_id = new TLRPC.TL_peerUser(); + newMsg.to_id.user_id = lower_id; + + TLRPC.User sendToUser = users.get(lower_id); + if (sendToUser == null) { + return; + } + if (sendToUser instanceof TLRPC.TL_userForeign || sendToUser instanceof TLRPC.TL_userRequest) { + sendToPeer = new TLRPC.TL_inputPeerForeign(); + sendToPeer.user_id = sendToUser.id; + sendToPeer.access_hash = sendToUser.access_hash; + } else { + sendToPeer = new TLRPC.TL_inputPeerContact(); + sendToPeer.user_id = sendToUser.id; + } } } } else { - encryptedChat = encryptedChats.get((int)(peer >> 32)); + encryptedChat = encryptedChats.get(high_id); newMsg.to_id = new TLRPC.TL_peerUser(); if (encryptedChat.participant_id == UserConfig.getClientUserId()) { newMsg.to_id.user_id = encryptedChat.admin_id; @@ -1981,14 +2085,14 @@ public class MessagesController implements NotificationCenter.NotificationCenter newMsg.date = ConnectionsManager.getInstance().getCurrentTime(); newMsg.random_id = getNextRandomId(); UserConfig.saveConfig(false); - final MessageObject newMsgObj = new MessageObject(newMsg, null); + final MessageObject newMsgObj = new MessageObject(newMsg, null, 2); newMsgObj.messageOwner.send_state = MESSAGE_SEND_STATE_SENDING; final ArrayList objArr = new ArrayList(); objArr.add(newMsgObj); ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); updateInterfaceWithMessages(peer, objArr); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); @@ -1996,11 +2100,19 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (type == 0) { if (encryptedChat == null) { - TLRPC.TL_messages_sendMessage reqSend = new TLRPC.TL_messages_sendMessage(); - reqSend.message = message; - reqSend.peer = sendToPeer; - reqSend.random_id = newMsg.random_id; - performSendMessageRequest(reqSend, newMsgObj, null); + if (sendToPeers != null) { + TLRPC.TL_messages_sendBroadcast reqSend = new TLRPC.TL_messages_sendBroadcast(); + reqSend.message = message; + reqSend.contacts = sendToPeers; + reqSend.media = new TLRPC.TL_inputMediaEmpty(); + performSendMessageRequest(reqSend, newMsgObj, null); + } else { + TLRPC.TL_messages_sendMessage reqSend = new TLRPC.TL_messages_sendMessage(); + reqSend.message = message; + reqSend.peer = sendToPeer; + reqSend.random_id = newMsg.random_id; + performSendMessageRequest(reqSend, newMsgObj, null); + } } else { TLRPC.TL_decryptedMessage reqSend = new TLRPC.TL_decryptedMessage(); reqSend.random_id = newMsg.random_id; @@ -2012,74 +2124,64 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } else if (type >= 1 && type <= 3 || type >= 5 && type <= 8) { if (encryptedChat == null) { - TLRPC.TL_messages_sendMedia reqSend = new TLRPC.TL_messages_sendMedia(); - reqSend.peer = sendToPeer; - reqSend.random_id = newMsg.random_id; + TLRPC.InputMedia inputMedia = null; + DelayedMessage delayedMessage = null; if (type == 1) { - reqSend.media = new TLRPC.TL_inputMediaGeoPoint(); - reqSend.media.geo_point = new TLRPC.TL_inputGeoPoint(); - reqSend.media.geo_point.lat = lat; - reqSend.media.geo_point._long = lon; - performSendMessageRequest(reqSend, newMsgObj, null); + inputMedia = new TLRPC.TL_inputMediaGeoPoint(); + inputMedia.geo_point = new TLRPC.TL_inputGeoPoint(); + inputMedia.geo_point.lat = lat; + inputMedia.geo_point._long = lon; } else if (type == 2) { if (photo.access_hash == 0) { - reqSend.media = new TLRPC.TL_inputMediaUploadedPhoto(); - DelayedMessage delayedMessage = new DelayedMessage(); + inputMedia = new TLRPC.TL_inputMediaUploadedPhoto(); + delayedMessage = new DelayedMessage(); delayedMessage.originalPath = originalPath; - delayedMessage.sendRequest = reqSend; delayedMessage.type = 0; delayedMessage.obj = newMsgObj; delayedMessage.location = photo.sizes.get(photo.sizes.size() - 1).location; - performSendDelayedMessage(delayedMessage); } else { TLRPC.TL_inputMediaPhoto media = new TLRPC.TL_inputMediaPhoto(); media.id = new TLRPC.TL_inputPhoto(); media.id.id = photo.id; media.id.access_hash = photo.access_hash; - reqSend.media = media; - performSendMessageRequest(reqSend, newMsgObj, null); + inputMedia = media; } } else if (type == 3) { if (video.access_hash == 0) { - reqSend.media = new TLRPC.TL_inputMediaUploadedThumbVideo(); - reqSend.media.duration = video.duration; - reqSend.media.w = video.w; - reqSend.media.h = video.h; - reqSend.media.mime_type = video.mime_type; - DelayedMessage delayedMessage = new DelayedMessage(); + inputMedia = new TLRPC.TL_inputMediaUploadedThumbVideo(); + inputMedia.duration = video.duration; + inputMedia.w = video.w; + inputMedia.h = video.h; + inputMedia.mime_type = video.mime_type; + delayedMessage = new DelayedMessage(); delayedMessage.originalPath = originalPath; - delayedMessage.sendRequest = reqSend; delayedMessage.type = 1; delayedMessage.obj = newMsgObj; delayedMessage.location = video.thumb.location; delayedMessage.videoLocation = video; - performSendDelayedMessage(delayedMessage); } else { TLRPC.TL_inputMediaVideo media = new TLRPC.TL_inputMediaVideo(); media.id = new TLRPC.TL_inputVideo(); media.id.id = video.id; media.id.access_hash = video.access_hash; - reqSend.media = media; - performSendMessageRequest(reqSend, newMsgObj, null); + inputMedia = media; } } else if (type == 6) { - reqSend.media = new TLRPC.TL_inputMediaContact(); - reqSend.media.phone_number = user.phone; - reqSend.media.first_name = user.first_name; - reqSend.media.last_name = user.last_name; - performSendMessageRequest(reqSend, newMsgObj, null); + inputMedia = new TLRPC.TL_inputMediaContact(); + inputMedia.phone_number = user.phone; + inputMedia.first_name = user.first_name; + inputMedia.last_name = user.last_name; } else if (type == 7) { if (document.access_hash == 0) { if (document.thumb.location != null && document.thumb.location instanceof TLRPC.TL_fileLocation) { - reqSend.media = new TLRPC.TL_inputMediaUploadedThumbDocument(); + inputMedia = new TLRPC.TL_inputMediaUploadedThumbDocument(); } else { - reqSend.media = new TLRPC.TL_inputMediaUploadedDocument(); + inputMedia = new TLRPC.TL_inputMediaUploadedDocument(); } - reqSend.media.mime_type = document.mime_type; - reqSend.media.file_name = document.file_name; - DelayedMessage delayedMessage = new DelayedMessage(); + inputMedia.mime_type = document.mime_type; + inputMedia.file_name = document.file_name; + delayedMessage = new DelayedMessage(); delayedMessage.originalPath = originalPath; - delayedMessage.sendRequest = reqSend; delayedMessage.type = 2; delayedMessage.obj = newMsgObj; delayedMessage.documentLocation = document; @@ -2090,26 +2192,73 @@ public class MessagesController implements NotificationCenter.NotificationCenter media.id = new TLRPC.TL_inputDocument(); media.id.id = document.id; media.id.access_hash = document.access_hash; - reqSend.media = media; - performSendMessageRequest(reqSend, newMsgObj, null); + inputMedia = media; } } else if (type == 8) { if (audio.access_hash == 0) { - reqSend.media = new TLRPC.TL_inputMediaUploadedAudio(); - reqSend.media.duration = audio.duration; - reqSend.media.mime_type = audio.mime_type; - DelayedMessage delayedMessage = new DelayedMessage(); - delayedMessage.sendRequest = reqSend; + inputMedia = new TLRPC.TL_inputMediaUploadedAudio(); + inputMedia.duration = audio.duration; + inputMedia.mime_type = audio.mime_type; + delayedMessage = new DelayedMessage(); delayedMessage.type = 3; delayedMessage.obj = newMsgObj; delayedMessage.audioLocation = audio; - performSendDelayedMessage(delayedMessage); } else { TLRPC.TL_inputMediaAudio media = new TLRPC.TL_inputMediaAudio(); media.id = new TLRPC.TL_inputAudio(); media.id.id = audio.id; media.id.access_hash = audio.access_hash; - reqSend.media = media; + inputMedia = media; + } + } + + TLObject reqSend = null; + + if (sendToPeers != null) { + TLRPC.TL_messages_sendBroadcast request = new TLRPC.TL_messages_sendBroadcast(); + request.contacts = sendToPeers; + request.media = inputMedia; + request.message = ""; + if (delayedMessage != null) { + delayedMessage.sendRequest = request; + } + reqSend = request; + } else { + TLRPC.TL_messages_sendMedia request = new TLRPC.TL_messages_sendMedia(); + request.peer = sendToPeer; + request.random_id = newMsg.random_id; + request.media = inputMedia; + if (delayedMessage != null) { + delayedMessage.sendRequest = request; + } + reqSend = request; + } + if (type == 1) { + performSendMessageRequest(reqSend, newMsgObj, null); + } else if (type == 2) { + if (photo.access_hash == 0) { + performSendDelayedMessage(delayedMessage); + } else { + performSendMessageRequest(reqSend, newMsgObj, null); + } + } else if (type == 3) { + if (video.access_hash == 0) { + performSendDelayedMessage(delayedMessage); + } else { + performSendMessageRequest(reqSend, newMsgObj, null); + } + } else if (type == 6) { + performSendMessageRequest(reqSend, newMsgObj, null); + } else if (type == 7) { + if (document.access_hash == 0) { + performSendDelayedMessage(delayedMessage); + } else { + performSendMessageRequest(reqSend, newMsgObj, null); + } + } else if (type == 8) { + if (audio.access_hash == 0) { + performSendDelayedMessage(delayedMessage); + } else { performSendMessageRequest(reqSend, newMsgObj, null); } } @@ -2360,7 +2509,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter FileLoader.getInstance().replaceImageInCache(fileName, fileName2); ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.photo, 3); } else if (newMsg.media instanceof TLRPC.TL_messageMediaVideo && newMsg.media.video != null) { @@ -2383,7 +2532,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter newMsg.media.video.mime_type = video.mime_type; ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.video, 5); } else if (newMsg.media instanceof TLRPC.TL_messageMediaDocument && newMsg.media.document != null) { @@ -2410,7 +2559,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.document, 4); } else if (newMsg.media instanceof TLRPC.TL_messageMediaAudio && newMsg.media.audio != null) { @@ -2438,7 +2587,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter ArrayList arr = new ArrayList(); arr.add(newMsg); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().putMessages(arr, false, true, false); } } } @@ -2539,12 +2688,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter }); } - private void performSendMessageRequest(TLObject req, final MessageObject newMsgObj, final String originalPath) { + private void performSendMessageRequest(final TLObject req, final MessageObject newMsgObj, final String originalPath) { ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { @Override public void run(TLObject response, TLRPC.TL_error error) { if (error == null) { final int oldId = newMsgObj.messageOwner.id; + final boolean isBroadcast = req instanceof TLRPC.TL_messages_sendBroadcast; final ArrayList sentMessages = new ArrayList(); if (response instanceof TLRPC.TL_messages_sentMessage) { @@ -2596,9 +2746,11 @@ public class MessagesController implements NotificationCenter.NotificationCenter } else if (response instanceof TLRPC.messages_StatedMessages) { TLRPC.messages_StatedMessages res = (TLRPC.messages_StatedMessages) response; if (!res.messages.isEmpty()) { + sentMessages.addAll(res.messages); TLRPC.Message message = res.messages.get(0); - newMsgObj.messageOwner.id = message.id; - sentMessages.add(message); + if (!isBroadcast) { + newMsgObj.messageOwner.id = message.id; + } processSentMessage(newMsgObj.messageOwner, message, null, null, originalPath); } if (MessagesStorage.lastSeqValue + 1 == res.seq) { @@ -2623,13 +2775,28 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { @Override public void run() { - MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.messageOwner.random_id, oldId, newMsgObj.messageOwner.id, 0, false); - MessagesStorage.getInstance().putMessages(sentMessages, true, false); + MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.messageOwner.random_id, oldId, (isBroadcast ? oldId : newMsgObj.messageOwner.id), 0, false); + MessagesStorage.getInstance().putMessages(sentMessages, true, false, isBroadcast); + if (isBroadcast) { + ArrayList currentMessage = new ArrayList(); + currentMessage.add(newMsgObj.messageOwner); + newMsgObj.messageOwner.send_state = MESSAGE_SEND_STATE_SENT; + MessagesStorage.getInstance().putMessages(currentMessage, true, false, false); + } Utilities.RunOnUIThread(new Runnable() { @Override public void run() { newMsgObj.messageOwner.send_state = MESSAGE_SEND_STATE_SENT; - NotificationCenter.getInstance().postNotificationName(messageReceivedByServer, oldId, newMsgObj.messageOwner.id, newMsgObj); + if (isBroadcast) { + for (TLRPC.Message message : sentMessages) { + ArrayList arr = new ArrayList(); + MessageObject messageObject = new MessageObject(message, users, 0); + arr.add(messageObject); + updateInterfaceWithMessages(messageObject.getDialogId(), arr, isBroadcast); + } + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + } + NotificationCenter.getInstance().postNotificationName(messageReceivedByServer, oldId, (isBroadcast ? oldId : newMsgObj.messageOwner.id), newMsgObj); sendingMessages.remove(oldId); } }); @@ -2681,7 +2848,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } else if (message.type == 1) { if (message.sendRequest != null) { - if (message.sendRequest.media.thumb == null) { + TLRPC.InputMedia media = null; + if (message.sendRequest instanceof TLRPC.TL_messages_sendMedia) { + media = ((TLRPC.TL_messages_sendMedia)message.sendRequest).media; + } else if (message.sendRequest instanceof TLRPC.TL_messages_sendBroadcast) { + media = ((TLRPC.TL_messages_sendBroadcast)message.sendRequest).media; + } + if (media.thumb == null) { String location = AndroidUtilities.getCacheDir() + "/" + message.location.volume_id + "_" + message.location.local_id + ".jpg"; putToDelayedMessages(location, message); FileLoader.getInstance().uploadFile(location, false); @@ -2702,7 +2875,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter FileLoader.getInstance().uploadFile(location, true); } } else if (message.type == 2) { - if (message.sendRequest != null && message.sendRequest.media.thumb == null && message.location != null) { + TLRPC.InputMedia media = null; + if (message.sendRequest instanceof TLRPC.TL_messages_sendMedia) { + media = ((TLRPC.TL_messages_sendMedia)message.sendRequest).media; + } else if (message.sendRequest instanceof TLRPC.TL_messages_sendBroadcast) { + media = ((TLRPC.TL_messages_sendBroadcast)message.sendRequest).media; + } + if (message.sendRequest != null && media.thumb == null && message.location != null) { String location = AndroidUtilities.getCacheDir() + "/" + message.location.volume_id + "_" + message.location.local_id + ".jpg"; putToDelayedMessages(location, message); FileLoader.getInstance().uploadFile(location, false); @@ -2726,78 +2905,133 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - public long createChat(String title, ArrayList selectedContacts, final TLRPC.InputFile uploadedAvatar) { - TLRPC.TL_messages_createChat req = new TLRPC.TL_messages_createChat(); - req.title = title; - for (Integer uid : selectedContacts) { - TLRPC.User user = users.get(uid); - if (user == null) { - continue; + public long createChat(String title, ArrayList selectedContacts, final TLRPC.InputFile uploadedAvatar, boolean isBroadcast) { + if (isBroadcast) { + TLRPC.TL_chat chat = new TLRPC.TL_chat(); + chat.id = UserConfig.lastBroadcastId; + chat.title = title; + chat.photo = new TLRPC.TL_chatPhotoEmpty(); + chat.participants_count = selectedContacts.size(); + chat.date = (int)(System.currentTimeMillis() / 1000); + chat.left = false; + chat.version = 1; + UserConfig.lastBroadcastId--; + chats.put(chat.id, chat); + ArrayList chatsArrays = new ArrayList(); + chatsArrays.add(chat); + MessagesStorage.getInstance().putUsersAndChats(null, chatsArrays, true, true); + + TLRPC.TL_chatParticipants participants = new TLRPC.TL_chatParticipants(); + participants.chat_id = chat.id; + participants.admin_id = UserConfig.getClientUserId(); + participants.version = 1; + for (Integer id : selectedContacts) { + TLRPC.TL_chatParticipant participant = new TLRPC.TL_chatParticipant(); + participant.user_id = id; + participant.inviter_id = UserConfig.getClientUserId(); + participant.date = (int)(System.currentTimeMillis() / 1000); + participants.participants.add(participant); } - req.users.add(getInputUser(user)); - } - return ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(TLObject response, TLRPC.TL_error error) { - if (error != null) { + MessagesStorage.getInstance().updateChatInfo(chat.id, participants, false); + + TLRPC.TL_messageService newMsg = new TLRPC.TL_messageService(); + newMsg.action = new TLRPC.TL_messageActionCreatedBroadcastList(); + newMsg.local_id = newMsg.id = UserConfig.getNewMessageId(); + newMsg.from_id = UserConfig.getClientUserId(); + newMsg.unread = false; + newMsg.dialog_id = AndroidUtilities.makeBroadcastId(chat.id); + newMsg.to_id = new TLRPC.TL_peerChat(); + newMsg.to_id.chat_id = chat.id; + newMsg.out = false; + newMsg.date = ConnectionsManager.getInstance().getCurrentTime(); + newMsg.random_id = 0; + UserConfig.saveConfig(false); + MessageObject newMsgObj = new MessageObject(newMsg, users); + newMsgObj.messageOwner.send_state = MESSAGE_SEND_STATE_SENT; + + ArrayList objArr = new ArrayList(); + objArr.add(newMsgObj); + ArrayList arr = new ArrayList(); + arr.add(newMsg); + MessagesStorage.getInstance().putMessages(arr, false, true, false); + updateInterfaceWithMessages(newMsg.dialog_id, objArr); + NotificationCenter.getInstance().postNotificationName(chatDidCreated, chat.id); + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + + return 0; + } else { + TLRPC.TL_messages_createChat req = new TLRPC.TL_messages_createChat(); + req.title = title; + for (Integer uid : selectedContacts) { + TLRPC.User user = users.get(uid); + if (user == null) { + continue; + } + req.users.add(getInputUser(user)); + } + return ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + if (error != null) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + NotificationCenter.getInstance().postNotificationName(chatDidFailCreate); + } + }); + return; + } + final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; + MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); + Utilities.RunOnUIThread(new Runnable() { @Override public void run() { - NotificationCenter.getInstance().postNotificationName(chatDidFailCreate); - } - }); - return; - } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - for (TLRPC.User user : res.users) { - users.put(user.id, user); - if (user.id == UserConfig.getClientUserId()) { - UserConfig.setCurrentUser(user); + for (TLRPC.User user : res.users) { + users.put(user.id, user); + if (user.id == UserConfig.getClientUserId()) { + UserConfig.setCurrentUser(user); + } + } + for (TLRPC.Chat chat : res.chats) { + chats.put(chat.id, chat); + } + final ArrayList messagesObj = new ArrayList(); + messagesObj.add(new MessageObject(res.message, users)); + TLRPC.Chat chat = res.chats.get(0); + updateInterfaceWithMessages(-chat.id, messagesObj); + NotificationCenter.getInstance().postNotificationName(chatDidCreated, chat.id); + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + if (uploadedAvatar != null) { + changeChatAvatar(chat.id, uploadedAvatar); } } - for (TLRPC.Chat chat : res.chats) { - chats.put(chat.id, chat); - } - final ArrayList messagesObj = new ArrayList(); - messagesObj.add(new MessageObject(res.message, users)); - TLRPC.Chat chat = res.chats.get(0); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(chatDidCreated, chat.id); - NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); - if (uploadedAvatar != null) { - changeChatAvatar(chat.id, uploadedAvatar); - } - } - }); + }); - final ArrayList messages = new ArrayList(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true); - if (MessagesStorage.lastSeqValue + 1 == res.seq) { - MessagesStorage.lastSeqValue = res.seq; - MessagesStorage.lastPtsValue = res.pts; - MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); - } else if (MessagesStorage.lastSeqValue != res.seq) { - FileLog.e("tmessages", "need get diff TL_messages_createChat, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); - if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { - if (updatesStartWaitTime == 0) { - updatesStartWaitTime = System.currentTimeMillis(); + final ArrayList messages = new ArrayList(); + messages.add(res.message); + MessagesStorage.getInstance().putMessages(messages, true, true, false); + if (MessagesStorage.lastSeqValue + 1 == res.seq) { + MessagesStorage.lastSeqValue = res.seq; + MessagesStorage.lastPtsValue = res.pts; + MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); + } else if (MessagesStorage.lastSeqValue != res.seq) { + FileLog.e("tmessages", "need get diff TL_messages_createChat, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); + if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { + if (updatesStartWaitTime == 0) { + updatesStartWaitTime = System.currentTimeMillis(); + } + FileLog.e("tmessages", "add TL_messages_createChat to queue"); + UserActionUpdates updates = new UserActionUpdates(); + updates.seq = res.seq; + updatesQueue.add(updates); + } else { + getDifference(); } - FileLog.e("tmessages", "add TL_messages_createChat to queue"); - UserActionUpdates updates = new UserActionUpdates(); - updates.seq = res.seq; - updatesQueue.add(updates); - } else { - getDifference(); } } - } - }); + }); + } } public void addUserToChat(int chat_id, final TLRPC.User user, final TLRPC.ChatParticipants info, int count_fwd) { @@ -2805,112 +3039,34 @@ public class MessagesController implements NotificationCenter.NotificationCenter return; } - TLRPC.TL_messages_addChatUser req = new TLRPC.TL_messages_addChatUser(); - req.chat_id = chat_id; - req.fwd_limit = count_fwd; - req.user_id = getInputUser(user); + if (chat_id > 0) { + TLRPC.TL_messages_addChatUser req = new TLRPC.TL_messages_addChatUser(); + req.chat_id = chat_id; + req.fwd_limit = count_fwd; + req.user_id = getInputUser(user); - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(TLObject response, TLRPC.TL_error error) { - if (error != null) { - return; - } + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + if (error != null) { + return; + } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); + final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; + MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - for (TLRPC.User user : res.users) { - users.put(user.id, user); - if (user.id == UserConfig.getClientUserId()) { - UserConfig.setCurrentUser(user); - } - } - for (TLRPC.Chat chat : res.chats) { - chats.put(chat.id, chat); - } - final ArrayList messagesObj = new ArrayList(); - messagesObj.add(new MessageObject(res.message, users)); - TLRPC.Chat chat = res.chats.get(0); - chats.put(chat.id, chat); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); - NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); - - if (info != null) { - for (TLRPC.TL_chatParticipant p : info.participants) { - if (p.user_id == user.id) { - return; + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + for (TLRPC.User user : res.users) { + users.put(user.id, user); + if (user.id == UserConfig.getClientUserId()) { + UserConfig.setCurrentUser(user); } } - TLRPC.TL_chatParticipant newPart = new TLRPC.TL_chatParticipant(); - newPart.user_id = user.id; - newPart.inviter_id = UserConfig.getClientUserId(); - newPart.date = ConnectionsManager.getInstance().getCurrentTime(); - info.participants.add(0, newPart); - MessagesStorage.getInstance().updateChatInfo(info.chat_id, info, true); - NotificationCenter.getInstance().postNotificationName(chatInfoDidLoaded, info.chat_id, info); - } - } - }); - - final ArrayList messages = new ArrayList(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true); - if (MessagesStorage.lastSeqValue + 1 == res.seq) { - MessagesStorage.lastSeqValue = res.seq; - MessagesStorage.lastPtsValue = res.pts; - MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); - } else if (MessagesStorage.lastSeqValue != res.seq) { - FileLog.e("tmessages", "need get diff TL_messages_addChatUser, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); - if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { - if (updatesStartWaitTime == 0) { - updatesStartWaitTime = System.currentTimeMillis(); - } - FileLog.e("tmessages", "add TL_messages_addChatUser to queue"); - UserActionUpdates updates = new UserActionUpdates(); - updates.seq = res.seq; - updatesQueue.add(updates); - } else { - getDifference(); - } - } - } - }); - } - - public void deleteUserFromChat(int chat_id, final TLRPC.User user, final TLRPC.ChatParticipants info) { - if (user == null) { - return; - } - TLRPC.TL_messages_deleteChatUser req = new TLRPC.TL_messages_deleteChatUser(); - req.chat_id = chat_id; - req.user_id = getInputUser(user); - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(TLObject response, TLRPC.TL_error error) { - if (error != null) { - return; - } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - for (TLRPC.User user : res.users) { - users.put(user.id, user); - if (user.id == UserConfig.getClientUserId()) { - UserConfig.setCurrentUser(user); + for (TLRPC.Chat chat : res.chats) { + chats.put(chat.id, chat); } - } - for (TLRPC.Chat chat : res.chats) { - chats.put(chat.id, chat); - } - if (user.id != UserConfig.getClientUserId()) { final ArrayList messagesObj = new ArrayList(); messagesObj.add(new MessageObject(res.message, users)); TLRPC.Chat chat = res.chats.get(0); @@ -2918,110 +3074,250 @@ public class MessagesController implements NotificationCenter.NotificationCenter updateInterfaceWithMessages(-chat.id, messagesObj); NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); - } - boolean changed = false; - if (info != null) { - for (int a = 0; a < info.participants.size(); a++) { - TLRPC.TL_chatParticipant p = info.participants.get(a); - if (p.user_id == user.id) { - info.participants.remove(a); - changed = true; - break; + + if (info != null) { + for (TLRPC.TL_chatParticipant p : info.participants) { + if (p.user_id == user.id) { + return; + } } - } - if (changed) { + TLRPC.TL_chatParticipant newPart = new TLRPC.TL_chatParticipant(); + newPart.user_id = user.id; + newPart.inviter_id = UserConfig.getClientUserId(); + newPart.date = ConnectionsManager.getInstance().getCurrentTime(); + info.participants.add(0, newPart); MessagesStorage.getInstance().updateChatInfo(info.chat_id, info, true); NotificationCenter.getInstance().postNotificationName(chatInfoDidLoaded, info.chat_id, info); } } - } - }); + }); - if (user.id != UserConfig.getClientUserId()) { final ArrayList messages = new ArrayList(); messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true); - } - if (MessagesStorage.lastSeqValue + 1 == res.seq) { - MessagesStorage.lastSeqValue = res.seq; - MessagesStorage.lastPtsValue = res.pts; - MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); - } else if (MessagesStorage.lastSeqValue != res.seq) { - FileLog.e("tmessages", "need get diff TL_messages_deleteChatUser, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); - if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { - if (updatesStartWaitTime == 0) { - updatesStartWaitTime = System.currentTimeMillis(); + MessagesStorage.getInstance().putMessages(messages, true, true, false); + if (MessagesStorage.lastSeqValue + 1 == res.seq) { + MessagesStorage.lastSeqValue = res.seq; + MessagesStorage.lastPtsValue = res.pts; + MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); + } else if (MessagesStorage.lastSeqValue != res.seq) { + FileLog.e("tmessages", "need get diff TL_messages_addChatUser, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); + if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { + if (updatesStartWaitTime == 0) { + updatesStartWaitTime = System.currentTimeMillis(); + } + FileLog.e("tmessages", "add TL_messages_addChatUser to queue"); + UserActionUpdates updates = new UserActionUpdates(); + updates.seq = res.seq; + updatesQueue.add(updates); + } else { + getDifference(); } - FileLog.e("tmessages", "add TL_messages_deleteChatUser to queue"); - UserActionUpdates updates = new UserActionUpdates(); - updates.seq = res.seq; - updatesQueue.add(updates); - } else { - getDifference(); } } + }); + } else { + if (info != null) { + for (TLRPC.TL_chatParticipant p : info.participants) { + if (p.user_id == user.id) { + return; + } + } + + TLRPC.Chat chat = chats.get(chat_id); + chat.participants_count++; + ArrayList chatArrayList = new ArrayList(); + chatArrayList.add(chat); + MessagesStorage.getInstance().putUsersAndChats(null, chatArrayList, true, true); + + TLRPC.TL_chatParticipant newPart = new TLRPC.TL_chatParticipant(); + newPart.user_id = user.id; + newPart.inviter_id = UserConfig.getClientUserId(); + newPart.date = ConnectionsManager.getInstance().getCurrentTime(); + info.participants.add(0, newPart); + MessagesStorage.getInstance().updateChatInfo(info.chat_id, info, true); + NotificationCenter.getInstance().postNotificationName(chatInfoDidLoaded, info.chat_id, info); + NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); } - }); + } + } + + public void deleteUserFromChat(int chat_id, final TLRPC.User user, final TLRPC.ChatParticipants info) { + if (user == null) { + return; + } + if (chat_id > 0) { + TLRPC.TL_messages_deleteChatUser req = new TLRPC.TL_messages_deleteChatUser(); + req.chat_id = chat_id; + req.user_id = getInputUser(user); + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + if (error != null) { + return; + } + final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; + MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); + + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + for (TLRPC.User user : res.users) { + users.put(user.id, user); + if (user.id == UserConfig.getClientUserId()) { + UserConfig.setCurrentUser(user); + } + } + for (TLRPC.Chat chat : res.chats) { + chats.put(chat.id, chat); + } + if (user.id != UserConfig.getClientUserId()) { + final ArrayList messagesObj = new ArrayList(); + messagesObj.add(new MessageObject(res.message, users)); + TLRPC.Chat chat = res.chats.get(0); + chats.put(chat.id, chat); + updateInterfaceWithMessages(-chat.id, messagesObj); + NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + } + boolean changed = false; + if (info != null) { + for (int a = 0; a < info.participants.size(); a++) { + TLRPC.TL_chatParticipant p = info.participants.get(a); + if (p.user_id == user.id) { + info.participants.remove(a); + changed = true; + break; + } + } + if (changed) { + MessagesStorage.getInstance().updateChatInfo(info.chat_id, info, true); + NotificationCenter.getInstance().postNotificationName(chatInfoDidLoaded, info.chat_id, info); + } + } + } + }); + + if (user.id != UserConfig.getClientUserId()) { + final ArrayList messages = new ArrayList(); + messages.add(res.message); + MessagesStorage.getInstance().putMessages(messages, true, true, false); + } + if (MessagesStorage.lastSeqValue + 1 == res.seq) { + MessagesStorage.lastSeqValue = res.seq; + MessagesStorage.lastPtsValue = res.pts; + MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); + } else if (MessagesStorage.lastSeqValue != res.seq) { + FileLog.e("tmessages", "need get diff TL_messages_deleteChatUser, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); + if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { + if (updatesStartWaitTime == 0) { + updatesStartWaitTime = System.currentTimeMillis(); + } + FileLog.e("tmessages", "add TL_messages_deleteChatUser to queue"); + UserActionUpdates updates = new UserActionUpdates(); + updates.seq = res.seq; + updatesQueue.add(updates); + } else { + getDifference(); + } + } + } + }); + } else { + if (info != null) { + TLRPC.Chat chat = chats.get(chat_id); + chat.participants_count--; + ArrayList chatArrayList = new ArrayList(); + chatArrayList.add(chat); + MessagesStorage.getInstance().putUsersAndChats(null, chatArrayList, true, true); + + boolean changed = false; + if (info != null) { + for (int a = 0; a < info.participants.size(); a++) { + TLRPC.TL_chatParticipant p = info.participants.get(a); + if (p.user_id == user.id) { + info.participants.remove(a); + changed = true; + break; + } + } + if (changed) { + MessagesStorage.getInstance().updateChatInfo(info.chat_id, info, true); + NotificationCenter.getInstance().postNotificationName(chatInfoDidLoaded, info.chat_id, info); + } + } + NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); + } + } } public void changeChatTitle(int chat_id, String title) { - TLRPC.TL_messages_editChatTitle req = new TLRPC.TL_messages_editChatTitle(); - req.chat_id = chat_id; - req.title = title; - ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(TLObject response, TLRPC.TL_error error) { - if (error != null) { - return; - } - final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; - MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); + if (chat_id > 0) { + TLRPC.TL_messages_editChatTitle req = new TLRPC.TL_messages_editChatTitle(); + req.chat_id = chat_id; + req.title = title; + ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + if (error != null) { + return; + } + final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response; + MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true); - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - for (TLRPC.User user : res.users) { - users.put(user.id, user); - if (user.id == UserConfig.getClientUserId()) { - UserConfig.setCurrentUser(user); + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + for (TLRPC.User user : res.users) { + users.put(user.id, user); + if (user.id == UserConfig.getClientUserId()) { + UserConfig.setCurrentUser(user); + } } - } - for (TLRPC.Chat chat : res.chats) { + for (TLRPC.Chat chat : res.chats) { + chats.put(chat.id, chat); + } + final ArrayList messagesObj = new ArrayList(); + messagesObj.add(new MessageObject(res.message, users)); + TLRPC.Chat chat = res.chats.get(0); chats.put(chat.id, chat); + updateInterfaceWithMessages(-chat.id, messagesObj); + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_NAME); } - final ArrayList messagesObj = new ArrayList(); - messagesObj.add(new MessageObject(res.message, users)); - TLRPC.Chat chat = res.chats.get(0); - chats.put(chat.id, chat); - updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); - NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_NAME); - } - }); + }); - final ArrayList messages = new ArrayList(); - messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true); - if (MessagesStorage.lastSeqValue + 1 == res.seq) { - MessagesStorage.lastSeqValue = res.seq; - MessagesStorage.lastPtsValue = res.pts; - MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); - } else if (MessagesStorage.lastSeqValue != res.seq) { - FileLog.e("tmessages", "need get diff TL_messages_editChatTitle, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); - if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { - if (updatesStartWaitTime == 0) { - updatesStartWaitTime = System.currentTimeMillis(); + final ArrayList messages = new ArrayList(); + messages.add(res.message); + MessagesStorage.getInstance().putMessages(messages, true, true, false); + if (MessagesStorage.lastSeqValue + 1 == res.seq) { + MessagesStorage.lastSeqValue = res.seq; + MessagesStorage.lastPtsValue = res.pts; + MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); + } else if (MessagesStorage.lastSeqValue != res.seq) { + FileLog.e("tmessages", "need get diff TL_messages_editChatTitle, seq: " + MessagesStorage.lastSeqValue + " " + res.seq); + if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { + if (updatesStartWaitTime == 0) { + updatesStartWaitTime = System.currentTimeMillis(); + } + FileLog.e("tmessages", "add TL_messages_editChatTitle to queue"); + UserActionUpdates updates = new UserActionUpdates(); + updates.seq = res.seq; + updatesQueue.add(updates); + } else { + getDifference(); } - FileLog.e("tmessages", "add TL_messages_editChatTitle to queue"); - UserActionUpdates updates = new UserActionUpdates(); - updates.seq = res.seq; - updatesQueue.add(updates); - } else { - getDifference(); } } - } - }); + }); + } else { + TLRPC.Chat chat = chats.get(chat_id); + chat.title = title; + ArrayList chatArrayList = new ArrayList(); + chatArrayList.add(chat); + MessagesStorage.getInstance().putUsersAndChats(null, chatArrayList, true, true); + NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_CHAT_NAME); + } } public void changeChatAvatar(int chat_id, TLRPC.InputFile uploadedAvatar) { @@ -3067,7 +3363,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter final ArrayList messages = new ArrayList(); messages.add(res.message); - MessagesStorage.getInstance().putMessages(messages, true, true); + MessagesStorage.getInstance().putMessages(messages, true, true, false); if (MessagesStorage.lastSeqValue + 1 == res.seq) { MessagesStorage.lastSeqValue = res.seq; MessagesStorage.lastPtsValue = res.pts; @@ -3197,6 +3493,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage.lastPtsValue = res.pts; MessagesStorage.lastSeqValue = res.seq; MessagesStorage.lastQtsValue = res.qts; + processUpdatesQueue(2); MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); } else { if (error.code != 401) { @@ -3215,7 +3512,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - private void processUpdatesQueue(boolean getDifference) { + private void processUpdatesQueue(int state) { if (!updatesQueue.isEmpty()) { Collections.sort(updatesQueue, new Comparator() { @Override @@ -3231,6 +3528,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); boolean anyProceed = false; + if (state == 2) { + TLRPC.Updates updates = updatesQueue.get(0); + MessagesStorage.lastSeqValue = getUpdateSeq(updates); + } for (int a = 0; a < updatesQueue.size(); a++) { TLRPC.Updates updates = updatesQueue.get(a); int seq = getUpdateSeq(updates); @@ -3261,7 +3562,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter updatesQueue.clear(); FileLog.e("tmessages", "UPDATES QUEUE PROCEED - OK"); updatesStartWaitTime = 0; - if (getDifference) { + if (state == 1) { final int stateCopy = ConnectionsManager.getInstance().getConnectionState(); Utilities.RunOnUIThread(new Runnable() { @Override @@ -3271,7 +3572,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter }); } } else { - if (getDifference) { + if (state == 1) { final int stateCopy = ConnectionsManager.getInstance().getConnectionState(); Utilities.RunOnUIThread(new Runnable() { @Override @@ -3395,7 +3696,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter final ArrayList pushMessages = new ArrayList(); for (TLRPC.Message message : res.new_messages) { - MessageObject obj = new MessageObject(message, usersDict); + MessageObject obj = new MessageObject(message, usersDict, 2); long dialog_id = obj.messageOwner.dialog_id; if (dialog_id == 0) { @@ -3442,16 +3743,21 @@ public class MessagesController implements NotificationCenter.NotificationCenter updateInterfaceWithMessages(key, value); } NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); - if (!pushMessages.isEmpty()) { - NotificationsController.getInstance().processNewMessages(pushMessages, !(res instanceof TLRPC.TL_updates_differenceSlice)); - } } }); MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { @Override public void run() { + if (!pushMessages.isEmpty()) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + NotificationsController.getInstance().processNewMessages(pushMessages, !(res instanceof TLRPC.TL_updates_differenceSlice)); + } + }); + } MessagesStorage.getInstance().startTransaction(false); - MessagesStorage.getInstance().putMessages(res.new_messages, false, false); + MessagesStorage.getInstance().putMessages(res.new_messages, false, false, false); MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, false, false); MessagesStorage.getInstance().commitTransaction(false); } @@ -3469,7 +3775,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage.lastPtsValue = res.state.pts; MessagesStorage.lastQtsValue = res.state.qts; ConnectionsManager.getInstance().setConnectionState(0); - processUpdatesQueue(true); + processUpdatesQueue(1); } else if (res instanceof TLRPC.TL_updates_differenceSlice) { MessagesStorage.lastDateValue = res.intermediate_state.date; MessagesStorage.lastPtsValue = res.intermediate_state.pts; @@ -3480,7 +3786,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter MessagesStorage.lastSeqValue = res.seq; MessagesStorage.lastDateValue = res.date; ConnectionsManager.getInstance().setConnectionState(0); - processUpdatesQueue(true); + processUpdatesQueue(1); } MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue); FileLog.e("tmessages", "received difference with date = " + MessagesStorage.lastDateValue + " pts = " + MessagesStorage.lastPtsValue + " seq = " + MessagesStorage.lastSeqValue); @@ -3544,14 +3850,25 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (printUpdate) { NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_USER_PRINT); } - if (!obj.isFromMe() && obj.isUnread()) { - NotificationsController.getInstance().processNewMessages(objArr, true); - } + updateInterfaceWithMessages(-updates.chat_id, objArr); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); } }); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + if (!obj.isFromMe() && obj.isUnread()) { + NotificationsController.getInstance().processNewMessages(objArr, true); + } + } + }); + } + }); + MessagesStorage.getInstance().putMessages(arr, false, true, false); } else if (MessagesStorage.lastSeqValue != updates.seq) { FileLog.e("tmessages", "need get diff TL_updateShortChatMessage, seq: " + MessagesStorage.lastSeqValue + " " + updates.seq); if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { @@ -3599,14 +3916,24 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (printUpdate) { NotificationCenter.getInstance().postNotificationName(updateInterfaces, UPDATE_MASK_USER_PRINT); } - if (!obj.isFromMe() && obj.isUnread()) { - NotificationsController.getInstance().processNewMessages(objArr, true); - } updateInterfaceWithMessages(updates.from_id, objArr); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); } }); - MessagesStorage.getInstance().putMessages(arr, false, true); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + if (!obj.isFromMe() && obj.isUnread()) { + NotificationsController.getInstance().processNewMessages(objArr, true); + } + } + }); + } + }); + MessagesStorage.getInstance().putMessages(arr, false, true, false); } else if (MessagesStorage.lastSeqValue != updates.seq) { FileLog.e("tmessages", "need get diff TL_updateShortMessage, seq: " + MessagesStorage.lastSeqValue + " " + updates.seq); if (gettingDifference || updatesStartWaitTime == 0 || updatesStartWaitTime != 0 && updatesStartWaitTime + 1500 > System.currentTimeMillis()) { @@ -3692,7 +4019,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (needGetDiff && !fromQueue) { getDifference(); } else if (!fromQueue && !updatesQueue.isEmpty()) { - processUpdatesQueue(false); + processUpdatesQueue(0); } if (needReceivedQueue) { TLRPC.TL_messages_receivedQueue req = new TLRPC.TL_messages_receivedQueue(); @@ -3779,7 +4106,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } messagesArr.add(upd.message); - MessageObject obj = new MessageObject(upd.message, usersDict); + MessageObject obj = new MessageObject(upd.message, usersDict, 2); if (obj.type == 11) { interfaceUpdateMask |= UPDATE_MASK_CHAT_AVATAR; } else if (obj.type == 10) { @@ -3928,7 +4255,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (message != null) { int cid = ((TLRPC.TL_updateNewEncryptedMessage)update).message.chat_id; messagesArr.add(message); - MessageObject obj = new MessageObject(message, usersDict); + MessageObject obj = new MessageObject(message, usersDict, 2); long uid = ((long)cid) << 32; ArrayList arr = messages.get(uid); if (arr == null) { @@ -4014,7 +4341,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); for (TLRPC.TL_dialog d : dialogs) { - if ((int)d.id != 0) { + int high_id = (int)(d.id >> 32); + if ((int)d.id != 0 && high_id != 1) { dialogsServerOnly.add(d); } } @@ -4076,8 +4404,22 @@ public class MessagesController implements NotificationCenter.NotificationCenter ContactsController.getInstance().processContactsUpdates(contactsIds, usersDict); } + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + if (!pushMessages.isEmpty()) { + NotificationsController.getInstance().processNewMessages(pushMessages, true); + } + } + }); + } + }); + if (!messagesArr.isEmpty()) { - MessagesStorage.getInstance().putMessages(messagesArr, true, true); + MessagesStorage.getInstance().putMessages(messagesArr, true, true, false); } Utilities.RunOnUIThread(new Runnable() { @@ -4131,7 +4473,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } else { editor.remove("notify2_" + dialog_id); } - } else if (update.peer instanceof TLRPC.TL_notifyChats) { + }/* else if (update.peer instanceof TLRPC.TL_notifyChats) { disable global settings sync if (editor == null) { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); editor = preferences.edit(); @@ -4145,7 +4487,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } editor.putBoolean("EnableAll", update.notify_settings.mute_until == 0); editor.putBoolean("EnablePreviewAll", update.notify_settings.show_previews); - } + }*/ } } if (editor != null) { @@ -4164,44 +4506,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter } NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); } - if (!pushMessages.isEmpty()) { - NotificationsController.getInstance().processNewMessages(pushMessages, true); - } - if (!markAsReadMessages.isEmpty()) { - for (Integer id : markAsReadMessages) { - MessageObject obj = dialogMessage.get(id); - if (obj != null) { - obj.messageOwner.unread = false; - updateMask |= UPDATE_MASK_READ_DIALOG_MESSAGE; - } - } - } - if (!markAsReadEncrypted.isEmpty()) { - for (HashMap.Entry entry : markAsReadEncrypted.entrySet()) { - NotificationCenter.getInstance().postNotificationName(messagesReadedEncrypted, entry.getKey(), entry.getValue()); - long dialog_id = (long)(entry.getKey()) << 32; - TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id); - if (dialog != null) { - MessageObject message = dialogMessage.get(dialog.top_message); - if (message != null && message.messageOwner.date <= entry.getValue()) { - message.messageOwner.unread = false; - updateMask |= UPDATE_MASK_READ_DIALOG_MESSAGE; - } - } - } - } - if (!markAsReadMessages.isEmpty()) { - NotificationsController.getInstance().processReadMessages(markAsReadMessages, 0, 0, 0); - } - if (!deletedMessages.isEmpty()) { - NotificationCenter.getInstance().postNotificationName(messagesDeleted, deletedMessages); - for (Integer id : deletedMessages) { - MessageObject obj = dialogMessage.get(id); - if (obj != null) { - obj.deleted = true; - } - } - } if (printChangedArg) { updateMask |= UPDATE_MASK_USER_PRINT; } @@ -4221,21 +4525,55 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); - if (!markAsReadMessages.isEmpty() || !markAsReadEncrypted.isEmpty()) { - MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { - @Override - public void run() { - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - if (!markAsReadMessages.isEmpty()) { - NotificationCenter.getInstance().postNotificationName(messagesReaded, markAsReadMessages); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + int updateMask = 0; + if (!markAsReadMessages.isEmpty()) { + NotificationCenter.getInstance().postNotificationName(messagesReaded, markAsReadMessages); + NotificationsController.getInstance().processReadMessages(markAsReadMessages, 0, 0, 0); + + for (Integer id : markAsReadMessages) { + MessageObject obj = dialogMessage.get(id); + if (obj != null) { + obj.messageOwner.unread = false; + updateMask |= UPDATE_MASK_READ_DIALOG_MESSAGE; + } } } - }); - } - }); - } + if (!markAsReadEncrypted.isEmpty()) { + for (HashMap.Entry entry : markAsReadEncrypted.entrySet()) { + NotificationCenter.getInstance().postNotificationName(messagesReadedEncrypted, entry.getKey(), entry.getValue()); + long dialog_id = (long)(entry.getKey()) << 32; + TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id); + if (dialog != null) { + MessageObject message = dialogMessage.get(dialog.top_message); + if (message != null && message.messageOwner.date <= entry.getValue()) { + message.messageOwner.unread = false; + updateMask |= UPDATE_MASK_READ_DIALOG_MESSAGE; + } + } + } + } + if (!deletedMessages.isEmpty()) { + NotificationCenter.getInstance().postNotificationName(messagesDeleted, deletedMessages); + for (Integer id : deletedMessages) { + MessageObject obj = dialogMessage.get(id); + if (obj != null) { + obj.deleted = true; + } + } + } + if (updateMask != 0) { + NotificationCenter.getInstance().postNotificationName(updateInterfaces, updateMask); + } + } + }); + } + }); if (!markAsReadMessages.isEmpty() || !markAsReadEncrypted.isEmpty()) { if (!markAsReadMessages.isEmpty()) { @@ -4312,6 +4650,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter } private void updateInterfaceWithMessages(long uid, ArrayList messages) { + updateInterfaceWithMessages(uid, messages, false); + } + + private void updateInterfaceWithMessages(final long uid, final ArrayList messages, boolean isBroadcast) { MessageObject lastMessage = null; TLRPC.TL_dialog dialog = dialogs_dict.get(uid); @@ -4328,24 +4670,28 @@ public class MessagesController implements NotificationCenter.NotificationCenter boolean changed = false; if (dialog == null) { - dialog = new TLRPC.TL_dialog(); - dialog.id = uid; - dialog.unread_count = 0; - dialog.top_message = lastMessage.messageOwner.id; - dialog.last_message_date = lastMessage.messageOwner.date; - dialogs_dict.put(uid, dialog); - dialogs.add(dialog); - dialogMessage.put(lastMessage.messageOwner.id, lastMessage); - changed = true; + if (!isBroadcast) { + dialog = new TLRPC.TL_dialog(); + dialog.id = uid; + dialog.unread_count = 0; + dialog.top_message = lastMessage.messageOwner.id; + dialog.last_message_date = lastMessage.messageOwner.date; + dialogs_dict.put(uid, dialog); + dialogs.add(dialog); + dialogMessage.put(lastMessage.messageOwner.id, lastMessage); + changed = true; + } } else { if (dialog.top_message > 0 && lastMessage.messageOwner.id > 0 && lastMessage.messageOwner.id > dialog.top_message || dialog.top_message < 0 && lastMessage.messageOwner.id < 0 && lastMessage.messageOwner.id < dialog.top_message || dialog.last_message_date < lastMessage.messageOwner.date) { dialogMessage.remove(dialog.top_message); dialog.top_message = lastMessage.messageOwner.id; - dialog.last_message_date = lastMessage.messageOwner.date; + if (!isBroadcast) { + dialog.last_message_date = lastMessage.messageOwner.date; + changed = true; + } dialogMessage.put(lastMessage.messageOwner.id, lastMessage); - changed = true; } } @@ -4364,7 +4710,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); for (TLRPC.TL_dialog d : dialogs) { - if ((int)d.id != 0) { + int high_id = (int)(d.id >> 32); + if ((int)d.id != 0 && high_id != 1) { dialogsServerOnly.add(d); } } @@ -4411,7 +4758,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter TLObject object = TLClassStore.Instance().TLdeserialize(is, is.readInt32()); BuffersStorage.getInstance().reuseFreeBuffer(is); if (object != null) { - int from_id = chat.admin_id; if (from_id == UserConfig.getClientUserId()) { from_id = chat.participant_id; @@ -4592,8 +4938,23 @@ public class MessagesController implements NotificationCenter.NotificationCenter public void run() { TLRPC.TL_dialog dialog = dialogs_dict.get(did); if (dialog != null) { + dialog.unread_count = 0; dialogMessage.remove(dialog.top_message); } + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + NotificationsController.getInstance().processReadMessages(null, did, 0, Integer.MAX_VALUE); + HashMap dialogsToUpdate = new HashMap(); + dialogsToUpdate.put(did, 0); + NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate, true); + } + }); + } + }); MessagesStorage.getInstance().deleteDialog(did, true); NotificationCenter.getInstance().postNotificationName(removeAllMessagesFromDialog, did); NotificationCenter.getInstance().postNotificationName(dialogsNeedReload); @@ -4605,6 +4966,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter pendingEncMessagesToDelete.addAll(serviceMessage.action.random_ids); } return null; + } else { + return null; } } else { FileLog.e("tmessages", "unkown message " + object); @@ -4613,9 +4976,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter FileLog.e("tmessages", "unkown TLObject"); } } else { + BuffersStorage.getInstance().reuseFreeBuffer(is); FileLog.e("tmessages", "fingerprint mismatch"); } - BuffersStorage.getInstance().reuseFreeBuffer(is); return null; } @@ -4881,7 +5244,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter } }); for (TLRPC.TL_dialog d : dialogs) { - if ((int) d.id != 0) { + int high_id = (int)(d.id >> 32); + if ((int)d.id != 0 && high_id != 1) { dialogsServerOnly.add(d); } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java index 35378986..4d502911 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java @@ -191,7 +191,7 @@ public class MessagesStorage { } } - public void cleanUp() { + public void cleanUp(final boolean isLogin) { storageQueue.cleanupQueue(); storageQueue.postRunnable(new Runnable() { @Override @@ -217,8 +217,15 @@ public class MessagesStorage { cacheFile.delete(); cacheFile = null; } - storageQueue.cleanupQueue(); openDatabase(); + if (isLogin) { + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + MessagesController.getInstance().getDifference(); + } + }); + } } }); } @@ -358,7 +365,19 @@ public class MessagesStorage { if (!messagesOnly) { database.executeFast("DELETE FROM dialogs WHERE did = " + did).stepThis().dispose(); database.executeFast("DELETE FROM chat_settings WHERE uid = " + did).stepThis().dispose(); + int lower_id = (int)did; + int high_id = (int)(did >> 32); + if (lower_id != 0) { + if (high_id == 1) { + database.executeFast("DELETE FROM chats WHERE uid = " + lower_id).stepThis().dispose(); + } else if (lower_id < 0) { + database.executeFast("DELETE FROM chats WHERE uid = " + (-lower_id)).stepThis().dispose(); + } + } else { + database.executeFast("DELETE FROM enc_chats WHERE uid = " + high_id).stepThis().dispose(); + } } + database.executeFast("UPDATE dialogs SET unread_count = 0 WHERE did = " + did).stepThis().dispose(); database.executeFast("DELETE FROM media_counts WHERE uid = " + did).stepThis().dispose(); database.executeFast("DELETE FROM messages WHERE uid = " + did).stepThis().dispose(); database.executeFast("DELETE FROM media WHERE uid = " + did).stepThis().dispose(); @@ -699,6 +718,11 @@ public class MessagesStorage { } } } else { + for (TLRPC.TL_chatParticipant part : info.participants) { + if (part.user_id == user_id) { + return; + } + } TLRPC.TL_chatParticipant participant = new TLRPC.TL_chatParticipant(); participant.user_id = user_id; participant.inviter_id = invited_id; @@ -731,7 +755,7 @@ public class MessagesStorage { }); } - public void loadChatInfo(final int chat_id) { + public void loadChatInfo(final int chat_id, final Semaphore semaphore) { storageQueue.postRunnable(new Runnable() { @Override public void run() { @@ -749,12 +773,22 @@ public class MessagesStorage { cursor.dispose(); if (info != null) { + boolean modified = false; + ArrayList usersArr = new ArrayList(); String usersToLoad = ""; - for (TLRPC.TL_chatParticipant c : info.participants) { - if (usersToLoad.length() != 0) { - usersToLoad += ","; + for (int a = 0; a < info.participants.size(); a++) { + TLRPC.TL_chatParticipant c = info.participants.get(a); + if (usersArr.contains(c.user_id)) { + info.participants.remove(a); + modified = true; + a--; + } else { + if (usersToLoad.length() != 0) { + usersToLoad += ","; + } + usersArr.add(c.user_id); + usersToLoad += c.user_id; } - usersToLoad += c.user_id; } if (usersToLoad.length() != 0) { cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, status FROM users WHERE uid IN(%s)", usersToLoad)); @@ -771,10 +805,20 @@ public class MessagesStorage { } cursor.dispose(); } + if (modified) { + updateChatInfo(chat_id, info, false); + } + } + if (semaphore != null) { + semaphore.release(); } MessagesController.getInstance().processChatInfo(chat_id, info, loadedUsers, true); } catch (Exception e) { FileLog.e("tmessages", e); + } finally { + if (semaphore != null) { + semaphore.release(); + } } } }); @@ -900,7 +944,7 @@ public class MessagesStorage { cursor.dispose(); } - cursor = database.queryFinalized("SELECT c.data, c.name FROM chats as c INNER JOIN dialogs as d ON c.uid = -d.did"); + cursor = database.queryFinalized("SELECT data, name FROM chats"); while (cursor.next()) { String name = cursor.stringValue(1); String[] args = name.split(" "); @@ -909,6 +953,9 @@ public class MessagesStorage { ByteBufferDesc data = buffersStorage.getFreeBuffer(cursor.byteArrayLength(0)); if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) { TLRPC.Chat chat = (TLRPC.Chat) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (!needEncrypted && chat.id < 0) { + continue; + } resultArrayNames.add(Utilities.generateSearchName(chat.title, null, q)); resultArray.add(chat); } @@ -918,6 +965,7 @@ public class MessagesStorage { } } cursor.dispose(); + NotificationCenter.getInstance().postNotificationName(MessagesController.reloadSearchResults, token, resultArray, resultArrayNames, encUsers); } catch (Exception e) { FileLog.e("tmessages", e); @@ -1281,14 +1329,14 @@ public class MessagesStorage { }); } - public void getMessages(final long dialog_id, final int offset, final int count, final int max_id, final int minDate, final int classGuid, final boolean from_unread, final boolean forward) { + public void getMessages(final long dialog_id, final int count, final int max_id, final int minDate, final int classGuid, final boolean from_unread, final boolean forward) { storageQueue.postRunnable(new Runnable() { @Override public void run() { TLRPC.TL_messages_messages res = new TLRPC.TL_messages_messages(); int count_unread = 0; int count_query = count; - int offset_query = offset; + int offset_query = 0; int min_unread_id = 0; int max_unread_id = 0; int max_unread_date = 0; @@ -1447,7 +1495,7 @@ public class MessagesStorage { res.users.clear(); FileLog.e("tmessages", e); } finally { - MessagesController.getInstance().processLoadedMessages(res, dialog_id, offset, count_query, max_id, true, classGuid, min_unread_id, max_unread_id, count_unread, max_unread_date, forward); + MessagesController.getInstance().processLoadedMessages(res, dialog_id, count_query, max_id, true, classGuid, min_unread_id, max_unread_id, count_unread, max_unread_date, forward); } } }); @@ -1800,7 +1848,7 @@ public class MessagesStorage { } } - private void putMessagesInternal(final ArrayList messages, final boolean withTransaction) { + private void putMessagesInternal(final ArrayList messages, final boolean withTransaction, final boolean isBroadcast) { try { if (withTransaction) { database.beginTransaction(); @@ -1941,10 +1989,21 @@ public class MessagesStorage { state.dispose(); state2.dispose(); state3.dispose(); - state = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ifnull((SELECT unread_count FROM dialogs WHERE did = ?), 0) + ?, ?)"); + + state = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?)"); for (HashMap.Entry pair : messagesMap.entrySet()) { - state.requery(); Long key = pair.getKey(); + + int dialog_date = 0; + int old_unread_count = 0; + SQLiteCursor cursor = database.queryFinalized("SELECT date, unread_count FROM dialogs WHERE did = " + key); + if (cursor.next()) { + dialog_date = cursor.intValue(0); + old_unread_count = cursor.intValue(1); + } + cursor.dispose(); + + state.requery(); TLRPC.Message value = pair.getValue(); Integer unread_count = messagesCounts.get(key); if (unread_count == null) { @@ -1955,10 +2014,13 @@ public class MessagesStorage { messageId = value.local_id; } state.bindLong(1, key); - state.bindInteger(2, value.date); - state.bindLong(3, key); - state.bindInteger(4, unread_count); - state.bindInteger(5, messageId); + if (!isBroadcast) { + state.bindInteger(2, value.date); + } else { + state.bindInteger(2, dialog_date != 0 ? dialog_date : value.date); + } + state.bindInteger(3, old_unread_count + unread_count); + state.bindInteger(4, messageId); state.step(); } state.dispose(); @@ -1994,7 +2056,7 @@ public class MessagesStorage { } } - public void putMessages(final ArrayList messages, final boolean withTransaction, boolean useQueue) { + public void putMessages(final ArrayList messages, final boolean withTransaction, boolean useQueue, final boolean isBroadcast) { if (messages.size() == 0) { return; } @@ -2002,11 +2064,11 @@ public class MessagesStorage { storageQueue.postRunnable(new Runnable() { @Override public void run() { - putMessagesInternal(messages, withTransaction); + putMessagesInternal(messages, withTransaction, isBroadcast); } }); } else { - putMessagesInternal(messages, withTransaction); + putMessagesInternal(messages, withTransaction, isBroadcast); } } @@ -2406,20 +2468,26 @@ public class MessagesStorage { buffersStorage.reuseFreeBuffer(data); int lower_id = (int)dialog.id; + int high_id = (int)(dialog.id >> 32); if (lower_id != 0) { - if (lower_id > 0) { - if (!usersToLoad.contains(lower_id)) { - usersToLoad.add(lower_id); + if (high_id == 1) { + if (!chatsToLoad.contains(lower_id)) { + chatsToLoad.add(lower_id); } } else { - if (!chatsToLoad.contains(-lower_id)) { - chatsToLoad.add(-lower_id); + if (lower_id > 0) { + if (!usersToLoad.contains(lower_id)) { + usersToLoad.add(lower_id); + } + } else { + if (!chatsToLoad.contains(-lower_id)) { + chatsToLoad.add(-lower_id); + } } } } else { - int encryptedId = (int)(dialog.id >> 32); - if (!encryptedToLoad.contains(encryptedId)) { - encryptedToLoad.add(encryptedId); + if (!encryptedToLoad.contains(high_id)) { + encryptedToLoad.add(high_id); } } } @@ -2673,20 +2741,26 @@ public class MessagesStorage { buffersStorage.reuseFreeBuffer(data); int lower_id = (int)dialog.id; + int high_id = (int)(dialog.id >> 32); if (lower_id != 0) { - if (lower_id > 0) { - if (!usersToLoad.contains(lower_id)) { - usersToLoad.add(lower_id); + if (high_id == 1) { + if (!chatsToLoad.contains(lower_id)) { + chatsToLoad.add(lower_id); } } else { - if (!chatsToLoad.contains(-lower_id)) { - chatsToLoad.add(-lower_id); + if (lower_id > 0) { + if (!usersToLoad.contains(lower_id)) { + usersToLoad.add(lower_id); + } + } else { + if (!chatsToLoad.contains(-lower_id)) { + chatsToLoad.add(-lower_id); + } } } } else { - int encryptedId = (int)(dialog.id >> 32); - if (!encryptedToLoad.contains(encryptedId)) { - encryptedToLoad.add(encryptedId); + if (!encryptedToLoad.contains(high_id)) { + encryptedToLoad.add(high_id); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java b/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java index 970facb4..a161dc6a 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java @@ -24,9 +24,9 @@ import java.util.zip.ZipFile; public class NativeLoader { private static final long sizes[] = new long[] { - 799376, //armeabi - 848548, //armeabi-v7a - 1246260, //x86 + 803472, //armeabi + 856740, //armeabi-v7a + 1250356, //x86 0, //mips }; diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index 419d82f9..88cfffec 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -183,6 +183,8 @@ public class NotificationsController { } msg = LocaleController.formatString("NotificationGroupKickMember", R.string.NotificationGroupKickMember, Utilities.formatName(user.first_name, user.last_name), chat.title, Utilities.formatName(u2.first_name, u2.last_name)); } + } else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionChatCreate) { + msg = messageObject.messageText.toString(); } } else { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty) { @@ -305,10 +307,12 @@ public class NotificationsController { intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE); intent.setFlags(32768); if ((int)dialog_id != 0) { - if (chat_id != 0) { - intent.putExtra("chatId", chat_id); - } else if (user_id != 0) { - intent.putExtra("userId", user_id); + if (pushDialogs.size() == 1) { + if (chat_id != 0) { + intent.putExtra("chatId", chat_id); + } else if (user_id != 0) { + intent.putExtra("userId", user_id); + } } if (pushDialogs.size() == 1) { if (chat != null) { @@ -322,7 +326,9 @@ public class NotificationsController { } } } else { - intent.putExtra("encId", (int)(dialog_id >> 32)); + if (pushDialogs.size() == 1) { + intent.putExtra("encId", (int) (dialog_id >> 32)); + } } PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_ONE_SHOT); @@ -350,7 +356,6 @@ public class NotificationsController { .setContentTitle(name) .setSmallIcon(R.drawable.notification) .setAutoCancel(true) - .setContentText(detailText) .setContentIntent(contentIntent); String lastMessage = null; @@ -366,8 +371,10 @@ public class NotificationsController { message = message.replace(name + ": ", "").replace(name + " ", ""); } } + mBuilder.setContentText(message); mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message)); } else { + mBuilder.setContentText(detailText); NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle(name); int count = Math.min(10, pushMessages.size()); @@ -395,7 +402,7 @@ public class NotificationsController { } if (photoPath != null) { - Bitmap img = FileLoader.getInstance().getImageFromMemory(photoPath, null, null, "50_50", false); + Bitmap img = FileLoader.getInstance().getImageFromMemory(photoPath, null, null, "50_50"); if (img != null) { mBuilder.setLargeIcon(img); } @@ -417,6 +424,8 @@ public class NotificationsController { } if (needVibrate) { mBuilder.setVibrate(new long[]{0, 100, 0, 100}); + } else { + mBuilder.setVibrate(new long[]{0, 0}); } } else { mBuilder.setVibrate(new long[]{0, 0}); @@ -485,7 +494,7 @@ public class NotificationsController { remove = true; } } else { - if (messageObject.messageOwner.id <= max_id) { + if (messageObject.messageOwner.id <= max_id || max_id < 0) { remove = true; } } @@ -501,9 +510,6 @@ public class NotificationsController { if (oldCount != popupMessages.size()) { NotificationCenter.getInstance().postNotificationName(pushMessagesUpdated); } -// if (readMessages != null || oldCount2 != pushMessages.size() || readMessages == null && dialog_id == 0) { -// showOrUpdateNotification(notifyCheck); -// } } public void processNewMessages(ArrayList messageObjects, boolean isLast) { @@ -529,7 +535,7 @@ public class NotificationsController { Boolean value = settingsCache.get(dialog_id); boolean isChat = (int)dialog_id < 0; - popup = preferences.getInt(isChat ? "popupGroup" : "popupAll", 0); + popup = (int)dialog_id == 0 ? 0 : preferences.getInt(isChat ? "popupGroup" : "popupAll", 0); if (value == null) { int notify_override = preferences.getInt("notify2_" + dialog_id, 0); value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0); @@ -569,32 +575,41 @@ public class NotificationsController { int notify_override = preferences.getInt("notify2_" + dialog_id, 0); boolean isChat = (int)dialog_id < 0; Integer currentCount = pushDialogs.get(dialog_id); - if (!(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0)) { - Integer newCount = entry.getValue(); - if (replace) { - if (currentCount != null) { - total_unread_count -= currentCount; - } - if (newCount == 0) { - pushDialogs.remove(dialog_id); - } else { - total_unread_count += newCount; - pushDialogs.put(dialog_id, newCount); - } - } else { - if (currentCount == null) { - currentCount = 0; - } - currentCount += newCount; - total_unread_count += newCount; - pushDialogs.put(dialog_id, currentCount); + boolean canAddValue = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0); + + Integer newCount = entry.getValue(); + if (replace) { + if (currentCount != null) { + total_unread_count -= currentCount; } + if (newCount == 0) { + pushDialogs.remove(dialog_id); + for (int a = 0; a < pushMessages.size(); a++) { + MessageObject messageObject = pushMessages.get(a); + if (messageObject.getDialogId() == dialog_id) { + pushMessages.remove(a); + a--; + pushMessagesDict.remove(messageObject.messageOwner.id); + popupMessages.remove(messageObject); + } + } + } else if (canAddValue) { + total_unread_count += newCount; + pushDialogs.put(dialog_id, newCount); + } + } else if (canAddValue) { + if (currentCount == null) { + currentCount = 0; + } + currentCount += newCount; + total_unread_count += newCount; + pushDialogs.put(dialog_id, currentCount); } } if (old_unread_count != total_unread_count) { showOrUpdateNotification(notifyCheck); - notifyCheck = false; } + notifyCheck = false; if (preferences.getBoolean("badgeNumber", true)) { setBadge(ApplicationLoader.applicationContext, total_unread_count); } @@ -604,7 +619,6 @@ public class NotificationsController { pushDialogs.clear(); total_unread_count = 0; SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); - String dialogsToLoad = ""; for (HashMap.Entry entry : dialogs.entrySet()) { long dialog_id = entry.getKey(); int notify_override = preferences.getInt("notify2_" + dialog_id, 0); @@ -612,10 +626,6 @@ public class NotificationsController { if (!(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0)) { pushDialogs.put(dialog_id, entry.getValue()); total_unread_count += entry.getValue(); - if (dialogsToLoad.length() != 0) { - dialogsToLoad += ","; - } - dialogsToLoad += "" + dialog_id; } } if (total_unread_count == 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java index 8af9e0ec..f3b44c33 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java @@ -781,6 +781,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. processRequestQueue(RPCRequest.RPCRequestClassTransportMask, 0); } + MessagesController.getInstance().updateConfig(config); } updatingDcSettings = false; } @@ -850,7 +851,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. } public long performRpc(final TLObject rpc, final RPCRequest.RPCRequestDelegate completionBlock, final RPCRequest.RPCQuickAckDelegate quickAckBlock, final boolean requiresCompletion, final int requestClass, final int datacenterId, final boolean runQueue) { - if (!UserConfig.isClientActivated() && (requestClass & RPCRequest.RPCRequestClassWithoutLogin) == 0) { + if (rpc == null || !UserConfig.isClientActivated() && (requestClass & RPCRequest.RPCRequestClassWithoutLogin) == 0) { FileLog.e("tmessages", "can't do request without login " + rpc); return 0; } @@ -1752,7 +1753,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. } private void registerForPush() { - if (registeringForPush) { + if (registeringForPush || !UserConfig.isClientActivated()) { return; } UserConfig.registeredForInternalPush = false; @@ -1805,6 +1806,8 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. UserConfig.saveConfig(false); saveSession(); FileLog.e("tmessages", "registered for internal push"); + } else { + UserConfig.registeredForInternalPush = false; } registeringForPush = false; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index cf54747f..11cbb918 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -10,16 +10,17 @@ package org.telegram.messenger; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.AsyncTask; import android.provider.MediaStore; import org.telegram.android.AndroidUtilities; import org.telegram.ui.ApplicationLoader; import java.io.RandomAccessFile; -import java.net.URL; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; +import java.net.URL; import java.net.URLConnection; import java.nio.channels.FileChannel; import java.util.ArrayList; @@ -57,9 +58,8 @@ public class FileLoadOperation { private String ext; private String httpUrl; - private URLConnection httpConnection; + private DownloadImageTask httpTask = null; public boolean needBitmapCreate = true; - private InputStream httpConnectionStream; private RandomAccessFile fileOutputStream; private RandomAccessFile fiv; @@ -69,6 +69,109 @@ public class FileLoadOperation { public abstract void didChangedLoadProgress(FileLoadOperation operation, float progress); } + private class DownloadImageTask extends AsyncTask { + protected Boolean doInBackground(String... urls) { + String url = urls[0]; + + InputStream httpConnectionStream = null; + + try { + URL downloadUrl = new URL(url); + URLConnection httpConnection = downloadUrl.openConnection(); + httpConnection.setConnectTimeout(5000); + httpConnection.setReadTimeout(5000); + httpConnection.connect(); + httpConnectionStream = httpConnection.getInputStream(); + /*String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%"; + String str = Uri.encode(url, ALLOWED_URI_CHARS); + HttpClient httpclient = new DefaultHttpClient(); + HttpGet request = new HttpGet(str); + + httpConnectionStream = httpclient.execute(request).getEntity().getContent();*/ + } catch (Exception e) { + FileLog.e("tmessages", e); + cleanup(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + delegate.didFailedLoadingFile(FileLoadOperation.this); + } + }); + return false; + } + + byte[] data = new byte[1024 * 2]; + while (true) { + if (isCancelled()) { + break; + } + try { + int readed = httpConnectionStream.read(data); + if (readed > 0) { + fileOutputStream.write(data, 0, readed); + } else if (readed == -1) { + FileLoader.fileLoaderQueue.postRunnable(new Runnable() { + @Override + public void run() { + cleanup(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + try { + onFinishLoadingFile(); + } catch (Exception e) { + delegate.didFailedLoadingFile(FileLoadOperation.this); + } + } + }); + } + }); + break; + } else { + FileLoader.fileLoaderQueue.postRunnable(new Runnable() { + @Override + public void run() { + cleanup(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + delegate.didFailedLoadingFile(FileLoadOperation.this); + } + }); + } + }); + break; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + FileLoader.fileLoaderQueue.postRunnable(new Runnable() { + @Override + public void run() { + cleanup(); + Utilities.stageQueue.postRunnable(new Runnable() { + @Override + public void run() { + delegate.didFailedLoadingFile(FileLoadOperation.this); + } + }); + } + }); + } + } + + try { + if (httpConnectionStream != null) { + httpConnectionStream.close(); + } + httpConnectionStream = null; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + return true; + } + } + public FileLoadOperation(TLRPC.FileLocation fileLocation) { if (fileLocation instanceof TLRPC.TL_fileEncryptedLocation) { location = new TLRPC.TL_inputEncryptedFileLocation(); @@ -248,10 +351,14 @@ public class FileLoadOperation { float w_filter = 0; float h_filter = 0; + boolean blur = false; if (filter != null) { String args[] = filter.split("_"); w_filter = Float.parseFloat(args[0]) * AndroidUtilities.density; h_filter = Float.parseFloat(args[1]) * AndroidUtilities.density; + if (args.length > 2) { + blur = true; + } opts.inJustDecodeBounds = true; if (mediaIdFinal != null) { @@ -270,7 +377,7 @@ public class FileLoadOperation { opts.inSampleSize = (int)scaleFactor; } - if (filter == null) { + if (filter == null || blur) { opts.inPreferredConfig = Bitmap.Config.ARGB_8888; } else { opts.inPreferredConfig = Bitmap.Config.RGB_565; @@ -300,7 +407,9 @@ public class FileLoadOperation { image = scaledBitmap; } } - + if (image != null && blur && bitmapH < 100 && bitmapW < 100) { + Utilities.blurBitmap(image, (int)bitmapW, (int)bitmapH, image.getRowBytes()); + } } if (FileLoader.getInstance().runtimeHack != null) { FileLoader.getInstance().runtimeHack.trackFree(image.getRowBytes() * image.getHeight()); @@ -400,7 +509,6 @@ public class FileLoadOperation { } } }); - } } } @@ -428,14 +536,8 @@ public class FileLoadOperation { private void cleanup() { if (httpUrl != null) { - try { - if (httpConnectionStream != null) { - httpConnectionStream.close(); - } - httpConnection = null; - httpConnectionStream = null; - } catch (Exception e) { - FileLog.e("tmessages", e); + if (httpTask != null) { + httpTask.cancel(true); } } else { try { @@ -494,10 +596,14 @@ public class FileLoadOperation { float w_filter = 0; float h_filter; + boolean blur = false; if (filter != null) { String args[] = filter.split("_"); w_filter = Float.parseFloat(args[0]) * AndroidUtilities.density; h_filter = Float.parseFloat(args[1]) * AndroidUtilities.density; + if (args.length > 2) { + blur = true; + } opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(cacheFileFinal.getAbsolutePath(), opts); @@ -511,7 +617,7 @@ public class FileLoadOperation { opts.inSampleSize = (int) scaleFactor; } - if (filter == null) { + if (filter == null || blur) { opts.inPreferredConfig = Bitmap.Config.ARGB_8888; } else { opts.inPreferredConfig = Bitmap.Config.RGB_565; @@ -540,7 +646,9 @@ public class FileLoadOperation { image = scaledBitmap; } } - + if (image != null && blur && bitmapH < 100 && bitmapW < 100) { + Utilities.blurBitmap(image, (int)bitmapW, (int)bitmapH, image.getRowBytes()); + } } if (image != null && FileLoader.getInstance().runtimeHack != null) { FileLoader.getInstance().runtimeHack.trackFree(image.getRowBytes() * image.getHeight()); @@ -565,68 +673,11 @@ public class FileLoadOperation { if (state != 1) { return; } - if (httpConnection == null) { - try { - URL downloadUrl = new URL(httpUrl); - httpConnection = downloadUrl.openConnection(); - httpConnection.setConnectTimeout(5000); - httpConnection.setReadTimeout(5000); - httpConnection.connect(); - httpConnectionStream = httpConnection.getInputStream(); - } catch (Exception e) { - FileLog.e("tmessages", e); - cleanup(); - Utilities.stageQueue.postRunnable(new Runnable() { - @Override - public void run() { - delegate.didFailedLoadingFile(FileLoadOperation.this); - } - }); - return; - } - } - - try { - byte[] data = new byte[1024 * 2]; - int readed = httpConnectionStream.read(data); - if (readed > 0) { - fileOutputStream.write(data, 0, readed); - FileLoader.fileLoaderQueue.postRunnable(new Runnable() { - @Override - public void run() { - startDownloadHTTPRequest(); - } - }); - } else if (readed == -1) { - cleanup(); - Utilities.stageQueue.postRunnable(new Runnable() { - @Override - public void run() { - try { - onFinishLoadingFile(); - } catch (Exception e) { - delegate.didFailedLoadingFile(FileLoadOperation.this); - } - } - }); - } else { - cleanup(); - Utilities.stageQueue.postRunnable(new Runnable() { - @Override - public void run() { - delegate.didFailedLoadingFile(FileLoadOperation.this); - } - }); - } - } catch (Exception e) { - cleanup(); - FileLog.e("tmessages", e); - Utilities.stageQueue.postRunnable(new Runnable() { - @Override - public void run() { - delegate.didFailedLoadingFile(FileLoadOperation.this); - } - }); + httpTask = new DownloadImageTask(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + httpTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null, null, null); + } else { + httpTask.execute(null, null, null); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index fe0659d5..c46598ff 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -64,7 +64,7 @@ public class FileLoader { private long lastProgressUpdateTime = 0; private HashMap BitmapUseCounts = new HashMap(); - int lastImageNum; + private int lastImageNum = 0; public static final int FileDidUpload = 10000; public static final int FileDidFailUpload = 10001; @@ -717,15 +717,15 @@ public class FileLoader { }); } - public Bitmap getImageFromMemory(TLRPC.FileLocation url, ImageReceiver imageView, String filter, boolean cancel) { - return getImageFromMemory(url, null, imageView, filter, cancel); + public Bitmap getImageFromMemory(TLRPC.FileLocation url, ImageReceiver imageView, String filter) { + return getImageFromMemory(url, null, imageView, filter); } - public Bitmap getImageFromMemory(String url, ImageReceiver imageView, String filter, boolean cancel) { - return getImageFromMemory(null, url, imageView, filter, cancel); + public Bitmap getImageFromMemory(String url, ImageReceiver imageView, String filter) { + return getImageFromMemory(null, url, imageView, filter); } - public Bitmap getImageFromMemory(TLRPC.FileLocation url, String httpUrl, ImageReceiver imageView, String filter, boolean cancel) { + public Bitmap getImageFromMemory(TLRPC.FileLocation url, String httpUrl, ImageReceiver imageView, String filter) { if (url == null && httpUrl == null) { return null; } @@ -739,11 +739,7 @@ public class FileLoader { key += "@" + filter; } - Bitmap img = imageFromKey(key); - if (imageView != null && img != null && cancel) { - cancelLoadingForImageView(imageView); - } - return img; + return imageFromKey(key); } private void performReplace(String oldKey, String newKey) { @@ -1105,8 +1101,13 @@ public class FileLoader { return null; } float scaleFactor = Math.max(photoW / maxWidth, photoH / maxHeight); + int w = (int)(photoW / scaleFactor); + int h = (int)(photoH / scaleFactor); + if (h == 0 || w == 0) { + return null; + } - Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, (int)(photoW / scaleFactor), (int)(photoH / scaleFactor), true); + Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, w, h, true); TLRPC.TL_fileLocation location = new TLRPC.TL_fileLocation(); location.volume_id = Integer.MIN_VALUE; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java index 35d460d1..ab0a52c9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java @@ -63,12 +63,12 @@ public class FileLog { e.printStackTrace(); } try { + logQueue = new DispatchQueue("logQueue"); currentFile.createNewFile(); FileOutputStream stream = new FileOutputStream(currentFile); streamWriter = new OutputStreamWriter(stream); streamWriter.write("-----start log " + dateFormat.format(System.currentTimeMillis()) + "-----\n"); streamWriter.flush(); - logQueue = new DispatchQueue("logQueue"); } catch (Exception e) { e.printStackTrace(); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java index 513417a4..43025e06 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java @@ -439,6 +439,7 @@ public class TLClassStore { classStore.put(TLRPC.TL_decryptedMessageMediaAudio_old.constructor, TLRPC.TL_decryptedMessageMediaAudio_old.class); classStore.put(TLRPC.TL_audio_old.constructor, TLRPC.TL_audio_old.class); classStore.put(TLRPC.TL_video_old.constructor, TLRPC.TL_video_old.class); + classStore.put(TLRPC.TL_messageActionCreatedBroadcastList.constructor, TLRPC.TL_messageActionCreatedBroadcastList.class); } static TLClassStore store = null; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java index a2dad78c..6c3c0eb0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java @@ -8996,6 +8996,17 @@ public class TLRPC { } } + public static class TL_messageActionCreatedBroadcastList extends MessageAction { + public static int constructor = 0x55555557; + + public void readParams(AbsSerializedData stream) { + } + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_documentEncrypted extends TL_document { public static int constructor = 0x55555556; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index 34b46978..7abb922d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -24,6 +24,7 @@ public class UserConfig { public static String pushString = ""; public static int lastSendMessageId = -210000; public static int lastLocalId = -210000; + public static int lastBroadcastId = -1; public static String contactsHash = ""; public static String importHash = ""; private final static Integer sync = 1; @@ -56,6 +57,7 @@ public class UserConfig { editor.putString("importHash", importHash); editor.putBoolean("saveIncomingPhotos", saveIncomingPhotos); editor.putInt("contactsVersion", contactsVersion); + editor.putInt("lastBroadcastId", lastBroadcastId); editor.putBoolean("registeredForInternalPush", registeredForInternalPush); if (currentUser != null) { if (withFile) { @@ -174,6 +176,7 @@ public class UserConfig { importHash = preferences.getString("importHash", ""); saveIncomingPhotos = preferences.getBoolean("saveIncomingPhotos", false); contactsVersion = preferences.getInt("contactsVersion", 0); + lastBroadcastId = preferences.getInt("lastBroadcastId", -1); registeredForInternalPush = preferences.getBoolean("registeredForInternalPush", false); String user = preferences.getString("user", null); if (user != null) { @@ -196,6 +199,7 @@ public class UserConfig { lastLocalId = -210000; lastSendMessageId = -210000; contactsVersion = 1; + lastBroadcastId = -1; saveIncomingPhotos = false; saveConfig(true); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java index 9085e859..79579de0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java @@ -132,6 +132,7 @@ public class Utilities { public native static long doPQNative(long _what); public native static void loadBitmap(String path, int[] bitmap, int scale, int format, int width, int height); + public native static void blurBitmap(Object bitmap, int width, int height, int stride); private native static void aesIgeEncryption(ByteBuffer buffer, byte[] key, byte[] iv, boolean encrypt, int offset, int length); public static void aesIgeEncryption(ByteBuffer buffer, byte[] key, byte[] iv, boolean encrypt, boolean changeIv, int offset, int length) { @@ -139,6 +140,9 @@ public class Utilities { } public static Integer parseInt(String value) { + if (value == null) { + return 0; + } Integer val = 0; try { Matcher matcher = pattern.matcher(value); @@ -548,7 +552,7 @@ public class Utilities { } public static int getGroupAvatarForId(int id) { - return arrGroupsAvatars[getColorIndex(-id)]; + return arrGroupsAvatars[getColorIndex(-Math.abs(id))]; } public static String MD5(String md5) { diff --git a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java index 15589035..fc6f6141 100644 --- a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java @@ -39,7 +39,6 @@ public class MessageObject { public int contentType; public ArrayList photoThumbs; public Bitmap imagePreview; - public PhotoObject previewPhoto; public String dateKey; public boolean deleted = false; public float audioProgress; @@ -63,6 +62,10 @@ public class MessageObject { public ArrayList textLayoutBlocks; public MessageObject(TLRPC.Message message, AbstractMap users) { + this(message, users, 1); + } + + public MessageObject(TLRPC.Message message, AbstractMap users, int preview) { if (textPaint == null) { textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); textPaint.setColor(0xff000000); @@ -134,10 +137,6 @@ public class MessageObject { messageText = LocaleController.getString("ActionAddUser", R.string.ActionAddUser).replace("un2", "").replace("un1", ""); } } else if (message.action instanceof TLRPC.TL_messageActionChatEditPhoto) { - photoThumbs = new ArrayList(); - for (TLRPC.PhotoSize size : message.action.photo.sizes) { - photoThumbs.add(new PhotoObject(size)); - } if (isFromMe()) { messageText = LocaleController.getString("ActionYouChangedPhoto", R.string.ActionYouChangedPhoto); } else { @@ -232,26 +231,14 @@ public class MessageObject { } } } + } else if (message.action instanceof TLRPC.TL_messageActionCreatedBroadcastList) { + messageText = LocaleController.formatString("YouCreatedBroadcastList", R.string.YouCreatedBroadcastList); } } } else if (message.media != null && !(message.media instanceof TLRPC.TL_messageMediaEmpty)) { if (message.media instanceof TLRPC.TL_messageMediaPhoto) { - photoThumbs = new ArrayList(); - for (TLRPC.PhotoSize size : message.media.photo.sizes) { - PhotoObject obj = new PhotoObject(size); - photoThumbs.add(obj); - if (imagePreview == null && obj.image != null) { - imagePreview = obj.image; - } - } messageText = LocaleController.getString("AttachPhoto", R.string.AttachPhoto); } else if (message.media instanceof TLRPC.TL_messageMediaVideo) { - photoThumbs = new ArrayList(); - PhotoObject obj = new PhotoObject(message.media.video.thumb); - photoThumbs.add(obj); - if (imagePreview == null && obj.image != null) { - imagePreview = obj.image; - } messageText = LocaleController.getString("AttachVideo", R.string.AttachVideo); } else if (message.media instanceof TLRPC.TL_messageMediaGeo) { messageText = LocaleController.getString("AttachLocation", R.string.AttachLocation); @@ -260,11 +247,6 @@ public class MessageObject { } else if (message.media instanceof TLRPC.TL_messageMediaUnsupported) { messageText = LocaleController.getString("UnsuppotedMedia", R.string.UnsuppotedMedia); } else if (message.media instanceof TLRPC.TL_messageMediaDocument) { - if (!(message.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty)) { - photoThumbs = new ArrayList(); - PhotoObject obj = new PhotoObject(message.media.document.thumb); - photoThumbs.add(obj); - } messageText = LocaleController.getString("AttachDocument", R.string.AttachDocument); } else if (message.media instanceof TLRPC.TL_messageMediaAudio) { messageText = LocaleController.getString("AttachAudio", R.string.AttachAudio); @@ -329,6 +311,80 @@ public class MessageObject { dateKey = String.format("%d_%02d_%02d", dateYear, dateMonth, dateDay); generateLayout(); + generateThumbs(false, preview); + } + + public void generateThumbs(boolean update, int preview) { + if (messageOwner instanceof TLRPC.TL_messageService) { + if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto) { + if (!update) { + photoThumbs = new ArrayList(); + for (TLRPC.PhotoSize size : messageOwner.action.photo.sizes) { + photoThumbs.add(new PhotoObject(size, preview)); + } + } else if (photoThumbs != null && !photoThumbs.isEmpty()) { + for (PhotoObject photoObject : photoThumbs) { + for (TLRPC.PhotoSize size : messageOwner.action.photo.sizes) { + if (size instanceof TLRPC.TL_photoSizeEmpty) { + continue; + } + if (size.type.equals(photoObject.photoOwner.type)) { + photoObject.photoOwner.location = size.location; + break; + } + } + } + } + } + } else if (messageOwner.media != null && !(messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { + if (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) { + if (!update) { + photoThumbs = new ArrayList(); + for (TLRPC.PhotoSize size : messageOwner.media.photo.sizes) { + PhotoObject obj = new PhotoObject(size, preview); + photoThumbs.add(obj); + if (imagePreview == null && obj.image != null) { + imagePreview = obj.image; + } + } + } else if (photoThumbs != null && !photoThumbs.isEmpty()) { + for (PhotoObject photoObject : photoThumbs) { + for (TLRPC.PhotoSize size : messageOwner.media.photo.sizes) { + if (size instanceof TLRPC.TL_photoSizeEmpty) { + continue; + } + if (size.type.equals(photoObject.photoOwner.type)) { + photoObject.photoOwner.location = size.location; + break; + } + } + } + } + } else if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) { + if (!update) { + photoThumbs = new ArrayList(); + PhotoObject obj = new PhotoObject(messageOwner.media.video.thumb, preview); + photoThumbs.add(obj); + if (imagePreview == null && obj.image != null) { + imagePreview = obj.image; + } + } else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.video.thumb != null) { + PhotoObject photoObject = photoThumbs.get(0); + photoObject.photoOwner.location = messageOwner.media.video.thumb.location; + } + } if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { + if (!(messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty)) { + if (!update) { + photoThumbs = new ArrayList(); + PhotoObject obj = new PhotoObject(messageOwner.media.document.thumb, preview); + photoThumbs.add(obj); + } else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.document.thumb != null) { + PhotoObject photoObject = photoThumbs.get(0); + photoObject.photoOwner.location = messageOwner.media.document.thumb.location; + } + } + } + } } public String getFileName() { diff --git a/TMessagesProj/src/main/java/org/telegram/objects/PhotoObject.java b/TMessagesProj/src/main/java/org/telegram/objects/PhotoObject.java index a93f0390..5b605b73 100644 --- a/TMessagesProj/src/main/java/org/telegram/objects/PhotoObject.java +++ b/TMessagesProj/src/main/java/org/telegram/objects/PhotoObject.java @@ -13,6 +13,7 @@ import android.graphics.BitmapFactory; import org.telegram.messenger.TLRPC; import org.telegram.messenger.FileLoader; +import org.telegram.messenger.Utilities; import java.util.ArrayList; @@ -20,18 +21,23 @@ public class PhotoObject { public TLRPC.PhotoSize photoOwner; public Bitmap image; - public PhotoObject(TLRPC.PhotoSize photo) { + public PhotoObject(TLRPC.PhotoSize photo, int preview) { photoOwner = photo; - if (photo instanceof TLRPC.TL_photoCachedSize) { + if (preview != 0 && photo instanceof TLRPC.TL_photoCachedSize) { BitmapFactory.Options opts = new BitmapFactory.Options(); - opts.inPreferredConfig = Bitmap.Config.RGB_565; + opts.inPreferredConfig = Bitmap.Config.ARGB_8888; opts.inDither = false; opts.outWidth = photo.w; opts.outHeight = photo.h; image = BitmapFactory.decodeByteArray(photoOwner.bytes, 0, photoOwner.bytes.length, opts); - if (image != null && FileLoader.getInstance().runtimeHack != null) { - FileLoader.getInstance().runtimeHack.trackFree(image.getRowBytes() * image.getHeight()); + if (image != null) { + if (preview == 2) { + Utilities.blurBitmap(image, image.getWidth(), image.getHeight(), image.getRowBytes()); + } + if (FileLoader.getInstance().runtimeHack != null) { + FileLoader.getInstance().runtimeHack.trackFree(image.getRowBytes() * image.getHeight()); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java index 949dced5..2285ef32 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ApplicationLoader.java @@ -8,7 +8,6 @@ package org.telegram.ui; -import android.app.Activity; import android.app.AlarmManager; import android.app.Application; import android.app.PendingIntent; @@ -93,34 +92,6 @@ public class ApplicationLoader extends Application { UserConfig.loadConfig(); if (UserConfig.getCurrentUser() != null) { - boolean changed = false; - SharedPreferences preferences = applicationContext.getSharedPreferences("Notifications", MODE_PRIVATE); - int v = preferences.getInt("v", 0); - if (v != 1) { - SharedPreferences preferences2 = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences2.edit(); - if (preferences.contains("view_animations")) { - editor.putBoolean("view_animations", preferences.getBoolean("view_animations", false)); - } - if (preferences.contains("selectedBackground")) { - editor.putInt("selectedBackground", preferences.getInt("selectedBackground", 1000001)); - } - if (preferences.contains("selectedColor")) { - editor.putInt("selectedColor", preferences.getInt("selectedColor", 0)); - } - if (preferences.contains("fons_size")) { - editor.putInt("fons_size", preferences.getInt("fons_size", 16)); - } - editor.commit(); - editor = preferences.edit(); - editor.putInt("v", 1); - editor.remove("view_animations"); - editor.remove("selectedBackground"); - editor.remove("selectedColor"); - editor.remove("fons_size"); - editor.commit(); - } - MessagesController.getInstance().users.put(UserConfig.getClientUserId(), UserConfig.getCurrentUser()); ConnectionsManager.getInstance().applyCountryPortNumber(UserConfig.getCurrentUser().phone); ConnectionsManager.getInstance().initPushConnection(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java index cde0be59..52ba8e91 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java @@ -60,9 +60,11 @@ public class ChatBaseCell extends BaseCell { private static Drawable checkDrawable; private static Drawable halfCheckDrawable; private static Drawable clockDrawable; + private static Drawable broadcastDrawable; private static Drawable checkMediaDrawable; private static Drawable halfCheckMediaDrawable; private static Drawable clockMediaDrawable; + private static Drawable broadcastMediaDrawable; private static Drawable errorDrawable; protected static Drawable mediaBackgroundDrawable; private static TextPaint timePaintIn; @@ -177,6 +179,8 @@ public class ChatBaseCell extends BaseCell { clockMediaDrawable = getResources().getDrawable(R.drawable.msg_clock_photo); errorDrawable = getResources().getDrawable(R.drawable.msg_warning); mediaBackgroundDrawable = getResources().getDrawable(R.drawable.phototime); + broadcastDrawable = getResources().getDrawable(R.drawable.broadcast3); + broadcastMediaDrawable = getResources().getDrawable(R.drawable.broadcast4); timePaintIn = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); timePaintIn.setTextSize(AndroidUtilities.dp(12)); @@ -569,6 +573,7 @@ public class ChatBaseCell extends BaseCell { boolean drawCheck2 = false; boolean drawClock = false; boolean drawError = false; + boolean isBroadcast = (int)(currentMessageObject.getDialogId() >> 32) == 1; if (currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) { drawCheck1 = false; @@ -601,30 +606,42 @@ public class ChatBaseCell extends BaseCell { clockMediaDrawable.draw(canvas); } } - if (drawCheck2) { - if (!media) { - if (drawCheck1) { - setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dpf(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + if (isBroadcast) { + if (drawCheck1 || drawCheck2) { + if (!media) { + setDrawableBounds(broadcastDrawable, layoutWidth - AndroidUtilities.dpf(20.5f) - broadcastDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.0f) - broadcastDrawable.getIntrinsicHeight()); + broadcastDrawable.draw(canvas); } else { - setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dpf(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + setDrawableBounds(broadcastMediaDrawable, layoutWidth - AndroidUtilities.dpf(24.0f) - broadcastMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - broadcastMediaDrawable.getIntrinsicHeight()); + broadcastMediaDrawable.draw(canvas); } - checkDrawable.draw(canvas); - } else { - if (drawCheck1) { - setDrawableBounds(checkMediaDrawable, layoutWidth - AndroidUtilities.dpf(26.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); - } else { - setDrawableBounds(checkMediaDrawable, layoutWidth - AndroidUtilities.dpf(22.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); - } - checkMediaDrawable.draw(canvas); } - } - if (drawCheck1) { - if (!media) { - setDrawableBounds(halfCheckDrawable, layoutWidth - AndroidUtilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.5f) - halfCheckDrawable.getIntrinsicHeight()); - halfCheckDrawable.draw(canvas); - } else { - setDrawableBounds(halfCheckMediaDrawable, layoutWidth - AndroidUtilities.dpf(20.5f) - halfCheckMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - halfCheckMediaDrawable.getIntrinsicHeight()); - halfCheckMediaDrawable.draw(canvas); + } else { + if (drawCheck2) { + if (!media) { + if (drawCheck1) { + setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dpf(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + } else { + setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dpf(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + } + checkDrawable.draw(canvas); + } else { + if (drawCheck1) { + setDrawableBounds(checkMediaDrawable, layoutWidth - AndroidUtilities.dpf(26.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); + } else { + setDrawableBounds(checkMediaDrawable, layoutWidth - AndroidUtilities.dpf(22.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); + } + checkMediaDrawable.draw(canvas); + } + } + if (drawCheck1) { + if (!media) { + setDrawableBounds(halfCheckDrawable, layoutWidth - AndroidUtilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(8.5f) - halfCheckDrawable.getIntrinsicHeight()); + halfCheckDrawable.draw(canvas); + } else { + setDrawableBounds(halfCheckMediaDrawable, layoutWidth - AndroidUtilities.dpf(20.5f) - halfCheckMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dpf(13.0f) - halfCheckMediaDrawable.getIntrinsicHeight()); + halfCheckMediaDrawable.draw(canvas); + } } } if (drawError) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java index a66e3085..df80a48f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -31,7 +31,7 @@ import org.telegram.objects.PhotoObject; import org.telegram.ui.PhotoViewer; import org.telegram.ui.Views.GifDrawable; import org.telegram.ui.Views.ImageReceiver; -import org.telegram.ui.Views.ProgressView; +import org.telegram.ui.Views.RoundProgressView; import java.io.File; import java.util.Locale; @@ -45,7 +45,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD private static Drawable placeholderInDrawable; private static Drawable placeholderOutDrawable; private static Drawable videoIconDrawable; - private static Drawable[][] buttonStatesDrawables = new Drawable[4][2]; + private static Drawable[] buttonStatesDrawables = new Drawable[4]; private static TextPaint infoPaint; private static MessageObject lastDownloadedGifMessage = null; @@ -57,10 +57,11 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD private String currentUrl; private String currentPhotoFilter; private ImageReceiver photoImage; - private ProgressView progressView; + private RoundProgressView progressView; public int downloadPhotos = 0; private boolean progressVisible = false; private boolean photoNotSet = false; + private boolean cancelLoading = false; private int TAG; @@ -83,14 +84,10 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD if (placeholderInDrawable == null) { placeholderInDrawable = getResources().getDrawable(R.drawable.photo_placeholder_in); placeholderOutDrawable = getResources().getDrawable(R.drawable.photo_placeholder_out); - buttonStatesDrawables[0][0] = getResources().getDrawable(R.drawable.photoload); - buttonStatesDrawables[0][1] = getResources().getDrawable(R.drawable.photoload_pressed); - buttonStatesDrawables[1][0] = getResources().getDrawable(R.drawable.photocancel); - buttonStatesDrawables[1][1] = getResources().getDrawable(R.drawable.photocancel_pressed); - buttonStatesDrawables[2][0] = getResources().getDrawable(R.drawable.photogif); - buttonStatesDrawables[2][1] = getResources().getDrawable(R.drawable.photogif_pressed); - buttonStatesDrawables[3][0] = getResources().getDrawable(R.drawable.playvideo); - buttonStatesDrawables[3][1] = getResources().getDrawable(R.drawable.playvideo_pressed); + buttonStatesDrawables[0] = getResources().getDrawable(R.drawable.photoload); + buttonStatesDrawables[1] = getResources().getDrawable(R.drawable.photocancel); + buttonStatesDrawables[2] = getResources().getDrawable(R.drawable.photogif); + buttonStatesDrawables[3] = getResources().getDrawable(R.drawable.playvideo); videoIconDrawable = getResources().getDrawable(R.drawable.ic_video); infoPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); @@ -102,8 +99,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD photoImage = new ImageReceiver(); photoImage.parentView = this; - progressView = new ProgressView(); - progressView.setProgressColors(0x802a2a2a, 0xffffffff); + progressView = new RoundProgressView(); } public void clearGifImage() { @@ -225,6 +221,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD private void didPressedButton() { if (buttonState == 0) { + cancelLoading = false; if (currentMessageObject.type == 1) { if (currentMessageObject.imagePreview != null) { photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, new BitmapDrawable(currentMessageObject.imagePreview), currentPhotoObject.photoOwner.size); @@ -246,6 +243,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD delegate.didPressedCancelSendButton(this); } } else { + cancelLoading = true; if (currentMessageObject.type == 1) { FileLoader.getInstance().cancelLoadingForImageView(photoImage); } else if (currentMessageObject.type == 8) { @@ -304,6 +302,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD public void setMessageObject(MessageObject messageObject) { if (currentMessageObject != messageObject || isPhotoDataChanged(messageObject) || isUserDataChanged()) { super.setMessageObject(messageObject); + cancelLoading = false; progressVisible = false; buttonState = -1; @@ -395,6 +394,9 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD photoHeight = h; backgroundWidth = w + AndroidUtilities.dp(12); currentPhotoFilter = String.format(Locale.US, "%d_%d", (int) (w / AndroidUtilities.density), (int) (h / AndroidUtilities.density)); + if (messageObject.photoThumbs.size() > 1 || messageObject.type == 3 || messageObject.type == 8) { + currentPhotoFilter += "_b"; + } if (currentPhotoObject.image != null) { photoImage.setImageBitmap(currentPhotoObject.image); @@ -485,20 +487,16 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD if (!cacheFile.exists()) { MediaController.getInstance().addLoadingFileObserver(fileName, this); if (!FileLoader.getInstance().isLoadingFile(fileName)) { - if (currentMessageObject.type != 1 || downloadPhotos == 1 || downloadPhotos == 2 && !ConnectionsManager.isConnectedToWiFi()) { + if (cancelLoading || currentMessageObject.type != 1 || downloadPhotos == 1 || downloadPhotos == 2 && !ConnectionsManager.isConnectedToWiFi()) { buttonState = 0; progressVisible = false; } else { - buttonState = -1; + buttonState = 1; progressVisible = true; } progressView.setProgress(0); } else { - if (currentMessageObject.type != 1 || downloadPhotos == 1 || downloadPhotos == 2 && !ConnectionsManager.isConnectedToWiFi()) { - buttonState = 1; - } else { - buttonState = -1; - } + buttonState = 1; progressVisible = true; Float progress = FileLoader.getInstance().fileProgresses.get(fileName); if (progress != null) { @@ -544,13 +542,10 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD photoImage.imageW = photoWidth; photoImage.imageH = photoHeight; - progressView.width = timeX - photoImage.imageX - AndroidUtilities.dpf(23.0f); - progressView.height = AndroidUtilities.dp(3); - progressView.progressHeight = AndroidUtilities.dp(3); - int size = AndroidUtilities.dp(44); buttonX = (int)(photoImage.imageX + (photoWidth - size) / 2.0f); buttonY = (int)(photoImage.imageY + (photoHeight - size) / 2.0f); + progressView.rect.set(buttonX + AndroidUtilities.dp(2), buttonY + AndroidUtilities.dp(2), buttonX + AndroidUtilities.dp(42), buttonY + AndroidUtilities.dp(42)); } @Override @@ -566,22 +561,16 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD drawTime = photoImage.getVisible(); } - if (progressVisible) { - setDrawableBounds(mediaBackgroundDrawable, photoImage.imageX + AndroidUtilities.dp(4), layoutHeight - AndroidUtilities.dpf(27.5f), progressView.width + AndroidUtilities.dp(12), AndroidUtilities.dpf(16.5f)); - mediaBackgroundDrawable.draw(canvas); - - canvas.save(); - canvas.translate(photoImage.imageX + AndroidUtilities.dp(10), layoutHeight - AndroidUtilities.dpf(21.0f)); - progressView.draw(canvas); - canvas.restore(); - } - if (buttonState >= 0 && buttonState < 4) { - Drawable currentButtonDrawable = buttonStatesDrawables[buttonState][buttonPressed]; + Drawable currentButtonDrawable = buttonStatesDrawables[buttonState]; setDrawableBounds(currentButtonDrawable, buttonX, buttonY); currentButtonDrawable.draw(canvas); } + if (progressVisible) { + progressView.draw(canvas); + } + if (infoLayout != null && (buttonState == 1 || buttonState == 0 || buttonState == 3)) { setDrawableBounds(mediaBackgroundDrawable, photoImage.imageX + AndroidUtilities.dp(4), photoImage.imageY + AndroidUtilities.dp(4), infoWidth + AndroidUtilities.dp(8) + infoOffset, AndroidUtilities.dpf(16.5f)); mediaBackgroundDrawable.draw(canvas); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java index 8aa33a10..3dbaf02c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatOrUserCell.java @@ -35,6 +35,8 @@ public class ChatOrUserCell extends BaseCell { private static TextPaint offlinePaint; private static Drawable lockDrawable; + private static Drawable broadcastDrawable; + private static Drawable groupDrawable; private static Paint linePaint; private CharSequence currentName; @@ -93,6 +95,14 @@ public class ChatOrUserCell extends BaseCell { linePaint.setColor(0xffdcdcdc); } + if (broadcastDrawable == null) { + broadcastDrawable = getResources().getDrawable(R.drawable.broadcast); + } + + if (groupDrawable == null) { + groupDrawable = getResources().getDrawable(R.drawable.grouplist); + } + if (avatarImage == null) { avatarImage = new ImageReceiver(); avatarImage.parentView = this; @@ -230,6 +240,12 @@ public class ChatOrUserCell extends BaseCell { if (cellLayout.drawNameLock) { setDrawableBounds(lockDrawable, cellLayout.nameLockLeft, cellLayout.nameLockTop); lockDrawable.draw(canvas); + } else if (cellLayout.drawNameGroup) { + setDrawableBounds(groupDrawable, cellLayout.nameLockLeft, cellLayout.nameLockTop); + groupDrawable.draw(canvas); + } else if (cellLayout.drawNameBroadcast) { + setDrawableBounds(broadcastDrawable, cellLayout.nameLockLeft, cellLayout.nameLockTop); + broadcastDrawable.draw(canvas); } canvas.save(); @@ -262,8 +278,10 @@ public class ChatOrUserCell extends BaseCell { private int nameWidth; private StaticLayout nameLayout; private boolean drawNameLock; + private boolean drawNameBroadcast; + private boolean drawNameGroup; private int nameLockLeft; - private int nameLockTop = AndroidUtilities.dp(15); + private int nameLockTop; private int onlineLeft; private int onlineTop = AndroidUtilities.dp(36); @@ -277,6 +295,10 @@ public class ChatOrUserCell extends BaseCell { CharSequence nameString = ""; TextPaint currentNamePaint; + drawNameBroadcast = false; + drawNameLock = false; + drawNameGroup = false; + if (encryptedChat != null) { drawNameLock = true; if (!LocaleController.isRTL) { @@ -286,12 +308,28 @@ public class ChatOrUserCell extends BaseCell { nameLockLeft = width - AndroidUtilities.dp(63 + (usePadding ? 11 : 0)) - lockDrawable.getIntrinsicWidth(); nameLeft = usePadding ? AndroidUtilities.dp(11) : 0; } + nameLockTop = AndroidUtilities.dp(15); } else { - drawNameLock = false; - if (!LocaleController.isRTL) { - nameLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0)); + if (chat != null) { + nameLockTop = AndroidUtilities.dp(26); + if (chat.id < 0) { + drawNameBroadcast = true; + } else { + drawNameGroup = true; + } + if (!LocaleController.isRTL) { + nameLockLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0)); + nameLeft = AndroidUtilities.dp(65 + (usePadding ? 11 : 0)) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); + } else { + nameLockLeft = width - AndroidUtilities.dp(63 + (usePadding ? 11 : 0)) - (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); + nameLeft = usePadding ? AndroidUtilities.dp(11) : 0; + } } else { - nameLeft = usePadding ? AndroidUtilities.dp(11) : 0; + if (!LocaleController.isRTL) { + nameLeft = AndroidUtilities.dp(61 + (usePadding ? 11 : 0)); + } else { + nameLeft = usePadding ? AndroidUtilities.dp(11) : 0; + } } } @@ -326,6 +364,8 @@ public class ChatOrUserCell extends BaseCell { } if (drawNameLock) { nameWidth -= AndroidUtilities.dp(6) + lockDrawable.getIntrinsicWidth(); + } else if (drawNameBroadcast) { + nameWidth -= AndroidUtilities.dp(6) + broadcastDrawable.getIntrinsicWidth(); } CharSequence nameStringFinal = TextUtils.ellipsize(nameString, currentNamePaint, nameWidth - AndroidUtilities.dp(12), TextUtils.TruncateAt.END); 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 25109034..52d35e79 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -46,6 +46,7 @@ public class DialogCell extends BaseCell { private static Drawable lockDrawable; private static Drawable countDrawable; private static Drawable groupDrawable; + private static Drawable broadcastDrawable; private TLRPC.TL_dialog currentDialog; private ImageReceiver avatarImage; @@ -130,6 +131,10 @@ public class DialogCell extends BaseCell { groupDrawable = getResources().getDrawable(R.drawable.grouplist); } + if (broadcastDrawable == null) { + broadcastDrawable = getResources().getDrawable(R.drawable.broadcast); + } + if (avatarImage == null) { avatarImage = new ImageReceiver(); avatarImage.parentView = this; @@ -220,14 +225,19 @@ public class DialogCell extends BaseCell { encryptedChat = null; int lower_id = (int)currentDialog.id; + int high_id = (int)(currentDialog.id >> 32); if (lower_id != 0) { - if (lower_id < 0) { - chat = MessagesController.getInstance().chats.get(-lower_id); + if (high_id == 1) { + chat = MessagesController.getInstance().chats.get(lower_id); } else { - user = MessagesController.getInstance().users.get(lower_id); + if (lower_id < 0) { + chat = MessagesController.getInstance().chats.get(-lower_id); + } else { + user = MessagesController.getInstance().users.get(lower_id); + } } } else { - encryptedChat = MessagesController.getInstance().encryptedChats.get((int)(currentDialog.id >> 32)); + encryptedChat = MessagesController.getInstance().encryptedChats.get(high_id); if (encryptedChat != null) { user = MessagesController.getInstance().users.get(encryptedChat.user_id); } @@ -274,6 +284,9 @@ public class DialogCell extends BaseCell { } else if (cellLayout.drawNameGroup) { setDrawableBounds(groupDrawable, cellLayout.nameLockLeft, cellLayout.nameLockTop); groupDrawable.draw(canvas); + } else if (cellLayout.drawNameBroadcast) { + setDrawableBounds(broadcastDrawable, cellLayout.nameLockLeft, cellLayout.nameLockTop); + broadcastDrawable.draw(canvas); } canvas.save(); @@ -328,6 +341,7 @@ public class DialogCell extends BaseCell { private StaticLayout nameLayout; private boolean drawNameLock; private boolean drawNameGroup; + private boolean drawNameBroadcast; private int nameLockLeft; private int nameLockTop; @@ -372,9 +386,12 @@ public class DialogCell extends BaseCell { TextPaint currentMessagePaint = messagePaint; boolean checkMessage = true; + drawNameGroup = false; + drawNameBroadcast = false; + drawNameLock = false; + if (encryptedChat != null) { drawNameLock = true; - drawNameGroup = false; nameLockTop = AndroidUtilities.dp(13); if (!LocaleController.isRTL) { nameLockLeft = AndroidUtilities.dp(77); @@ -384,19 +401,21 @@ public class DialogCell extends BaseCell { nameLeft = AndroidUtilities.dp(14); } } else { - drawNameLock = false; if (chat != null) { - drawNameGroup = true; + if (chat.id < 0) { + drawNameBroadcast = true; + } else { + drawNameGroup = true; + } nameLockTop = AndroidUtilities.dp(14); if (!LocaleController.isRTL) { nameLockLeft = AndroidUtilities.dp(77); - nameLeft = AndroidUtilities.dp(81) + groupDrawable.getIntrinsicWidth(); + nameLeft = AndroidUtilities.dp(81) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); } else { - nameLockLeft = width - AndroidUtilities.dp(77) - groupDrawable.getIntrinsicWidth(); + nameLockLeft = width - AndroidUtilities.dp(77) - (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); nameLeft = AndroidUtilities.dp(14); } } else { - drawNameGroup = false; if (!LocaleController.isRTL) { nameLeft = AndroidUtilities.dp(77); } else { @@ -461,7 +480,7 @@ public class DialogCell extends BaseCell { messageString = message.messageText; currentMessagePaint = messagePrintingPaint; } else { - if (chat != null) { + if (chat != null && chat.id > 0) { String name = ""; if (message.isFromMe()) { name = LocaleController.getString("FromYou", R.string.FromYou); @@ -505,7 +524,7 @@ public class DialogCell extends BaseCell { } } - if (message.isFromMe()) { + if (message.isFromMe() && message.isOut()) { if (message.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) { drawCheck1 = false; drawCheck2 = false; @@ -579,6 +598,8 @@ public class DialogCell extends BaseCell { nameWidth -= AndroidUtilities.dp(4) + lockDrawable.getIntrinsicWidth(); } else if (drawNameGroup) { nameWidth -= AndroidUtilities.dp(4) + groupDrawable.getIntrinsicWidth(); + } else if (drawNameBroadcast) { + nameWidth -= AndroidUtilities.dp(4) + broadcastDrawable.getIntrinsicWidth(); } if (drawClock) { int w = clockDrawable.getIntrinsicWidth() + AndroidUtilities.dp(2); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index e9116ba1..4e784d62 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -8,6 +8,7 @@ package org.telegram.ui; +import android.animation.Animator; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -129,6 +130,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private View pagedownButton; private TextView topPanelText; private long dialog_id; + private boolean isBraodcast = false; private HashMap selectedMessagesIds = new HashMap(); private HashMap selectedMessagesCanCopyIds = new HashMap(); @@ -141,10 +143,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private boolean endReached = false; private boolean loading = false; private boolean cacheEndReaced = false; + private boolean firstLoading = true; private int minDate = 0; private int progressTag = 0; - boolean first = true; + private boolean first = true; private int unread_to_load = 0; private int first_unread_id = 0; private int last_unread_id = 0; @@ -211,8 +214,24 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } } - MessagesController.getInstance().loadChatInfo(currentChat.id); - dialog_id = -chatId; + if (chatId > 0) { + dialog_id = -chatId; + } else { + isBraodcast = true; + dialog_id = AndroidUtilities.makeBroadcastId(chatId); + } + Semaphore semaphore = null; + if (isBraodcast) { + semaphore = new Semaphore(0); + } + MessagesController.getInstance().loadChatInfo(currentChat.id, semaphore); + if (isBraodcast) { + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } } else if (userId != 0) { currentUser = MessagesController.getInstance().users.get(userId); if (currentUser == null) { @@ -331,7 +350,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not super.onFragmentCreate(); loading = true; - MessagesController.getInstance().loadMessages(dialog_id, 0, 30, 0, true, 0, classGuid, true, false); + MessagesController.getInstance().loadMessages(dialog_id, 30, 0, true, 0, classGuid, true, false); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); if (currentChat != null) { @@ -456,7 +475,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (info != null && info instanceof TLRPC.TL_chatParticipantsForbidden) { return; } - if (currentChat.participants_count == 0 || currentChat.left || currentChat instanceof TLRPC.TL_chatForbidden) { + int count = currentChat.participants_count; + if (info != null) { + count = info.participants.size(); + } + if (count == 0 || currentChat.left || currentChat instanceof TLRPC.TL_chatForbidden) { return; } Bundle args = new Bundle(); @@ -528,6 +551,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (currentEncryptedChat != null) { actionBarLayer.setTitleIcon(R.drawable.ic_lock_white, AndroidUtilities.dp(4)); + } else if (currentChat != null && currentChat.id < 0) { + actionBarLayer.setTitleIcon(R.drawable.broadcast2, AndroidUtilities.dp(4)); } ActionBarMenu menu = actionBarLayer.createMenu(); @@ -609,6 +634,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not View bottomOverlayChat = fragmentView.findViewById(R.id.bottom_overlay_chat); progressView = fragmentView.findViewById(R.id.progressLayout); pagedownButton = fragmentView.findViewById(R.id.pagedown_button); + pagedownButton.setVisibility(View.GONE); View progressViewInner = progressView.findViewById(R.id.progressLayoutInner); @@ -719,24 +745,22 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (firstVisibleItem <= 4) { if (!endReached && !loading) { if (messagesByDays.size() != 0) { - MessagesController.getInstance().loadMessages(dialog_id, 0, 20, maxMessageId, !cacheEndReaced, minDate, classGuid, false, false); + MessagesController.getInstance().loadMessages(dialog_id, 20, maxMessageId, !cacheEndReaced, minDate, classGuid, false, false); } else { - MessagesController.getInstance().loadMessages(dialog_id, 0, 20, 0, !cacheEndReaced, minDate, classGuid, false, false); + MessagesController.getInstance().loadMessages(dialog_id, 20, 0, !cacheEndReaced, minDate, classGuid, false, false); } loading = true; } } if (firstVisibleItem + visibleItemCount >= totalItemCount - 6) { if (!unread_end_reached && !loadingForward) { - MessagesController.getInstance().loadMessages(dialog_id, 0, 20, minMessageId, true, maxDate, classGuid, false, true); + MessagesController.getInstance().loadMessages(dialog_id, 20, minMessageId, true, maxDate, classGuid, false, true); loadingForward = true; } } if (firstVisibleItem + visibleItemCount == totalItemCount && unread_end_reached) { showPagedownButton(false, true); } - } else { - showPagedownButton(false, false); } for (int a = 0; a < visibleItemCount; a++) { View view = absListView.getChildAt(a); @@ -853,9 +877,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not maxDate = Integer.MIN_VALUE; minDate = 0; unread_end_reached = true; - MessagesController.getInstance().loadMessages(dialog_id, 0, 30, 0, true, 0, classGuid, true, false); loading = true; chatAdapter.notifyDataSetChanged(); + MessagesController.getInstance().loadMessages(dialog_id, 30, 0, true, 0, classGuid, true, false); } } @@ -865,7 +889,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (show) { if (pagedownButton.getVisibility() == View.GONE) { - if (android.os.Build.VERSION.SDK_INT >= 16 && animated) { + if (android.os.Build.VERSION.SDK_INT > 13 && animated) { pagedownButton.setVisibility(View.VISIBLE); pagedownButton.setAlpha(0); pagedownButton.animate().alpha(1).setDuration(200).start(); @@ -875,13 +899,28 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } else { if (pagedownButton.getVisibility() == View.VISIBLE) { - if (android.os.Build.VERSION.SDK_INT >= 16 && animated) { - pagedownButton.animate().alpha(0).withEndAction(new Runnable() { + if (android.os.Build.VERSION.SDK_INT > 13 && animated) { + pagedownButton.animate().alpha(0).setDuration(200).setListener(new Animator.AnimatorListener() { @Override - public void run() { + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { pagedownButton.setVisibility(View.GONE); } - }).setDuration(200).start(); + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }).start(); } else { pagedownButton.setVisibility(View.GONE); } @@ -1045,7 +1084,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private int getMessageType(MessageObject messageObject) { if (currentEncryptedChat == null) { - if (messageObject.messageOwner.id <= 0 && messageObject.isOut()) { + boolean isBroadcastError = isBraodcast && messageObject.messageOwner.id <= 0 && messageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SEND_ERROR; + if (!isBraodcast && messageObject.messageOwner.id <= 0 && messageObject.isOut() || isBroadcastError) { if (messageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SEND_ERROR) { if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { return 0; @@ -1224,10 +1264,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else if (currentChat.left) { actionBarLayer.setSubtitle(LocaleController.getString("YouLeft", R.string.YouLeft)); } else { - if (onlineCount > 0 && currentChat.participants_count != 0) { - actionBarLayer.setSubtitle(String.format("%s, %d %s", LocaleController.formatPluralString("Members", currentChat.participants_count), onlineCount, LocaleController.getString("Online", R.string.Online))); + int count = currentChat.participants_count; + if (info != null) { + count = info.participants.size(); + } + if (onlineCount > 0 && count != 0) { + actionBarLayer.setSubtitle(String.format("%s, %d %s", LocaleController.formatPluralString("Members", count), onlineCount, LocaleController.getString("Online", R.string.Online))); } else { - actionBarLayer.setSubtitle(LocaleController.formatPluralString("Members", currentChat.participants_count)); + actionBarLayer.setSubtitle(LocaleController.formatPluralString("Members", count)); } } } else if (currentUser != null) { @@ -1447,6 +1491,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (tempPath != null) { File temp = new File(tempPath); originalPath += temp.length() + "_" + temp.lastModified(); + } else { + originalPath = null; } TLRPC.TL_photo photo = (TLRPC.TL_photo)MessagesStorage.getInstance().getSentFile(originalPath, currentEncryptedChat == null ? 0 : 3); if (photo == null && uri != null) { @@ -1664,24 +1710,42 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (id == MessagesController.messagesDidLoaded) { long did = (Long)args[0]; if (did == dialog_id) { - int offset = (Integer)args[1]; - int count = (Integer)args[2]; - boolean isCache = (Boolean)args[4]; - int fnid = (Integer)args[5]; - int last_unread_date = (Integer)args[8]; - boolean forwardLoad = (Boolean)args[9]; + int count = (Integer)args[1]; + boolean isCache = (Boolean)args[3]; + int fnid = (Integer)args[4]; + int last_unread_date = (Integer)args[7]; + boolean forwardLoad = (Boolean)args[8]; boolean wasUnread = false; boolean positionToUnread = false; if (fnid != 0) { - first_unread_id = (Integer)args[5]; - last_unread_id = (Integer)args[6]; - unread_to_load = (Integer)args[7]; + first_unread_id = fnid; + last_unread_id = (Integer)args[5]; + unread_to_load = (Integer)args[6]; positionToUnread = true; } - ArrayList messArr = (ArrayList)args[3]; + ArrayList messArr = (ArrayList)args[2]; int newRowsCount = 0; unread_end_reached = last_unread_id == 0; + + if (firstLoading) { + if (!unread_end_reached) { + messages.clear(); + messagesByDays.clear(); + messagesDict.clear(); + if (currentEncryptedChat == null) { + maxMessageId = Integer.MAX_VALUE; + minMessageId = Integer.MIN_VALUE; + } else { + maxMessageId = Integer.MIN_VALUE; + minMessageId = Integer.MAX_VALUE; + } + maxDate = Integer.MIN_VALUE; + minDate = 0; + } + firstLoading = false; + } + for (int a = 0; a < messArr.size(); a++) { MessageObject obj = messArr.get(a); if (messagesDict.containsKey(obj.messageOwner.id)) { @@ -1771,7 +1835,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (messArr.size() != count) { if (isCache) { cacheEndReaced = true; - if (currentEncryptedChat != null) { + if (currentEncryptedChat != null || isBraodcast) { endReached = true; } } else { @@ -1849,9 +1913,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (first && messages.size() > 0) { if (last_unread_id != 0) { - MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, last_unread_id, 0, last_unread_date, wasUnread); + MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, last_unread_id, 0, last_unread_date, wasUnread, false); } else { - MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, minMessageId, 0, maxDate, wasUnread); + MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, minMessageId, 0, maxDate, wasUnread, false); } first = false; } @@ -1932,7 +1996,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not readWithMid = currentMinMsgId; } else { if (messages.size() > 0) { - MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, currentMinMsgId, 0, currentMaxDate, true); + MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, currentMinMsgId, 0, currentMaxDate, true, false); } } } @@ -2010,15 +2074,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not lastVisible++; } if (lastVisible == oldCount) { - if (paused) { - scrollToTopOnResume = true; - } else { - chatListView.post(new Runnable() { - @Override - public void run() { - chatListView.setSelectionFromTop(messages.size() - 1, -100000 - chatListView.getPaddingTop()); - } - }); + if (!firstLoading) { + if (paused) { + scrollToTopOnResume = true; + } else { + chatListView.post(new Runnable() { + @Override + public void run() { + chatListView.setSelectionFromTop(messages.size() - 1, -100000 - chatListView.getPaddingTop()); + } + }); + } } } else { showPagedownButton(true, true); @@ -2033,7 +2099,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not readWithDate = maxDate; readWithMid = minMessageId; } else { - MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, minMessageId, 0, maxDate, true); + MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, minMessageId, 0, maxDate, true, false); } } } @@ -2090,7 +2156,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } maxDate = Integer.MIN_VALUE; minDate = 0; - MessagesController.getInstance().loadMessages(dialog_id, 0, 30, 0, !cacheEndReaced, minDate, classGuid, false, false); + MessagesController.getInstance().loadMessages(dialog_id, 30, 0, !cacheEndReaced, minDate, classGuid, false, false); loading = true; } } @@ -2106,6 +2172,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not MessageObject newMsgObj = (MessageObject)args[2]; if (newMsgObj != null) { obj.messageOwner.media = newMsgObj.messageOwner.media; + obj.generateThumbs(true, 1); } messagesDict.remove(msgId); messagesDict.put(newMsgId, obj); @@ -2388,7 +2455,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not messageObject.messageOwner.unread = false; } readWhenResume = false; - MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, readWithMid, 0, readWithDate, true); + MessagesController.getInstance().markDialogAsRead(dialog_id, messages.get(0).messageOwner.id, readWithMid, 0, readWithDate, true, false); } fixLayout(true); @@ -2897,24 +2964,24 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private void forwardSelectedMessages(long did, boolean fromMyName) { if (forwaringMessage != null) { - if (forwaringMessage.messageOwner.id > 0) { - if (!fromMyName) { + if (!fromMyName) { + if (forwaringMessage.messageOwner.id > 0) { MessagesController.getInstance().sendMessage(forwaringMessage, did); - } else { - processForwardFromMe(forwaringMessage, did); } + } else { + processForwardFromMe(forwaringMessage, did); } forwaringMessage = null; } else { ArrayList ids = new ArrayList(selectedMessagesIds.keySet()); Collections.sort(ids); for (Integer id : ids) { - if (id > 0) { - if (!fromMyName) { + if (!fromMyName) { + if (id > 0) { MessagesController.getInstance().sendMessage(selectedMessagesIds.get(id), did); - } else { - processForwardFromMe(selectedMessagesIds.get(id), did); } + } else { + processForwardFromMe(selectedMessagesIds.get(id), did); } } selectedMessagesCanCopyIds.clear(); @@ -2925,7 +2992,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void didSelectDialog(MessagesActivity activity, long did, boolean param) { if (dialog_id != 0 && (forwaringMessage != null || !selectedMessagesIds.isEmpty())) { - + if (isBraodcast) { + param = true; + } if (did != dialog_id) { int lower_part = (int)did; if (lower_part != 0) { @@ -2937,8 +3006,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not args.putInt("chat_id", -lower_part); } presentFragment(new ChatActivity(args), true); - removeSelfFromStack(); forwardSelectedMessages(did, param); + removeSelfFromStack(); } else { activity.finishFragment(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java index 115c4140..562f9e5a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java @@ -112,7 +112,9 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen NotificationCenter.getInstance().addObserver(this, MessagesController.closeChats); updateOnlineCount(); - MessagesController.getInstance().getMediaCount(-chat_id, classGuid, true); + if (chat_id > 0) { + MessagesController.getInstance().getMediaCount(-chat_id, classGuid, true); + } avatarUpdater.delegate = new AvatarUpdater.AvatarUpdaterDelegate() { @Override public void didUploadedPhoto(TLRPC.InputFile file, TLRPC.PhotoSize small, TLRPC.PhotoSize big) { @@ -131,15 +133,18 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen private void updateRowsIds() { rowCount = 0; avatarRow = rowCount++; - settingsSectionRow = rowCount++; - settingsNotificationsRow = rowCount++; - sharedMediaSectionRow = rowCount++; - sharedMediaRow = rowCount++; + if (chat_id > 0) { + settingsSectionRow = rowCount++; + settingsNotificationsRow = rowCount++; + sharedMediaSectionRow = rowCount++; + sharedMediaRow = rowCount++; + } if (info != null && !(info instanceof TLRPC.TL_chatParticipantsForbidden)) { membersSectionRow = rowCount++; rowCount += info.participants.size(); membersEndRow = rowCount; - if (info.participants.size() < 200) { + int maxCount = chat_id > 0 ? MessagesController.getInstance().maxGroupCount : MessagesController.getInstance().maxBroadcastCount; + if (info.participants.size() < maxCount) { addMemberRow = rowCount++; } else { addMemberRow = -1; @@ -149,7 +154,9 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen addMemberRow = -1; membersSectionRow = -1; } - leaveGroupRow = rowCount++; + if (chat_id > 0) { + leaveGroupRow = rowCount++; + } } @Override @@ -166,7 +173,11 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen if (fragmentView == null) { actionBarLayer.setDisplayHomeAsUpEnabled(true, R.drawable.ic_ab_back); actionBarLayer.setBackOverlay(R.layout.updating_state_layout); - actionBarLayer.setTitle(LocaleController.getString("GroupInfo", R.string.GroupInfo)); + if (chat_id > 0) { + actionBarLayer.setTitle(LocaleController.getString("GroupInfo", R.string.GroupInfo)); + } else { + actionBarLayer.setTitle(LocaleController.getString("BroadcastList", R.string.BroadcastList)); + } actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { @@ -181,7 +192,11 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen View item = menu.addItemResource(done_button, R.layout.group_profile_add_member_layout); TextView textView = (TextView)item.findViewById(R.id.done_button); if (textView != null) { - textView.setText(LocaleController.getString("AddMember", R.string.AddMember)); + if (chat_id > 0) { + textView.setText(LocaleController.getString("AddMember", R.string.AddMember)); + } else { + textView.setText(LocaleController.getString("AddRecipient", R.string.AddRecipient)); + } } fragmentView = inflater.inflate(R.layout.chat_profile_layout, container, false); @@ -206,7 +221,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen selectedUser = user; AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items = new CharSequence[] {LocaleController.getString("KickFromGroup", R.string.KickFromGroup)}; + CharSequence[] items = new CharSequence[] {chat_id > 0 ? LocaleController.getString("KickFromGroup", R.string.KickFromGroup) : LocaleController.getString("KickFromBroadcast", R.string.KickFromBroadcast)}; builder.setItems(items, new DialogInterface.OnClickListener() { @Override @@ -259,7 +274,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen @Override public void didSelectContact(TLRPC.User user, String param) { - MessagesController.getInstance().addUserToChat(chat_id, user, info, Utilities.parseInt(param)); + MessagesController.getInstance().addUserToChat(chat_id, user, info, param != null ? Utilities.parseInt(param) : 0); } @Override @@ -276,7 +291,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen @Override public void restoreSelfArgs(Bundle args) { - MessagesController.getInstance().loadChatInfo(chat_id); + MessagesController.getInstance().loadChatInfo(chat_id, null); if (avatarUpdater != null) { avatarUpdater.currentPicturePath = args.getString("path"); } @@ -461,7 +476,9 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen args.putBoolean("destroyAfterSelect", true); args.putBoolean("usersAsSections", true); args.putBoolean("returnAsResult", true); - args.putString("selectAlertString", LocaleController.getString("AddToTheGroup", R.string.AddToTheGroup)); + if (chat_id > 0) { + args.putString("selectAlertString", LocaleController.getString("AddToTheGroup", R.string.AddToTheGroup)); + } ContactsActivity fragment = new ContactsActivity(args); fragment.setDelegate(this); if (info != null) { @@ -546,52 +563,56 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen }); final ImageButton button2 = (ImageButton)view.findViewById(R.id.settings_change_avatar_button); - button2.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - CharSequence[] items; - int type; - TLRPC.Chat chat = MessagesController.getInstance().chats.get(chat_id); - if (chat.photo == null || chat.photo.photo_big == null || chat.photo instanceof TLRPC.TL_chatPhotoEmpty) { - items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; - type = 0; - } else { - items = new CharSequence[] {LocaleController.getString("OpenPhoto", R.string.OpenPhoto), LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; - type = 1; - } - - final int arg0 = type; - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - int action = 0; - if (arg0 == 1) { - if (i == 0) { - action = 0; - } else if (i == 1) { - action = 1; - } else if (i == 2) { - action = 2; - } else if (i == 3) { - action = 3; - } - } else if (arg0 == 0) { - if (i == 0) { - action = 1; - } else if (i == 1) { - action = 2; - } - } - processPhotoMenu(action); + if (chat_id > 0) { + button2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (getParentActivity() == null) { + return; } - }); - showAlertDialog(builder); - } - }); + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + CharSequence[] items; + int type; + TLRPC.Chat chat = MessagesController.getInstance().chats.get(chat_id); + if (chat.photo == null || chat.photo.photo_big == null || chat.photo instanceof TLRPC.TL_chatPhotoEmpty) { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; + type = 0; + } else { + items = new CharSequence[]{LocaleController.getString("OpenPhoto", R.string.OpenPhoto), LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; + type = 1; + } + + final int arg0 = type; + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + int action = 0; + if (arg0 == 1) { + if (i == 0) { + action = 0; + } else if (i == 1) { + action = 1; + } else if (i == 2) { + action = 2; + } else if (i == 3) { + action = 3; + } + } else if (arg0 == 0) { + if (i == 0) { + action = 1; + } else if (i == 1) { + action = 2; + } + } + processPhotoMenu(action); + } + }); + showAlertDialog(builder); + } + }); + } else { + button2.setVisibility(View.GONE); + } } else { onlineText = (TextView)view.findViewById(R.id.settings_online); } @@ -603,10 +624,15 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen textView.setText(chat.title); - if (chat.participants_count != 0 && onlineCount > 0) { - onlineText.setText(Html.fromHtml(String.format("%s, %d %s", LocaleController.formatPluralString("Members", chat.participants_count), onlineCount, LocaleController.getString("Online", R.string.Online)))); + int count = chat.participants_count; + if (info != null) { + count = info.participants.size(); + } + + if (count != 0 && onlineCount > 0) { + onlineText.setText(Html.fromHtml(String.format("%s, %d %s", LocaleController.formatPluralString("Members", count), onlineCount, LocaleController.getString("Online", R.string.Online)))); } else { - onlineText.setText(LocaleController.formatPluralString("Members", chat.participants_count)); + onlineText.setText(LocaleController.formatPluralString("Members", count)); } TLRPC.FileLocation photo = null; @@ -630,7 +656,11 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen textView.setText(LocaleController.getString("SHAREDMEDIA", R.string.SHAREDMEDIA)); } else if (i == membersSectionRow) { TLRPC.Chat chat = MessagesController.getInstance().chats.get(chat_id); - textView.setText(LocaleController.formatPluralString("Members", chat.participants_count).toUpperCase()); + int count = chat.participants_count; + if (info != null) { + count = info.participants.size(); + } + textView.setText(LocaleController.formatPluralString("Members", count).toUpperCase()); } } else if (type == 2) { if (view == null) { @@ -665,7 +695,13 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = li.inflate(R.layout.chat_profile_add_row, viewGroup, false); TextView textView = (TextView)view.findViewById(R.id.messages_list_row_name); - textView.setText(LocaleController.getString("AddMember", R.string.AddMember)); + if (chat_id > 0) { + textView.setText(LocaleController.getString("AddMember", R.string.AddMember)); + } else { + textView.setText(LocaleController.getString("AddRecipient", R.string.AddRecipient)); + View divider = view.findViewById(R.id.settings_row_divider); + divider.setVisibility(View.INVISIBLE); + } } } else if (type == 5) { if (view == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileChangeNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileChangeNameActivity.java index 2b204a9d..0bd08b2b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileChangeNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileChangeNameActivity.java @@ -76,7 +76,11 @@ public class ChatProfileChangeNameActivity extends BaseFragment { TLRPC.Chat currentChat = MessagesController.getInstance().chats.get(chat_id); firstNameField = (EditText)fragmentView.findViewById(R.id.first_name_field); - firstNameField.setHint(LocaleController.getString("GroupName", R.string.GroupName)); + if (chat_id > 0) { + firstNameField.setHint(LocaleController.getString("GroupName", R.string.GroupName)); + } else { + firstNameField.setHint(LocaleController.getString("EnterListName", R.string.EnterListName)); + } firstNameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { @@ -91,7 +95,11 @@ public class ChatProfileChangeNameActivity extends BaseFragment { firstNameField.setSelection(firstNameField.length()); TextView headerLabel = (TextView)fragmentView.findViewById(R.id.settings_section_text); - headerLabel.setText(LocaleController.getString("EnterGroupNameTitle", R.string.EnterGroupNameTitle)); + if (chat_id > 0) { + headerLabel.setText(LocaleController.getString("EnterGroupNameTitle", R.string.EnterGroupNameTitle)); + } else { + headerLabel.setText(LocaleController.getString("EnterListName", R.string.EnterListName).toUpperCase()); + } } else { ViewGroup parent = (ViewGroup)fragmentView.getParent(); if (parent != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index 6baa5a90..91d74a23 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -90,6 +90,8 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private TextView emptyTextView; private EditText userSelectEditText; private boolean ignoreChange = false; + private boolean isBroadcast = false; + private int maxCount = 200; private HashMap selectedContacts = new HashMap(); private ArrayList allSpans = new ArrayList(); @@ -105,6 +107,16 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private final static int done_button = 1; + public GroupCreateActivity() { + super(); + } + + public GroupCreateActivity(Bundle args) { + super(args); + isBroadcast = args.getBoolean("broadcast", false); + maxCount = !isBroadcast ? MessagesController.getInstance().maxGroupCount : MessagesController.getInstance().maxBroadcastCount; + } + @Override public boolean onFragmentCreate() { NotificationCenter.getInstance().addObserver(this, MessagesController.contactsDidLoaded); @@ -126,8 +138,12 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen if (fragmentView == null) { actionBarLayer.setDisplayHomeAsUpEnabled(true, R.drawable.ic_ab_back); actionBarLayer.setBackOverlay(R.layout.updating_state_layout); - actionBarLayer.setTitle(LocaleController.getString("NewGroup", R.string.NewGroup)); - actionBarLayer.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), 200)); + if (isBroadcast) { + actionBarLayer.setTitle(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList)); + } else { + actionBarLayer.setTitle(LocaleController.getString("NewGroup", R.string.NewGroup)); + } + actionBarLayer.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() { @Override @@ -140,6 +156,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen result.addAll(selectedContacts.keySet()); Bundle args = new Bundle(); args.putIntegerArrayList("result", result); + args.putBoolean("broadcast", isBroadcast); presentFragment(new GroupCreateFinalActivity(args)); } } @@ -201,7 +218,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen selectedContacts.remove(sp.uid); } } - actionBarLayer.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), 200)); + actionBarLayer.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); listView.invalidateViews(); } else { search = true; @@ -259,7 +276,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen userSelectEditText.setSelection(text.length()); ignoreChange = false; } else { - if (selectedContacts.size() == 200) { + if (selectedContacts.size() == maxCount) { return; } ignoreChange = true; @@ -267,7 +284,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen span.uid = user.id; ignoreChange = false; } - actionBarLayer.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), 200)); + actionBarLayer.setSubtitle(LocaleController.formatString("MembersCount", R.string.MembersCount, selectedContacts.size(), maxCount)); if (searching || searchWas) { searching = false; searchWas = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index 6d8e2c55..85be68b0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -54,11 +54,13 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private AvatarUpdater avatarUpdater = new AvatarUpdater(); private ProgressDialog progressDialog = null; private String nameToSet = null; + private boolean isBroadcast = false; private final static int done_button = 1; public GroupCreateFinalActivity(Bundle args) { super(args); + isBroadcast = args.getBoolean("broadcast", false); } @SuppressWarnings("unchecked") @@ -120,7 +122,11 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati if (fragmentView == null) { actionBarLayer.setDisplayHomeAsUpEnabled(true, R.drawable.ic_ab_back); actionBarLayer.setBackOverlay(R.layout.updating_state_layout); - actionBarLayer.setTitle(LocaleController.getString("NewGroup", R.string.NewGroup)); + if (isBroadcast) { + actionBarLayer.setTitle(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList)); + } else { + actionBarLayer.setTitle(LocaleController.getString("NewGroup", R.string.NewGroup)); + } actionBarLayer.setActionBarMenuOnItemClick(new ActionBarLayer.ActionBarMenuOnItemClick() { @Override @@ -136,29 +142,33 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } donePressed = true; - if (avatarUpdater.uploadingAvatar != null) { - createAfterUpload = true; + if (isBroadcast) { + MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar, isBroadcast); } else { - progressDialog = new ProgressDialog(getParentActivity()); - progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.setCancelable(false); + if (avatarUpdater.uploadingAvatar != null) { + createAfterUpload = true; + } else { + progressDialog = new ProgressDialog(getParentActivity()); + progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); - final long reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar); + final long reqId = MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar, isBroadcast); - progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ConnectionsManager.getInstance().cancelRpc(reqId, true); - donePressed = false; - try { - dialog.dismiss(); - } catch (Exception e) { - FileLog.e("tmessages", e); + progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ConnectionsManager.getInstance().cancelRpc(reqId, true); + donePressed = false; + try { + dialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } } - } - }); - progressDialog.show(); + }); + progressDialog.show(); + } } } } @@ -173,45 +183,53 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati fragmentView = inflater.inflate(R.layout.group_create_final_layout, container, false); final ImageButton button2 = (ImageButton)fragmentView.findViewById(R.id.settings_change_avatar_button); - button2.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - - CharSequence[] items; - - if (avatar != null) { - items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; - } else { - items = new CharSequence[] {LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; - } - - builder.setItems(items, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (i == 0) { - avatarUpdater.openCamera(); - } else if (i == 1) { - avatarUpdater.openGallery(); - } else if (i == 2) { - avatar = null; - uploadedAvatar = null; - avatarImage.setImage(avatar, "50_50", R.drawable.group_blue); - } + if (isBroadcast) { + button2.setVisibility(View.GONE); + } else { + button2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (getParentActivity() == null) { + return; } - }); - showAlertDialog(builder); - } - }); + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + + CharSequence[] items; + + if (avatar != null) { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley), LocaleController.getString("DeletePhoto", R.string.DeletePhoto)}; + } else { + items = new CharSequence[]{LocaleController.getString("FromCamera", R.string.FromCamera), LocaleController.getString("FromGalley", R.string.FromGalley)}; + } + + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (i == 0) { + avatarUpdater.openCamera(); + } else if (i == 1) { + avatarUpdater.openGallery(); + } else if (i == 2) { + avatar = null; + uploadedAvatar = null; + avatarImage.setImage(avatar, "50_50", R.drawable.group_blue); + } + } + }); + showAlertDialog(builder); + } + }); + } avatarImage = (BackupImageView)fragmentView.findViewById(R.id.settings_avatar_image); avatarImage.setImageResource(R.drawable.group_blue); nameTextView = (EditText)fragmentView.findViewById(R.id.bubble_input_text); - nameTextView.setHint(LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder)); + if (isBroadcast) { + nameTextView.setHint(LocaleController.getString("EnterListName", R.string.EnterListName)); + } else { + nameTextView.setHint(LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder)); + } if (nameToSet != null) { nameTextView.setText(nameToSet); nameToSet = null; @@ -237,7 +255,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati avatarImage.setImage(avatar, "50_50", R.drawable.group_blue); if (createAfterUpload) { FileLog.e("tmessages", "avatar did uploaded"); - MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar); + MessagesController.getInstance().createChat(nameTextView.getText().toString(), selectedContacts, uploadedAvatar, false); } } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 0b9e21bd..962498f6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -85,7 +85,6 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen currentConnectionState = ConnectionsManager.getInstance().getConnectionState(); NotificationCenter.getInstance().addObserver(this, 1234); - NotificationCenter.getInstance().addObserver(this, 658); NotificationCenter.getInstance().addObserver(this, 701); NotificationCenter.getInstance().addObserver(this, 702); NotificationCenter.getInstance().addObserver(this, 703); @@ -149,6 +148,7 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen Integer push_chat_id = 0; Integer push_enc_id = 0; Integer open_settings = 0; + boolean showDialogsList = false; photoPathsArray = null; videoPath = null; @@ -379,6 +379,8 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen NotificationCenter.getInstance().postNotificationName(MessagesController.closeChats); push_enc_id = encId; } + } else { + showDialogsList = true; } } } @@ -408,6 +410,11 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen if (presentFragment(fragment, false, true)) { pushOpened = true; } + } else if (showDialogsList) { + for (int a = 1; a < fragmentsStack.size(); a++) { + removeFragmentFromStack(fragmentsStack.get(a)); + a--; + } } if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null) { NotificationCenter.getInstance().postNotificationName(MessagesController.closeChats); @@ -440,18 +447,23 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen public void didSelectDialog(MessagesActivity messageFragment, long dialog_id, boolean param) { if (dialog_id != 0) { int lower_part = (int)dialog_id; + int high_id = (int)(dialog_id >> 32); Bundle args = new Bundle(); args.putBoolean("scrollToTopOnResume", true); NotificationCenter.getInstance().postNotificationName(MessagesController.closeChats); if (lower_part != 0) { - if (lower_part > 0) { - args.putInt("user_id", lower_part); - } else if (lower_part < 0) { - args.putInt("chat_id", -lower_part); + if (high_id == 1) { + args.putInt("chat_id", lower_part); + } else { + if (lower_part > 0) { + args.putInt("user_id", lower_part); + } else if (lower_part < 0) { + args.putInt("chat_id", -lower_part); + } } } else { - args.putInt("enc_id", (int)(dialog_id >> 32)); + args.putInt("enc_id", high_id); } ChatActivity fragment = new ChatActivity(args); presentFragment(fragment, true); @@ -522,7 +534,6 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen } finished = true; NotificationCenter.getInstance().removeObserver(this, 1234); - NotificationCenter.getInstance().removeObserver(this, 658); NotificationCenter.getInstance().removeObserver(this, 701); NotificationCenter.getInstance().removeObserver(this, 702); NotificationCenter.getInstance().removeObserver(this, 703); @@ -546,30 +557,6 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen startActivity(intent2); onFinish(); finish(); - } else if (id == 658) { - if (PhotoViewer.getInstance().isVisible()) { - PhotoViewer.getInstance().closePhoto(false); - } - Integer push_chat_id = (Integer)args[0]; - Integer push_user_id = (Integer)args[1]; - Integer push_enc_id = (Integer)args[2]; - - if (push_user_id != 0) { - NotificationCenter.getInstance().postNotificationName(MessagesController.closeChats); - Bundle args2 = new Bundle(); - args2.putInt("user_id", push_user_id); - presentFragment(new ChatActivity(args2), false, true); - } else if (push_chat_id != 0) { - NotificationCenter.getInstance().postNotificationName(MessagesController.closeChats); - Bundle args2 = new Bundle(); - args2.putInt("chat_id", push_chat_id); - presentFragment(new ChatActivity(args2), false, true); - } else if (push_enc_id != 0) { - NotificationCenter.getInstance().postNotificationName(MessagesController.closeChats); - Bundle args2 = new Bundle(); - args2.putInt("enc_id", push_enc_id); - presentFragment(new ChatActivity(args2), false, true); - } } else if (id == 702) { if (args[0] != this) { onFinish(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index a31d9eff..dd754cc2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -8,7 +8,9 @@ package org.telegram.ui; +import android.content.Context; import android.location.Location; +import android.location.LocationManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -39,6 +41,8 @@ import org.telegram.ui.Views.ActionBar.ActionBarMenuItem; import org.telegram.ui.Views.BackupImageView; import org.telegram.ui.Views.ActionBar.BaseFragment; +import java.util.List; + public class LocationActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { private GoogleMap googleMap; private TextView distanceTextView; @@ -164,8 +168,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter positionMarker(location); } }); - myLocation = googleMap.getMyLocation(); - + myLocation = getLastLocation(); if (sendButton != null) { userLocation = new Location("network"); @@ -249,6 +252,19 @@ public class LocationActivity extends BaseFragment implements NotificationCenter return fragmentView; } + private Location getLastLocation() { + LocationManager lm = (LocationManager) ApplicationLoader.applicationContext.getSystemService(Context.LOCATION_SERVICE); + List providers = lm.getProviders(true); + Location l = null; + for (int i = providers.size() - 1; i >= 0; i--) { + l = lm.getLastKnownLocation(providers.get(i)); + if (l != null) { + break; + } + } + return l; + } + private void updateUserData() { if (messageObject != null && avatarImageView != null) { int fromId = messageObject.messageOwner.from_id; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityRegisterView.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityRegisterView.java index ec2dfd09..fa453e25 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityRegisterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityRegisterView.java @@ -150,10 +150,10 @@ public class LoginActivityRegisterView extends SlideView { final TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization)response; TLRPC.TL_userSelf user = (TLRPC.TL_userSelf)res.user; UserConfig.clearConfig(); - MessagesStorage.getInstance().cleanUp(); MessagesController.getInstance().cleanUp(); UserConfig.setCurrentUser(user); UserConfig.saveConfig(true); + MessagesStorage.getInstance().cleanUp(true); ArrayList users = new ArrayList(); users.add(user); MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivitySmsView.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivitySmsView.java index d390540f..da049ced 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivitySmsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivitySmsView.java @@ -54,9 +54,12 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente private Bundle currentParams; private Timer timeTimer; + private Timer codeTimer; private static final Integer timerSync = 1; private volatile int time = 60000; + private volatile int codeTime = 15000; private double lastCurrentTime; + private double lastCodeTime; private boolean waitingForSms = false; private boolean nextPressed = false; private String lastError = ""; @@ -162,6 +165,7 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente codeField.requestFocus(); destroyTimer(); + destroyCodeTimer(); timeText.setText(String.format("%s 1:00", LocaleController.getString("CallText", R.string.CallText))); lastCurrentTime = System.currentTimeMillis(); problemText.setVisibility(time < 1000 ? VISIBLE : GONE); @@ -169,6 +173,46 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente createTimer(); } + private void createCodeTimer() { + if (codeTimer != null) { + return; + } + codeTime = 15000; + codeTimer = new Timer(); + lastCodeTime = System.currentTimeMillis(); + codeTimer.schedule(new TimerTask() { + @Override + public void run() { + double currentTime = System.currentTimeMillis(); + double diff = currentTime - lastCodeTime; + codeTime -= diff; + lastCodeTime = currentTime; + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + if (codeTime <= 1000) { + problemText.setVisibility(VISIBLE); + destroyCodeTimer(); + } + } + }); + } + }, 0, 1000); + } + + private void destroyCodeTimer() { + try { + synchronized(timerSync) { + if (codeTimer != null) { + codeTimer.cancel(); + codeTimer = null; + } + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + private void createTimer() { if (timeTimer != null) { return; @@ -189,9 +233,9 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente int seconds = time / 1000 - minutes * 60; timeText.setText(String.format("%s %d:%02d", LocaleController.getString("CallText", R.string.CallText), minutes, seconds)); } else { - problemText.setVisibility(VISIBLE); timeText.setText(LocaleController.getString("Calling", R.string.Calling)); destroyTimer(); + createCodeTimer(); TLRPC.TL_auth_sendCall req = new TLRPC.TL_auth_sendCall(); req.phone_number = requestPhone; req.phone_code_hash = phoneHash; @@ -259,11 +303,12 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente if (error == null) { TLRPC.TL_auth_authorization res = (TLRPC.TL_auth_authorization)response; destroyTimer(); + destroyCodeTimer(); UserConfig.clearConfig(); - MessagesStorage.getInstance().cleanUp(); MessagesController.getInstance().cleanUp(); UserConfig.setCurrentUser(res.user); UserConfig.saveConfig(true); + MessagesStorage.getInstance().cleanUp(true); ArrayList users = new ArrayList(); users.add(res.user); MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); @@ -280,6 +325,7 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente params.putString("code", req.phone_code); delegate.setPage(2, true, params, false); destroyTimer(); + destroyCodeTimer(); } else { createTimer(); if (error.text.contains("PHONE_NUMBER_INVALID")) { @@ -304,6 +350,7 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente @Override public void onBackPressed() { destroyTimer(); + destroyCodeTimer(); currentParams = null; AndroidUtilities.setWaitingForSms(false); NotificationCenter.getInstance().removeObserver(this, 998); @@ -316,6 +363,7 @@ public class LoginActivitySmsView extends SlideView implements NotificationCente AndroidUtilities.setWaitingForSms(false); NotificationCenter.getInstance().removeObserver(this, 998); destroyTimer(); + destroyCodeTimer(); waitingForSms = false; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index ecdbd2c3..3e405931 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -74,6 +74,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter private final static int messages_list_menu_new_secret_chat = 3; private final static int messages_list_menu_contacts = 4; private final static int messages_list_menu_settings = 5; + private final static int messages_list_menu_new_broadcast = 6; public static interface MessagesActivityDelegate { public abstract void didSelectDialog(MessagesActivity fragment, long dialog_id, boolean param); @@ -175,6 +176,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other); item.addSubItem(messages_list_menu_new_chat, LocaleController.getString("NewGroup", R.string.NewGroup), 0); item.addSubItem(messages_list_menu_new_secret_chat, LocaleController.getString("NewSecretChat", R.string.NewSecretChat), 0); + item.addSubItem(messages_list_menu_new_broadcast, LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList), 0); item.addSubItem(messages_list_menu_contacts, LocaleController.getString("Contacts", R.string.Contacts), 0); item.addSubItem(messages_list_menu_settings, LocaleController.getString("Settings", R.string.Settings), 0); } @@ -206,6 +208,10 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter if (onlySelect) { finishFragment(); } + } else if (id == messages_list_menu_new_broadcast) { + Bundle args = new Bundle(); + args.putBoolean("broadcast", true); + presentFragment(new GroupCreateActivity(args)); } } }); @@ -258,7 +264,11 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter if (obj instanceof TLRPC.User) { dialog_id = ((TLRPC.User) obj).id; } else if (obj instanceof TLRPC.Chat) { - dialog_id = -((TLRPC.Chat) obj).id; + if (((TLRPC.Chat) obj).id > 0) { + dialog_id = -((TLRPC.Chat) obj).id; + } else { + dialog_id = AndroidUtilities.makeBroadcastId(((TLRPC.Chat) obj).id); + } } else if (obj instanceof TLRPC.EncryptedChat) { dialog_id = ((long)((TLRPC.EncryptedChat) obj).id) << 32; } @@ -282,14 +292,19 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } else { Bundle args = new Bundle(); int lower_part = (int)dialog_id; + int high_id = (int)(dialog_id >> 32); if (lower_part != 0) { - if (lower_part > 0) { - args.putInt("user_id", lower_part); - } else if (lower_part < 0) { - args.putInt("chat_id", -lower_part); + if (high_id == 1) { + args.putInt("chat_id", lower_part); + } else { + if (lower_part > 0) { + args.putInt("user_id", lower_part); + } else if (lower_part < 0) { + args.putInt("chat_id", -lower_part); + } } } else { - args.putInt("enc_id", (int)(dialog_id >> 32)); + args.putInt("enc_id", high_id); } presentFragment(new ChatActivity(args)); } @@ -319,7 +334,10 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - if ((int)selectedDialog < 0) { + int lower_id = (int)selectedDialog; + int high_id = (int)(selectedDialog >> 32); + + if (lower_id < 0 && high_id != 1) { builder.setItems(new CharSequence[]{LocaleController.getString("ClearHistory", R.string.ClearHistory), LocaleController.getString("DeleteChat", R.string.DeleteChat)}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -482,23 +500,31 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); int lower_part = (int)dialog_id; + int high_id = (int)(dialog_id >> 32); if (lower_part != 0) { - if (lower_part > 0) { - TLRPC.User user = MessagesController.getInstance().users.get(lower_part); - if (user == null) { - return; - } - builder.setMessage(LocaleController.formatStringSimple(selectAlertString, Utilities.formatName(user.first_name, user.last_name))); - } else if (lower_part < 0) { - TLRPC.Chat chat = MessagesController.getInstance().chats.get(-lower_part); + if (high_id == 1) { + TLRPC.Chat chat = MessagesController.getInstance().chats.get(lower_part); if (chat == null) { return; } builder.setMessage(LocaleController.formatStringSimple(selectAlertString, chat.title)); + } else { + if (lower_part > 0) { + TLRPC.User user = MessagesController.getInstance().users.get(lower_part); + if (user == null) { + return; + } + builder.setMessage(LocaleController.formatStringSimple(selectAlertString, Utilities.formatName(user.first_name, user.last_name))); + } else if (lower_part < 0) { + TLRPC.Chat chat = MessagesController.getInstance().chats.get(-lower_part); + if (chat == null) { + return; + } + builder.setMessage(LocaleController.formatStringSimple(selectAlertString, chat.title)); + } } } else { - int chat_id = (int)(dialog_id >> 32); - TLRPC.EncryptedChat chat = MessagesController.getInstance().encryptedChats.get(chat_id); + TLRPC.EncryptedChat chat = MessagesController.getInstance().encryptedChats.get(high_id); TLRPC.User user = MessagesController.getInstance().users.get(chat.user_id); if (user == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index becadcd9..a5409d66 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -413,6 +413,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat imagesByIdsTemp.clear(); needSearchImageInArr = false; currentIndex = -1; + if (foundIndex >= imagesArr.size()) { + foundIndex = imagesArr.size() - 1; + } setImageIndex(foundIndex, true); } else { if (!cacheEndReached || !arr.isEmpty() && added != 0) { @@ -1384,6 +1387,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat NotificationCenter.getInstance().addObserver(this, MessagesController.mediaDidLoaded); NotificationCenter.getInstance().addObserver(this, MessagesController.userPhotosLoaded); + try { + if (windowView.getParent() != null) { + WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); + wm.removeView(windowView); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + placeProvider = provider; WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); wm.addView(windowView, windowLayoutParams); @@ -1702,8 +1714,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return; } try { - WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); if (windowView.getParent() != null) { + WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); wm.removeViewImmediate(windowView); } windowView = null; @@ -1730,8 +1742,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat public void run() { animatingImageView.setImageBitmap(null); try { - WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); if (windowView.getParent() != null) { + WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); wm.removeView(windowView); } } catch (Exception e) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index c2f86eaf..513cbea4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -161,7 +161,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC return; } NotificationsController.getInstance().popupMessages.remove(currentMessageNum); - MessagesController.getInstance().markDialogAsRead(currentMessageObject.getDialogId(), currentMessageObject.messageOwner.id, Math.max(0, currentMessageObject.messageOwner.id), 0, currentMessageObject.messageOwner.date, true); + MessagesController.getInstance().markDialogAsRead(currentMessageObject.getDialogId(), currentMessageObject.messageOwner.id, Math.max(0, currentMessageObject.messageOwner.id), 0, currentMessageObject.messageOwner.date, true, true); currentMessageObject = null; getNewMessage(); } @@ -874,9 +874,6 @@ public class PopupNotificationActivity extends Activity implements NotificationC chatActivityEnterView.setFieldFocused(false); } ConnectionsManager.getInstance().setAppPaused(true, false); - if (wakeLock.isHeld()) { - wakeLock.release(); - } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 1c4d1697..07184d6b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -568,6 +568,9 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } catch (Exception e) { FileLog.e("tmessages", e); } + ArrayList users = new ArrayList(); + users.add(res.user); + MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); MessagesController.getInstance().users.put(res.user.id, res.user); Bundle args = new Bundle(); args.putInt("user_id", res.user.id); @@ -962,7 +965,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter MessagesController.getInstance().unregistedPush(); MessagesController.getInstance().logOut(); UserConfig.clearConfig(); - MessagesStorage.getInstance().cleanUp(); + MessagesStorage.getInstance().cleanUp(false); MessagesController.getInstance().cleanUp(); ContactsController.getInstance().deleteAllAppAccounts(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java index 9b7298bb..91ed628c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java @@ -406,7 +406,8 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif } public void updateServerNotificationsSettings(boolean group) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + //disable global settings sync + /*SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); TLRPC.TL_account_updateNotifySettings req = new TLRPC.TL_account_updateNotifySettings(); req.settings = new TLRPC.TL_inputPeerNotifySettings(); req.settings.sound = "default"; @@ -425,7 +426,7 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif public void run(TLObject response, TLRPC.TL_error error) { } - }); + });*/ } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java index 2774c356..94874565 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java @@ -467,18 +467,15 @@ public class VideoEditorActivity extends BaseFragment implements SurfaceHolder.C List tracks = movie.getTracks(); movie.setTracks(new LinkedList()); - double startTime = videoTimelineView.getLeftProgress() * videoPlayer.getDuration() / 1000.0; - double endTime = videoTimelineView.getRightProgress() * videoPlayer.getDuration() / 1000.0; + double startTime = 0; + double endTime = 0; - boolean timeCorrected = false; for (Track track : tracks) { if (track.getSyncSamples() != null && track.getSyncSamples().length > 0) { - if (timeCorrected) { - throw new RuntimeException("The startTime has already been corrected by another track with SyncSample. Not Supported."); - } - startTime = correctTimeToSyncSample(track, startTime, false); - endTime = correctTimeToSyncSample(track, endTime, true); - timeCorrected = true; + double duration = (double)track.getDuration() / (double)track.getTrackMetaData().getTimescale(); + startTime = correctTimeToSyncSample(track, videoTimelineView.getLeftProgress() * duration, false); + endTime = videoTimelineView.getRightProgress() * duration; + break; } } @@ -486,7 +483,7 @@ public class VideoEditorActivity extends BaseFragment implements SurfaceHolder.C long currentSample = 0; double currentTime = 0; double lastTime = 0; - long startSample = -1; + long startSample = 0; long endSample = -1; for (int i = 0; i < track.getSampleDurations().length; i++) { @@ -503,9 +500,7 @@ public class VideoEditorActivity extends BaseFragment implements SurfaceHolder.C } movie.addTrack(new CroppedTrack(track, startSample, endSample)); } - long start1 = System.currentTimeMillis(); Container out = new DefaultMp4Builder().build(movie); - long start2 = System.currentTimeMillis(); String fileName = Integer.MIN_VALUE + "_" + UserConfig.lastLocalId + ".mp4"; UserConfig.lastLocalId--; @@ -524,6 +519,11 @@ public class VideoEditorActivity extends BaseFragment implements SurfaceHolder.C } } +// private void startEncodeVideo() { +// MediaExtractor mediaExtractor = new MediaExtractor(); +// mediaExtractor.s +// } + private static double correctTimeToSyncSample(Track track, double cutHere, boolean next) { double[] timeOfSyncSamples = new double[track.getSyncSamples().length]; long currentSample = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java index 93668ed3..5af31e03 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java @@ -46,7 +46,7 @@ public class GifDrawable extends Drawable implements Animatable, MediaController private static native void renderFrame(int[] pixels, int gifFileInPtr, int[] metaData); private static native int openFile(int[] metaData, String filePath); private static native void free(int gifFileInPtr); - private static native boolean reset(int gifFileInPtr); + private static native void reset(int gifFileInPtr); private static native void setSpeedFactor(int gifFileInPtr, float factor); private static native String getComment(int gifFileInPtr); private static native int getLoopCount(int gifFileInPtr); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/ImageReceiver.java index 11cf3a9c..d17a04b9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ImageReceiver.java @@ -75,17 +75,20 @@ public class ImageReceiver { if (filter != null) { key += "@" + filter; } - Bitmap img; + Bitmap img = null; if (currentPath != null) { if (currentPath.equals(key)) { - return; + if (currentImage != null) { + return; + } else { + img = FileLoader.getInstance().getImageFromMemory(path, httpUrl, this, filter); + } } else { - img = FileLoader.getInstance().getImageFromMemory(path, httpUrl, this, filter, true); + img = FileLoader.getInstance().getImageFromMemory(path, httpUrl, this, filter); recycleBitmap(img); } - } else { - img = FileLoader.getInstance().getImageFromMemory(path, httpUrl, this, filter, true); } + img = FileLoader.getInstance().getImageFromMemory(path, httpUrl, this, filter); currentPath = key; last_path = path; last_httpUrl = httpUrl; @@ -132,6 +135,9 @@ public class ImageReceiver { last_filter = null; currentImage = null; last_size = 0; + if (parentView != null) { + parentView.invalidate(); + } } public void setImageBitmap(Drawable bitmap) { @@ -145,6 +151,9 @@ public class ImageReceiver { last_httpUrl = null; last_filter = null; last_size = 0; + if (parentView != null) { + parentView.invalidate(); + } } public void clearImage() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/RoundProgressView.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/RoundProgressView.java new file mode 100644 index 00000000..df1ddaa9 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/RoundProgressView.java @@ -0,0 +1,43 @@ +/* + * This is the source code of Telegram for Android v. 1.7.x. + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2014. + */ + +package org.telegram.ui.Views; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; + +import org.telegram.android.AndroidUtilities; + +public class RoundProgressView { + private Paint paint; + + public float currentProgress = 0; + public RectF rect = new RectF(); + + public RoundProgressView() { + paint = new Paint(); + paint.setColor(0xffffffff); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(AndroidUtilities.dp(1)); + paint.setAntiAlias(true); + } + + public void setProgress(float progress) { + currentProgress = progress; + if (currentProgress < 0) { + currentProgress = 0; + } else if (currentProgress > 1) { + currentProgress = 1; + } + } + + public void draw(Canvas canvas) { + canvas.drawArc(rect, -90, 360 * currentProgress, false, paint); + } +} diff --git a/TMessagesProj/src/main/res/drawable-hdpi/broadcast.png b/TMessagesProj/src/main/res/drawable-hdpi/broadcast.png new file mode 100644 index 00000000..bd523d0c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/broadcast2.png b/TMessagesProj/src/main/res/drawable-hdpi/broadcast2.png new file mode 100644 index 00000000..9c4837b8 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/broadcast2.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/broadcast3.png b/TMessagesProj/src/main/res/drawable-hdpi/broadcast3.png new file mode 100644 index 00000000..d2969759 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/broadcast3.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/broadcast4.png b/TMessagesProj/src/main/res/drawable-hdpi/broadcast4.png new file mode 100644 index 00000000..ed908d80 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/broadcast4.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photocancel.png b/TMessagesProj/src/main/res/drawable-hdpi/photocancel.png index 7f5b708e..bd41cc68 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/photocancel.png and b/TMessagesProj/src/main/res/drawable-hdpi/photocancel.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photocancel_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/photocancel_pressed.png deleted file mode 100755 index c96b2910..00000000 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/photocancel_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photogif.png b/TMessagesProj/src/main/res/drawable-hdpi/photogif.png index 26945dd9..29f155b4 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/photogif.png and b/TMessagesProj/src/main/res/drawable-hdpi/photogif.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photogif_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/photogif_pressed.png deleted file mode 100755 index 5cc3e7c4..00000000 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/photogif_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photoload.png b/TMessagesProj/src/main/res/drawable-hdpi/photoload.png index 8c8e0ea5..20783e58 100755 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/photoload.png and b/TMessagesProj/src/main/res/drawable-hdpi/photoload.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photoload_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/photoload_pressed.png deleted file mode 100755 index dc1b5698..00000000 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/photoload_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/playvideo.png b/TMessagesProj/src/main/res/drawable-hdpi/playvideo.png old mode 100755 new mode 100644 index 2de03e80..449d7ada Binary files a/TMessagesProj/src/main/res/drawable-hdpi/playvideo.png and b/TMessagesProj/src/main/res/drawable-hdpi/playvideo.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/playvideo_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/playvideo_pressed.png deleted file mode 100755 index efda9fc0..00000000 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/playvideo_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/broadcast.png b/TMessagesProj/src/main/res/drawable-ldpi/broadcast.png new file mode 100644 index 00000000..cd47e3ee Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-ldpi/broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/broadcast2.png b/TMessagesProj/src/main/res/drawable-ldpi/broadcast2.png new file mode 100644 index 00000000..6fc507a9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-ldpi/broadcast2.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/broadcast3.png b/TMessagesProj/src/main/res/drawable-ldpi/broadcast3.png new file mode 100644 index 00000000..532a1f09 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-ldpi/broadcast3.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/broadcast4.png b/TMessagesProj/src/main/res/drawable-ldpi/broadcast4.png new file mode 100644 index 00000000..09916a97 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-ldpi/broadcast4.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/photocancel.png b/TMessagesProj/src/main/res/drawable-ldpi/photocancel.png index e2efce8b..857a1202 100755 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/photocancel.png and b/TMessagesProj/src/main/res/drawable-ldpi/photocancel.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/photocancel_pressed.png b/TMessagesProj/src/main/res/drawable-ldpi/photocancel_pressed.png deleted file mode 100755 index 50050bee..00000000 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/photocancel_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/photogif.png b/TMessagesProj/src/main/res/drawable-ldpi/photogif.png index adae3f8d..9599c4c3 100755 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/photogif.png and b/TMessagesProj/src/main/res/drawable-ldpi/photogif.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/photogif_pressed.png b/TMessagesProj/src/main/res/drawable-ldpi/photogif_pressed.png deleted file mode 100755 index cffbbd2b..00000000 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/photogif_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/photoload.png b/TMessagesProj/src/main/res/drawable-ldpi/photoload.png index de8b436a..d08458bd 100755 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/photoload.png and b/TMessagesProj/src/main/res/drawable-ldpi/photoload.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/photoload_pressed.png b/TMessagesProj/src/main/res/drawable-ldpi/photoload_pressed.png deleted file mode 100755 index 5209e3e9..00000000 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/photoload_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/playvideo.png b/TMessagesProj/src/main/res/drawable-ldpi/playvideo.png old mode 100755 new mode 100644 index d6e7a1d3..8521b0d7 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/playvideo.png and b/TMessagesProj/src/main/res/drawable-ldpi/playvideo.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/playvideo_pressed.png b/TMessagesProj/src/main/res/drawable-ldpi/playvideo_pressed.png deleted file mode 100755 index d2a233ff..00000000 Binary files a/TMessagesProj/src/main/res/drawable-ldpi/playvideo_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/broadcast.png b/TMessagesProj/src/main/res/drawable-mdpi/broadcast.png new file mode 100644 index 00000000..db6c9411 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/broadcast2.png b/TMessagesProj/src/main/res/drawable-mdpi/broadcast2.png new file mode 100644 index 00000000..57e7d3b3 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/broadcast2.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/broadcast3.png b/TMessagesProj/src/main/res/drawable-mdpi/broadcast3.png new file mode 100644 index 00000000..fb81e5eb Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/broadcast3.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/broadcast4.png b/TMessagesProj/src/main/res/drawable-mdpi/broadcast4.png new file mode 100644 index 00000000..dda48af2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/broadcast4.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photocancel.png b/TMessagesProj/src/main/res/drawable-mdpi/photocancel.png index 2a5aa52a..59df8472 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/photocancel.png and b/TMessagesProj/src/main/res/drawable-mdpi/photocancel.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photocancel_pressed.png b/TMessagesProj/src/main/res/drawable-mdpi/photocancel_pressed.png deleted file mode 100755 index a6244f87..00000000 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/photocancel_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photogif.png b/TMessagesProj/src/main/res/drawable-mdpi/photogif.png index b3205005..d91f0d31 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/photogif.png and b/TMessagesProj/src/main/res/drawable-mdpi/photogif.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photogif_pressed.png b/TMessagesProj/src/main/res/drawable-mdpi/photogif_pressed.png deleted file mode 100755 index 66ad8db2..00000000 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/photogif_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photoload.png b/TMessagesProj/src/main/res/drawable-mdpi/photoload.png index 1f27b560..b010df61 100755 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/photoload.png and b/TMessagesProj/src/main/res/drawable-mdpi/photoload.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photoload_pressed.png b/TMessagesProj/src/main/res/drawable-mdpi/photoload_pressed.png deleted file mode 100755 index 5cddd081..00000000 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/photoload_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/playvideo.png b/TMessagesProj/src/main/res/drawable-mdpi/playvideo.png old mode 100755 new mode 100644 index fad4ea73..d1b0b4aa Binary files a/TMessagesProj/src/main/res/drawable-mdpi/playvideo.png and b/TMessagesProj/src/main/res/drawable-mdpi/playvideo.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/playvideo_pressed.png b/TMessagesProj/src/main/res/drawable-mdpi/playvideo_pressed.png deleted file mode 100755 index 8c93f6d6..00000000 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/playvideo_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/broadcast.png b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast.png new file mode 100644 index 00000000..f3243392 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/broadcast2.png b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast2.png new file mode 100644 index 00000000..38524b57 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/broadcast3.png b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast3.png new file mode 100644 index 00000000..c95c6902 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast3.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/broadcast4.png b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast4.png new file mode 100644 index 00000000..727ee6f4 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/broadcast4.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photocancel.png b/TMessagesProj/src/main/res/drawable-xhdpi/photocancel.png index ed51e34e..a13c7ec2 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/photocancel.png and b/TMessagesProj/src/main/res/drawable-xhdpi/photocancel.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photocancel_pressed.png b/TMessagesProj/src/main/res/drawable-xhdpi/photocancel_pressed.png deleted file mode 100755 index 99664ecc..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/photocancel_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photogif.png b/TMessagesProj/src/main/res/drawable-xhdpi/photogif.png index 761339f0..e6d7cd8c 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/photogif.png and b/TMessagesProj/src/main/res/drawable-xhdpi/photogif.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photogif_pressed.png b/TMessagesProj/src/main/res/drawable-xhdpi/photogif_pressed.png deleted file mode 100755 index a02c3784..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/photogif_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photoload.png b/TMessagesProj/src/main/res/drawable-xhdpi/photoload.png index ca7dae9d..a72fe3e1 100755 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/photoload.png and b/TMessagesProj/src/main/res/drawable-xhdpi/photoload.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photoload_pressed.png b/TMessagesProj/src/main/res/drawable-xhdpi/photoload_pressed.png deleted file mode 100755 index 542616bc..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/photoload_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/playvideo.png b/TMessagesProj/src/main/res/drawable-xhdpi/playvideo.png old mode 100755 new mode 100644 index a43f768f..e13c056c Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/playvideo.png and b/TMessagesProj/src/main/res/drawable-xhdpi/playvideo.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/playvideo_pressed.png b/TMessagesProj/src/main/res/drawable-xhdpi/playvideo_pressed.png deleted file mode 100755 index e75bdb58..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/playvideo_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast.png b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast.png new file mode 100644 index 00000000..4d978707 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast2.png new file mode 100644 index 00000000..9b686f34 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast3.png b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast3.png new file mode 100644 index 00000000..f89697b7 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast3.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast4.png b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast4.png new file mode 100644 index 00000000..9a1b9b2a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/broadcast4.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel.png index 312e2afe..51c602e0 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel_pressed.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel_pressed.png deleted file mode 100755 index 91b39a41..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/photocancel_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photogif.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photogif.png index 9fc94f65..71c58912 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/photogif.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/photogif.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photogif_pressed.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photogif_pressed.png deleted file mode 100755 index 326deb6c..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/photogif_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photoload.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photoload.png index cfa2ac2c..4270d1c8 100755 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/photoload.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/photoload.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photoload_pressed.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photoload_pressed.png deleted file mode 100755 index 1e8c1a35..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/photoload_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo.png b/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo.png old mode 100755 new mode 100644 index cdf0095d..543ce17f Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo_pressed.png b/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo_pressed.png deleted file mode 100755 index bd3c6ec0..00000000 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/playvideo_pressed.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/layout-ar/group_create_final_layout.xml b/TMessagesProj/src/main/res/layout-ar/group_create_final_layout.xml index aea3bd3b..f821e53e 100644 --- a/TMessagesProj/src/main/res/layout-ar/group_create_final_layout.xml +++ b/TMessagesProj/src/main/res/layout-ar/group_create_final_layout.xml @@ -45,6 +45,7 @@ android:layout_marginTop="0dp" android:gravity="right|center_vertical" android:imeOptions="flagNoExtractUi" + android:inputType="textCapSentences" android:layout_gravity="center_vertical|right" android:textCursorDrawable="@null" android:textColor="#000000"/> diff --git a/TMessagesProj/src/main/res/layout/group_create_final_layout.xml b/TMessagesProj/src/main/res/layout/group_create_final_layout.xml index 1095df7c..ba3f3ce3 100644 --- a/TMessagesProj/src/main/res/layout/group_create_final_layout.xml +++ b/TMessagesProj/src/main/res/layout/group_create_final_layout.xml @@ -45,6 +45,7 @@ android:layout_marginTop="0dp" android:gravity="left|center_vertical" android:imeOptions="flagNoExtractUi" + android:inputType="textCapSentences" android:layout_gravity="center_vertical" android:textCursorDrawable="@null" android:textColor="#000000"/> diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index f3a3522e..adc62664 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -57,6 +57,14 @@ الاسم مخفي اختر محادثة + + Broadcast List + New Broadcast List + Enter list name + You created a broadcast list + Add Recipient + Remove from broadcast list + اختر ملف متاح %1$s من %2$s @@ -300,7 +308,7 @@ لا توجد صور حتى الآن - Edit Video + تحرير الفيديو Original Video Edited Video diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 2fa92138..66a354dd 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -57,6 +57,14 @@ Versteckter Name Chat auswählen + + Broadcast Liste + Neue Broadcast Liste + Name der Liste eingeben + Du hast eine Broadcast Liste erstellt + Empfänger hinzufügen + Aus Broadcast Liste entfernen + Datei auswählen Freier Speicher: %1$s von %2$s @@ -150,7 +158,7 @@ %1$s hat dich aus der Gruppe %2$s entfernt %1$s hat die Gruppe %2$s verlassen %1$s benutzt jetzt Telegram! - %1$s,\n\nwir haben einen Zugriff auf dein Konto von einem neuen Gerät am %2$s erkannt.\n\nGerät: %3$s\nStandort: %4$s\n\nWenn du das nicht warst, kannst du in den Einstellungen alle Sitzungen beenden.\n\nDanke,\ndas Telegram Team + %1$s,\nWir haben eine Anmeldung von einem neuen Gerät mit der IP-Adresse %2$s festgestellt.\n\nGerät: %3$s\nStandort: %4$s\n\nWenn du es nicht selbst gewesen bist, melde alle anderen Sitzungen in den Telegram Einstellungen unverzüglich ab. \n\n\nMit freundlichen Grüßen,\nDas Telegram Team %1$s hat das Profilbild geändert @@ -193,7 +201,7 @@ FESTNETZ MOBIL ARBEIT - ANDERE + SONSTIGES HAUPTNUMMER Kontaktdaten TELEFON @@ -270,12 +278,12 @@ Vorname Nachname LED-Farbe - Popup-Benachrichtigung + Popup Benachrichtigungen Kein Popup Nur wenn Bildschirm „an“ Nur wenn Bildschirm „aus“ Popups immer anzeigen - Nummer auf Symbol + BADGE (Anzahl) Noch keine geteilten Medien vorhanden @@ -300,9 +308,9 @@ Noch keine Fotos - Edit Video - Original Video - Edited Video + Video bearbeiten + Originalvideo + Bearbeitetes Video Weiter @@ -363,7 +371,7 @@ Lädt… Du hast keinen Videoplayer. Bitte installiere einen um fortzufahren. Bitte sende uns eine Email an sms@telegram.org mit einer Beschreibung des Problems. - Du hast keine App, die den Dokumententyp \'%1$s\' öffnen kann. + Du hast keine Applikationen, die den Dateityp \'%1$s\' öffnen könnten. Bitte installiere eine entsprechende Anwendung um fortzufahren. Dieser Benutzer hat noch kein Telegram. Möchtest du ihn einladen? Bist du sicher? Kontakt hinzufügen? @@ -375,7 +383,7 @@ Sicher, dass du alle anderen Geräte abmelden möchtest? Diese Gruppe wirklich löschen und verlassen? Möchtest du wirklich diesen Chat löschen? - Möchtest du wirklich die eigenen Kontaktdaten teilen? + Wirklich die eigenen Kontaktinformationen teilen? Diesen Kontakt wirklich blockieren? Blockierung für diesen Kontakt wirklich aufheben? Diesen Kontakt wirklich löschen? diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 035676ae..88d1b7bf 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -57,6 +57,14 @@ Nombre oculto Selecciona el chat + + Lista de difusión + Nueva lista de difusión + Ingresa el nombre de la lista + Creaste una lista de difusión + Añadir destinatario + Quitar de la lista de difusión + Seleccionar archivo %1$s de %2$s libres @@ -150,7 +158,7 @@ %1$s te ha expulsado del grupo %2$s %1$s abandonó el grupo %2$s ¡%1$s se unió a Telegram! - %1$s,\nHemos detectado una conexión a tu cuenta desde un nuevo dispositivo el %2$s\n\nDispositivo: %3$s\nUbicación: %4$s\n\nSi no eras tú, puedes ir a Ajustes - Cerrar todas las otras sesiones.\n\nGracias,\nEl equipo de Telegram + %1$s,\nHemos detectado un inicio de sesión en tu cuenta desde un nuevo dispositivo, el %2$s\n\nDispositivo: %3$s\nUbicación: %4$s\n\nSi no eras tú, puedes ir a Ajustes - Cerrar todas las otras sesiones. \n\nAtentamente,\nEl Equipo de Telegram %1$s actualizó su foto de perfil @@ -263,19 +271,19 @@ Activado Desactivado Servicio de notificaciones - Si los servicios de google play son suficientes para recibir notificaciones, puedes desactivar el \'Servicio de notificaciones\'. Sin embargo, te recomendamos activarlos para mantener la aplicación funcionando en segundo plano y recibir notificaciones de forma instantánea. + Si los Servicios de Google Play son suficientes para que recibas las notificaciones, puedes desactivar el Servicio de notificaciones. Sin embargo, te recomendamos que lo dejes activo para mantener funcionando la aplicación en segundo plano y recibir las notificaciones al instante. Ordenar por Importar contactos Solo vía Wifi Nombre Apellido Color del LED - Notificación emergente + Notificaciones emergentes Sin notificación emergente Sólo con pantalla encendida Sólo con pantalla apagada Siempre mostrar notificación emergente - Globo de notificación + Globo en el ícono No hay fotos ni vídeos compartidos aún @@ -300,9 +308,9 @@ No hay fotos aún - Edit Video - Original Video - Edited Video + Editar vídeo + Vídeo original + Vídeo editado Siguiente @@ -362,8 +370,8 @@ Apellido/s inválido/s Cargando... No tienes reproductor de vídeo. Por favor, instala uno para continuar. - Por favor, envía un correo a sms@telegram.org y explica tu problema. - No tienes una aplicación que pueda manejar el tipo mime \'%1$s\'. Por favor, instala una para continuar + Por favor, envíanos un correo electrónico a sms@telegram.org y cuéntanos tu problema. + No tienes aplicaciones que puedan manejar el tipo de archivo \'%1$s\'. Por favor, instala una para continuar. Este usuario no tiene Telegram aún. ¿Enviarle una invitación? ¿Estás seguro? ¿Añadir contacto? diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index e4595b3a..605e883f 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -57,6 +57,14 @@ Nome nascosto Seleziona chat + + Lista Broadcast + Nuova Lista Broadcast + Immetti il nome della lista + Hai creato una lista broadcast + Aggiungi Destinatario + Rimuovi dalla lista broadcast + Seleziona file Liberi %1$s di %2$s @@ -150,7 +158,7 @@ %1$s ti ha rimosso dal gruppo %2$s %1$s ha lasciato il gruppo %2$s %1$s ha iniziato a usare Telegram! - %1$s,\nAbbiamo rilevato un accesso al tuo account da un nuovo dispositivo %2$s\n\nDispositivo: %3$s\nPosizione: %4$s\n\nSe non sei stato tu, puoi andare su Impostazioni - Termina tutte le sessioni.\n\nGrazie,\nla squadra di Telegram + %1$s,\nAbbiamo rilevato un accesso al tuo account da un nuovo dispositivo %2$s\n\nDispositivo: %3$s\nPosizione: %4$s\n\nSe non sei stato tu, puoi andare su Impostazioni - Termina tutte le sessioni.\n\nGrazie,\nIl Team di Telegram %1$s ha aggiornato la foto del profilo @@ -263,19 +271,19 @@ Abilitato Disabilitato Servizio notifiche - Se i servizi di Google Play ti bastano per ricevere le notifiche, puoi disabilitare il Servizio notifiche. Tuttavia sarebbe meglio lasciarlo abilitato al fine di mantenere l\'applicazione attiva in background e ricevere notifiche istantanee. + Se i servizi di Google Play sono sufficienti per ricevere le notifiche, è possibile disabilitare il Servizio Notifiche. Ti raccomandiamo comunque di lasciarlo abilitato per lasciare l\'app attiva in background e ricevere le notifiche istantanee. Ordina per Importa contatti Solo tramite WiFi Nome Cognome Colore LED - Notifica popup + Notifiche Popup Nessun popup Solo con schermo acceso Solo con schermo spento Mostra sempre i popup - Badge Number + Contatore Badge Nessun media condiviso @@ -300,9 +308,9 @@ Ancora nessuna foto - Edit Video - Original Video - Edited Video + Modifica Video + Video Originale + Video Modificato Avanti @@ -362,8 +370,8 @@ Cognome non valido Caricamento… Non hai un lettore video, per favore installane uno per continuare - Invia un’email a sms@telegram.org spiegandoci il problema. - Non hai nessuna applicazione che può gestire il tipo mime \'%1$s\', installane una per continuare + Invia un’email a sms@telegram.org e parlaci del tuo problema. + Nessuna applicazione può gestire il tipo di file \'%1$s\', per favore installane una per proseguire Questo utente non ha ancora Telegram, vuoi invitarlo? Sei sicuro? Vuoi aggiungere il contatto? @@ -375,7 +383,7 @@ Chiudere tutte le altre sessioni? Eliminare il gruppo e uscire da esso? Eliminare questa chat? - Condividere le proprie informazioni di contatto? + Condividere le informazioni del proprio contatto? Bloccare questo contatto? Sbloccare questo contatto? Eliminare questo contatto? diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index e92fc5a4..20d4f2fe 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -57,6 +57,14 @@ Verborgen naam Kies een gesprek + + Verzendlijst + Nieuwe verzendlijst + Naam van lijst + Je hebt een verzendlijst gemaakt + Ontvanger toevoegen + Verwijder van verzendlijst + Kies een bestand Vrij: %1$s van %2$s @@ -110,7 +118,7 @@ SLEEP OM TE ANNULEREN Opslaan in Downloads Vertaling toepassen - Bijlageformaat niet ondersteund + Bestandstype niet ondersteund Privégesprek aangevraagd @@ -150,7 +158,7 @@ %1$s heeft je verwijderd uit de groep %2$s %1$s heeft de groep %2$s verlaten %1$s heeft nu Telegram! - %1$s,\nEr is op je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je alle sessies beëindigen via Instellingen – Alle andere sessies beëindigen.\n\nHet Telegram-team + %1$s,\nEr is op je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je alle sessies beëindigen via Instellingen – Beëindig alle andere sessies.\n\nBedankt,\nHet Telegram-team %1$s heeft zijn/haar profielfoto gewijzigd @@ -245,7 +253,7 @@ Achtergrond gesprekken BERICHTEN Verzenden met Enter - Alle andere sessies beëindigen + Beëindig alle andere sessies FOTO\'S AUTOMATISCH DOWNLOADEN GELUIDSBESTANDEN AUTOMATISCH DOWNLOADEN Groepen @@ -263,19 +271,19 @@ Inschakelen Uitschakelen Meldingenservice - Als google play services genoeg is om notificaties te ontvangen, kan de meldingenservice worden uitgeschakeld. Echter, we adviseren de service ingeschakeld te laten zodat de app in de achtergrond blijft draaien en meldingen direct worden ontvangen. + Als Google Play Services genoeg voor je is om meldingen te ontvangen kun je de Meldingenservice uitschakelen. We raden echter aan dit ingeschakeld te laten om de app in de achtergrond te laten draaien en directe meldingen te ontvangen. Sorteren op Importeer contacten Alleen via WiFi Voornaam Achternaam LED kleur - Popup melding + Popup meldingen Geen popup Alleen wanneer scherm \"aan\" staat Alleen wanneer scherm \"uit\" staat Altijd popup tonen - Badge Number + Badgenummer Nog geen media gedeeld @@ -300,9 +308,9 @@ Nog geen foto\'s - Edit Video - Original Video - Edited Video + Video bewerken + Originele video + Bewerkte video Volgende @@ -362,8 +370,8 @@ Ongeldige achternaam Bezig met laden… Je hebt geen mediaspeler. Installeer een mediaspeler om door te gaan. - Stuur aub een emailbericht naar sms@telegram.org en beschrijf uw probleem - Je hebt geen applicaties die het MIME-type \'%1$s\' ondersteunen. Installeer een geschikte applicatie om door te gaan. + Mail ons op sms@telegram.org en vertel ons over je probleem. + Je hebt geen apps die bestandstype \'%1$s\' kunnen verwerken, gelieve een compitabele app te installeren Deze gebruiker heeft nog geen Telegram. Wil je een uitnodiging sturen? Weet je het zeker? Contact toevoegen? @@ -371,15 +379,15 @@ Berichten doorsturen naar %1$s? Dit gesprek verwijderen? Berichten naar %1$s verzenden? - Weet u zeker dat u wil uitloggen? - Alle andere apparaten afmelden? - Deze groep verlaten en groep verwijderen? - Dit gesprek verwijderen? - Deze contact-informatie delen? - Deze persoon blokkeren? - Deze persoon deblokkeren? - Deze contactpersoon verwijderen? - Een privégesprek starten? + Weet je zeker dat je wilt uitloggen? + Weet je zeker dat je alle andere sessies wilt beëindigen? + Weet je zeker dat je alles wilt verwijderen en de groep wilt verlaten? + Weet je zeker dat je dit gesprek wilt verwijderen? + Weet je zeker dat je je contactinformatie wilt delen? + Weet je zeker dat je deze persoon wilt blokkeren? + Weet je zeker dat je deze persoon wilt deblokkeren? + Weet je zeker dat je deze contactpersoon wilt verwijderen? + Weet je zeker dat je een privégesprek wilt starten? doorsturen via mijn eigen naam @@ -396,7 +404,7 @@ Telegram]]> beveiligt je berichten tegen hackers Telegram]]> heeft geen beperkingen op de grootte van je media en gesprekken Telegram]]> biedt toegang tot je berichten vanaf meerdere apparaten - Telegram]]> berichten zijn sterk versleuteld en kunnen zichzelf vernietigen + Telegram]]> berichten zijn sterk versleuteld]]>en kunnen zichzelf vernietigen Begin nu met chatten diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index dbcc8b02..8a274f34 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -57,6 +57,14 @@ Nome oculto Selecione uma Conversa + + Lista de Broadcast + Nova lista de Broadcast + Digite o nome da lista + Você criou uma lista de broadcast + Adicionar Recipiente + Remover da lista de broadcast + Selecione um Arquivo Disponível %1$s de %2$s @@ -150,7 +158,7 @@ %1$s removeu você do grupo %2$s %1$s saiu do grupo %2$s %1$s entrou para o Telegram! - %1$s,\nNós detectamos um acesso à sua conta de um novo dispositivo em %2$s\n\nDispositivo: %3$s\nLocalização: %4$s\n\nCaso não tenha sido você, vá para Configurações – Encerrar todas as sessões.\n\nObrigado,\nA equipe do Telegram + %1$s,\nNós detectamos um login na sua conta de um novo dispositivo %2$s\n\nDispositivo: %3$s\nLocalização: %4$s\n\nSe não foi você, você pode ir para Configurações - Terminar todas as sessões.\n\nAtenciosamente,\nTime do Telegram %1$s atualizou a foto do perfil @@ -263,19 +271,19 @@ Ativado Desativado Serviço de Notificações - Se os serviços do Google Play forem suficientes para você receber as notificações, você pode desabilitar o \"Serviço de Notificações\". Porém, nós recomendamos deixá-lo ativo para que o aplicativo continue rodando em segundo plano e recebendo notificações instantâneas. + Se o serviço de notificação do Google Play é o suficiente para você, você pode desativar as Notificações de Serviço. No entanto, recomendamos que você deixá-lo habilitado para manter o aplicativo em execução em segundo plano e receber notificações instantâneas. Ordenar Por Importar Contatos Apenas por WiFi Primeiro nome Sobrenome Cor do LED - Notificação Popup + Notificações Popup Sem popup Somente com a tela ligada Somente com a tela desligada Sempre mostrar popup - Badge Number + Contador de medalhas Ainda não há mídia compartilhada @@ -300,9 +308,9 @@ Ainda não há fotos - Edit Video - Original Video - Edited Video + Editar Vídeo + Vídeo Original + Vídeo Editado Próximo @@ -362,8 +370,8 @@ Sobrenome inválido Carregando... Você não possui um reprodutor de vídeo, instale um para continuar - Por favor, envie um email para sms@telegram.org e explique seu problema. - Você não possui algum aplicativo que pode lidar com o tipo MIME \'%1$s\'. Por favor, instale um para continuar + Por favor, envie um email para sms@telegram.org e conte-nos sobre seu problema. + Você não possui uma aplicação que suporte o tipo de arquivo \'%1$s\', por favor instale uma e continue Este usuário ainda não possui Telegram, deseja enviar um convite? Você tem certeza? Adicionar contato? @@ -371,15 +379,15 @@ Encaminhar mensagem para %1$s? Apagar esta conversa? Enviar mensagens para %1$s? - Você tem certeza que deseja sair dessa sessão? + Você tem certeza que deseja sair? Você tem certeza que deseja terminar todas as outras sessões? Você tem certeza que deseja deletar e sair do grupo? Você tem certeza que deseja deletar esta conversa? - Você tem certeza que deseja compartilhar as informações do seu contato? + Você tem certesa que deseja compartilhar suas informações de contato? Você tem certeza que deseja bloquear este contato? Você tem certeza que deseja desbloquear este contato? Você tem certeza que deseja deletar este contato? - Você tem certeza que deseja iniciar uma conversa secreta? + Você tem certeza que deseja começar uma conversa secreta? encaminhar pelo meu nome @@ -396,7 +404,7 @@ Telegram]]> mantém suas mensagens seguras contra ataques de hackers Telegram]]> não tem limites para o tamanho de suas mídias e conversas Telegram]]> permite que você acesse suas mensagens a partir de vários dispositivos - As mensagens do Telegram]]> são fortemente criptografadas e podem se autodestruir + As mensagens do Telegram]]> são fortemente criptografadas]]>e podem se autodestruir Comece a conversar diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 13f7a41d..a5016c73 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -57,6 +57,14 @@ Nome oculto Selecionar chat + + Broadcast List + New Broadcast List + Enter list name + You created a broadcast list + Add Recipient + Remove from broadcast list + Selecionar ficheiro %1$s de %2$s livres diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index b5a9c597..e3d61b06 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -57,6 +57,14 @@ Hidden Name Select Chat + + Broadcast List + New Broadcast List + Enter list name + You created a broadcast list + Add Recipient + Remove from broadcast list + Select File Free %1$s of %2$s @@ -150,7 +158,7 @@ %1$s removed you from the group %2$s %1$s has left the group %2$s %1$s joined Telegram! - %1$s,\nWe detected a login into your account from a new device on %2$s\n\nDevice: %3$s\nLocation: %4$s\n\nIf this wasn’t you, you can go to Settings – Terminate all sessions.\n\nThanks,\nThe Telegram Team + %1$s,\nWe detected a login into your account from a new device on %2$s\n\nDevice: %3$s\nLocation: %4$s\n\nIf this wasn\'t you, you can go to Settings - Terminate all sessions.\n\nSincerely,\nThe Telegram Team %1$s updated profile photo @@ -263,19 +271,19 @@ Enabled Disabled Notifications Service - If google play services are enough for you to receive notifications, you can disable Notifications Service. However we recommend you to leave it enabled to keep app running in background and receive instant notifications. + If Google Play Services are enough for you to receive notifications, you can disable Notifications Service. However we recommend you to leave it enabled to keep app running in background and receive instant notifications. Sort By Import Contacts Via WiFi only First name Last name LED Color - Popup Notification + Popup Notifications No popup Only when screen "on" Only when screen "off" Always show popup - Badge Number + Badge Counter No shared media yet @@ -362,8 +370,8 @@ Invalid last name Loading... You don\'t have a video player, please install one to continue - Please send an email to sms@telegram.org and explain your problem. - You don\'t have any application that can handle with mime type \'%1$s\', please install one to continue + Please send an email to sms@telegram.org and tell us about your problem. + You don\'t have applications that can handle the file type \'%1$s\', please install one to continue This user does not have Telegram yet, send an invitation? Are you sure? Add contact? @@ -371,15 +379,15 @@ Forward messages to %1$s? Delete this chat? Send messages to %1$s? - Are you sure you want to logout? + Are you sure you want to log out? Are you sure you want to terminate all other sessions? - Are you sure you want to delete and leave group? + Are you sure you want to delete and leave the group? Are you sure you want to delete this chat? - Are you sure that you want to share your contact info? + Are you sure you want to share your contact info? Are you sure you want to block this contact? Are you sure you want to unblock this contact? Are you sure you want to delete this contact? - Are you sure you want to start secret chat? + Are you sure you want to start a secret chat? forward from my name