diff --git a/TMessagesProj/jni/gif.c b/TMessagesProj/jni/gif.c index f6198bf3e..28ab98aa0 100644 --- a/TMessagesProj/jni/gif.c +++ b/TMessagesProj/jni/gif.c @@ -794,6 +794,9 @@ 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) { diff --git a/TMessagesProj/libs/armeabi-v7a/libtmessages.so b/TMessagesProj/libs/armeabi-v7a/libtmessages.so index e9cc442ae..7c8460871 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 452830022..bcd3173b0 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 2446256a0..1a8afe2e2 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/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index 388d58f21..43697966e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -198,7 +198,7 @@ public class FileLoadOperation { } final boolean dontDelete = isLocalFile; if ((exist = cacheFileFinal.exists()) && !ignoreCache) { - Utilities.cacheOutQueue.postRunnable(new Runnable() { + FileLoader.cacheOutQueue.postRunnable(new Runnable() { @Override public void run() { try { @@ -403,7 +403,7 @@ public class FileLoadOperation { final boolean renamed = cacheFileTemp.renameTo(cacheFileFinal); if (needBitmapCreate) { - Utilities.cacheOutQueue.postRunnable(new Runnable() { + FileLoader.cacheOutQueue.postRunnable(new Runnable() { @Override public void run() { int delay = 20; @@ -520,7 +520,7 @@ public class FileLoadOperation { int readed = httpConnectionStream.read(data); if (readed > 0) { fileOutputStream.write(data, 0, readed); - Utilities.imageLoadQueue.postRunnable(new Runnable() { + FileLoader.fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { startDownloadHTTPRequest(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index 4a17defe1..9e3671c7a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -38,6 +38,9 @@ import java.util.concurrent.ConcurrentHashMap; public class FileLoader { public LruCache memCache; + public static volatile DispatchQueue cacheOutQueue = new DispatchQueue("cacheOutQueue"); + public static volatile DispatchQueue fileLoaderQueue = new DispatchQueue("fileUploadQueue"); + private String ignoreRemoval = null; private ConcurrentHashMap imageLoading; private HashMap imageLoadingByKeys; @@ -50,9 +53,11 @@ public class FileLoader { private int currentUploadOperationsCount = 0; private Queue loadOperationQueue; private Queue audioLoadOperationQueue; + private Queue photoLoadOperationQueue; private ConcurrentHashMap loadOperationPaths; private int currentLoadOperationsCount = 0; private int currentAudioLoadOperationsCount = 0; + private int currentPhotoLoadOperationsCount = 0; public static long lastCacheOutTime = 0; public ConcurrentHashMap fileProgresses = new ConcurrentHashMap(); private long lastProgressUpdateTime = 0; @@ -108,21 +113,12 @@ public class FileLoader { try { Class cl = Class.forName("dalvik.system.VMRuntime"); Method getRt = cl.getMethod("getRuntime", new Class[0]); - runtime = getRt.invoke(null, new Object[0]); + Object obj = new Object[0]; + runtime = getRt.invoke(null, obj); trackAllocation = cl.getMethod("trackExternalAllocation", new Class[] {long.class}); trackFree = cl.getMethod("trackExternalFree", new Class[] {long.class}); success = true; - } catch (ClassNotFoundException e) { - FileLog.e("tmessages", e); - } catch (SecurityException e) { - FileLog.e("tmessages", e); - } catch (NoSuchMethodException e) { - FileLog.e("tmessages", e); - } catch (IllegalArgumentException e) { - FileLog.e("tmessages", e); - } catch (IllegalAccessException e) { - FileLog.e("tmessages", e); - } catch (InvocationTargetException e) { + } catch (Exception e) { FileLog.e("tmessages", e); } if (!success) { @@ -179,7 +175,7 @@ public class FileLoader { } } } - Utilities.imageLoadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { synchronized (imageViewArray) { @@ -316,10 +312,11 @@ public class FileLoader { loadOperationPaths = new ConcurrentHashMap(); loadOperationQueue = new LinkedList(); audioLoadOperationQueue = new LinkedList(); + photoLoadOperationQueue = new LinkedList(); } public void cancelUploadFile(final String location, final boolean enc) { - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { if (!enc) { @@ -344,7 +341,7 @@ public class FileLoader { } public void uploadFile(final String location, final byte[] key, final byte[] iv) { - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { if (key != null) { @@ -365,7 +362,7 @@ public class FileLoader { operation.delegate = new FileUploadOperation.FileUploadOperationDelegate() { @Override public void didFinishUploadingFile(FileUploadOperation operation, final TLRPC.InputFile inputFile, final TLRPC.InputEncryptedFile inputEncryptedFile) { - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { Utilities.stageQueue.postRunnable(new Runnable() { @@ -394,7 +391,7 @@ public class FileLoader { @Override public void didFailedUploadingFile(final FileUploadOperation operation) { - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { Utilities.stageQueue.postRunnable(new Runnable() { @@ -454,7 +451,7 @@ public class FileLoader { if (video == null && photo == null && document == null && audio == null) { return; } - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { String fileName = null; @@ -474,6 +471,8 @@ public class FileLoader { if (operation != null) { if (audio != null) { audioLoadOperationQueue.remove(operation); + } else if (photo != null) { + photoLoadOperationQueue.remove(operation); } else { loadOperationQueue.remove(operation); } @@ -488,7 +487,7 @@ public class FileLoader { } public void loadFile(final TLRPC.Video video, final TLRPC.PhotoSize photo, final TLRPC.Document document, final TLRPC.Audio audio) { - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { String fileName = null; @@ -540,7 +539,7 @@ public class FileLoader { NotificationCenter.getInstance().postNotificationName(FileDidLoaded, arg1); } }); - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { loadOperationPaths.remove(arg1); @@ -553,6 +552,15 @@ public class FileLoader { operation.start(); } } + } else if (photo != null) { + currentPhotoLoadOperationsCount--; + if (currentPhotoLoadOperationsCount < 2) { + FileLoadOperation operation = photoLoadOperationQueue.poll(); + if (operation != null) { + currentPhotoLoadOperationsCount++; + operation.start(); + } + } } else { currentLoadOperationsCount--; if (currentLoadOperationsCount < 2) { @@ -579,7 +587,7 @@ public class FileLoader { } }); } - Utilities.fileUploadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { loadOperationPaths.remove(arg1); @@ -592,6 +600,15 @@ public class FileLoader { operation.start(); } } + } else if (photo != null) { + currentPhotoLoadOperationsCount--; + if (currentPhotoLoadOperationsCount < 2) { + FileLoadOperation operation = photoLoadOperationQueue.poll(); + if (operation != null) { + currentPhotoLoadOperationsCount++; + operation.start(); + } + } } else { currentLoadOperationsCount--; if (currentLoadOperationsCount < 2) { @@ -630,6 +647,13 @@ public class FileLoader { } else { audioLoadOperationQueue.add(operation); } + } else if (photo != null) { + if (currentPhotoLoadOperationsCount < 2) { + currentPhotoLoadOperationsCount++; + operation.start(); + } else { + photoLoadOperationQueue.add(operation); + } } else { if (currentLoadOperationsCount < 2) { currentLoadOperationsCount++; @@ -674,7 +698,7 @@ public class FileLoader { if (imageView == null) { return; } - Utilities.imageLoadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { Integer TAG = getTag(imageView); @@ -776,14 +800,16 @@ public class FileLoader { if ((url == null && httpUrl == null) || imageView == null || (url != null && !(url instanceof TLRPC.TL_fileLocation) && !(url instanceof TLRPC.TL_fileEncryptedLocation))) { return; } - Utilities.imageLoadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { String key; + String fileName = null; if (httpUrl != null) { key = Utilities.MD5(httpUrl); } else { key = url.volume_id + "_" + url.local_id; + fileName = key + ".jpg"; } if (filter != null) { key += "@" + filter; @@ -832,6 +858,7 @@ public class FileLoader { imageLoading.put(key, img); final String arg2 = key; + final String arg3 = fileName; FileLoadOperation loadOperation; if (httpUrl != null) { loadOperation = new FileLoadOperation(httpUrl); @@ -843,30 +870,43 @@ public class FileLoader { loadOperation.delegate = new FileLoadOperation.FileLoadOperationDelegate() { @Override public void didFinishLoadingFile(final FileLoadOperation operation) { - enqueueImageProcessingOperationWithImage(operation.image, filter, arg2, img); if (operation.totalBytesCount != 0) { - final String arg1 = operation.location.volume_id + "_" + operation.location.local_id + ".jpg"; - fileProgresses.remove(arg1); - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - NotificationCenter.getInstance().postNotificationName(FileLoadProgressChanged, arg1, 1.0f); - } - }); - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - NotificationCenter.getInstance().postNotificationName(FileDidLoaded, arg1); - } - }); + fileProgresses.remove(arg3); } + fileLoaderQueue.postRunnable(new Runnable() { + @Override + public void run() { + if (arg3 != null) { + loadOperationPaths.remove(arg3); + } + for (Object v : img.imageViewArray) { + imageLoadingByKeys.remove(getTag(v)); + } + checkOperationsAndClear(img.loadOperation); + imageLoading.remove(arg2); + } + }); + + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + img.callAndClear(operation.image); + if (operation.image != null && memCache.get(arg2) == null) { + memCache.put(arg2, operation.image); + } + NotificationCenter.getInstance().postNotificationName(FileDidLoaded, arg3); + } + }); } @Override public void didFailedLoadingFile(final FileLoadOperation operation) { - Utilities.imageLoadQueue.postRunnable(new Runnable() { + fileLoaderQueue.postRunnable(new Runnable() { @Override public void run() { + if (arg3 != null) { + loadOperationPaths.remove(arg3); + } for (Object view : img.imageViewArray) { imageLoadingByKeys.remove(getTag(view)); imageLoading.remove(arg2); @@ -921,6 +961,9 @@ public class FileLoader { } else { operationsQueue.add(loadOperation); } + if (fileName != null) { + loadOperationPaths.put(fileName, loadOperation); + } } } }); @@ -936,85 +979,6 @@ public class FileLoader { } } - public void processImage(Bitmap image, Object imageView, String filter, boolean cancel) { - if (filter == null || imageView == null) { - return; - } - - - Integer TAG = getTag(imageView); - if (TAG == null) { - TAG = lastImageNum; - setTag(image, TAG); - lastImageNum++; - if (lastImageNum == Integer.MAX_VALUE) - lastImageNum = 0; - } - - boolean added = false; - boolean addToByKeys = true; - CacheImage alreadyLoadingImage = imageLoading.get(filter); - if (cancel) { - CacheImage ei = imageLoadingByKeys.get(TAG); - if (ei != null) { - if (ei != alreadyLoadingImage) { - ei.removeImageView(imageView); - if (ei.imageViewArray.size() == 0) { - checkOperationsAndClear(ei.loadOperation); - ei.cancelAndClear(); - imageLoading.remove(ei.key); - } - } else { - addToByKeys = false; - added = true; - } - } - } - - if (alreadyLoadingImage != null && addToByKeys) { - alreadyLoadingImage.addImageView(imageView); - imageLoadingByKeys.put(TAG, alreadyLoadingImage); - added = true; - } - - if (!added) { - CacheImage img = new CacheImage(); - img.key = filter; - img.addImageView(imageView); - imageLoadingByKeys.put(TAG, img); - imageLoading.put(filter, img); - - enqueueImageProcessingOperationWithImage(image, filter, filter, img); - } - } - - void enqueueImageProcessingOperationWithImage(final Bitmap image, final String filter, final String key, final CacheImage img) { - if (key == null) { - return; - } - - Utilities.imageLoadQueue.postRunnable(new Runnable() { - @Override - public void run() { - for (Object v : img.imageViewArray) { - imageLoadingByKeys.remove(getTag(v)); - } - checkOperationsAndClear(img.loadOperation); - imageLoading.remove(key); - } - }); - - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - img.callAndClear(image); - if (image != null && memCache.get(key) == null) { - memCache.put(key, image); - } - } - }); - } - public static Bitmap loadBitmap(String path, Uri uri, float maxWidth, float maxHeight) { BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java index 49b15d1c6..ec2d0a84f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java @@ -12,9 +12,13 @@ import android.app.Activity; import android.content.SharedPreferences; import android.content.res.Configuration; import android.text.format.DateFormat; +import android.util.Xml; import org.telegram.ui.ApplicationLoader; +import org.xmlpull.v1.XmlPullParser; +import java.io.File; +import java.io.FileInputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; @@ -66,42 +70,42 @@ public class LocaleController { } public LocaleController() { - LocaleController.LocaleInfo localeInfo = new LocaleController.LocaleInfo(); + LocaleInfo localeInfo = new LocaleInfo(); localeInfo.name = "English"; localeInfo.nameEnglish = "English"; localeInfo.shortName = "en"; sortedLanguages.add(localeInfo); languagesDict.put(localeInfo.shortName, localeInfo); - localeInfo = new LocaleController.LocaleInfo(); + localeInfo = new LocaleInfo(); localeInfo.name = "Italiano"; localeInfo.nameEnglish = "Italian"; localeInfo.shortName = "it"; sortedLanguages.add(localeInfo); languagesDict.put(localeInfo.shortName, localeInfo); - localeInfo = new LocaleController.LocaleInfo(); + localeInfo = new LocaleInfo(); localeInfo.name = "Español"; localeInfo.nameEnglish = "Spanish"; localeInfo.shortName = "es"; sortedLanguages.add(localeInfo); languagesDict.put(localeInfo.shortName, localeInfo); - localeInfo = new LocaleController.LocaleInfo(); + localeInfo = new LocaleInfo(); localeInfo.name = "Deutsch"; localeInfo.nameEnglish = "German"; localeInfo.shortName = "de"; sortedLanguages.add(localeInfo); languagesDict.put(localeInfo.shortName, localeInfo); - localeInfo = new LocaleController.LocaleInfo(); + localeInfo = new LocaleInfo(); localeInfo.name = "Nederlands"; localeInfo.nameEnglish = "Dutch"; localeInfo.shortName = "nl"; sortedLanguages.add(localeInfo); languagesDict.put(localeInfo.shortName, localeInfo); - localeInfo = new LocaleController.LocaleInfo(); + localeInfo = new LocaleInfo(); localeInfo.name = "العربية"; localeInfo.nameEnglish = "Arabic"; localeInfo.shortName = "ar"; @@ -148,6 +152,75 @@ public class LocaleController { } } + public boolean applyLanguageFile(File file) { + try { + HashMap stringMap = new HashMap(); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(new FileInputStream(file), "UTF-8"); + int eventType = parser.getEventType(); + String name = null; + String value = null; + String attrName = null; + while (eventType != XmlPullParser.END_DOCUMENT) { + if(eventType == XmlPullParser.START_TAG) { + name = parser.getName(); + int c = parser.getAttributeCount(); + if (c > 0) { + attrName = parser.getAttributeValue(0); + } + } else if(eventType == XmlPullParser.TEXT) { + if (attrName != null) { + value = parser.getText(); + } + } else if (eventType == XmlPullParser.END_TAG) { + value = null; + attrName = null; + name = null; + } + if (name != null && name.equals("string") && value != null && attrName != null) { + stringMap.put(attrName, value); + name = null; + value = null; + attrName = null; + } + eventType = parser.next(); + } + + String languageName = stringMap.get("LanguageName"); + String languageNameInEnglish = stringMap.get("LanguageNameInEnglish"); + String languageCode = stringMap.get("LanguageCode"); + + if (languageName != null && languageName.length() > 0 && + languageNameInEnglish != null && languageNameInEnglish.length() > 0 && + languageCode != null && languageCode.length() > 0) { + LocaleInfo localeInfo = new LocaleInfo(); + localeInfo.name = languageName; + localeInfo.nameEnglish = languageNameInEnglish; + localeInfo.shortName = languageCode; + sortedLanguages.add(localeInfo); + languagesDict.put(localeInfo.shortName, localeInfo); + + Collections.sort(sortedLanguages, new Comparator() { + @Override + public int compare(LocaleController.LocaleInfo o, LocaleController.LocaleInfo o2) { + if (o.shortName == null) { + return -1; + } else if (o2.shortName == null) { + return 1; + } + return o.name.compareTo(o2.name); + } + }); + applyLanguage(localeInfo, true); + localeValues = stringMap; + return true; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return false; + } + public void applyLanguage(LocaleInfo localeInfo, boolean override) { if (localeInfo == null) { return; @@ -196,7 +269,7 @@ public class LocaleController { } public static String getCurrentLanguageName() { - return getString("LanguangeName", R.string.LanguangeName); + return getString("LanguageName", R.string.LanguageName); } public static String getString(String key, int res) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index 792d3eb18..018ffefb4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -20,9 +20,12 @@ import android.media.audiofx.AutomaticGainControl; import android.net.Uri; import android.os.Environment; import android.os.Vibrator; +import android.view.View; import org.telegram.objects.MessageObject; import org.telegram.ui.ApplicationLoader; +import org.telegram.ui.Cells.ChatMediaCell; +import org.telegram.ui.Views.GifDrawable; import java.io.File; import java.io.FileInputStream; @@ -54,6 +57,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel public void onFailedDownload(String fileName); public void onSuccessDownload(String fileName); public void onProgressDownload(String fileName, float progress); + public void onProgressUpload(String fileName, float progress, boolean isEncrypted); public int getObserverTag(); } @@ -84,6 +88,10 @@ public class MediaController implements NotificationCenter.NotificationCenterDel private ArrayList deleteLaterArray = new ArrayList(); private int lastTag = 0; + private GifDrawable currentGifDrawable; + private MessageObject currentGifMessageObject; + private ChatMediaCell currentMediaCell; + private boolean isPaused = false; private MediaPlayer audioPlayer = null; private AudioTrack audioTrackPlayer = null; @@ -226,6 +234,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel NotificationCenter.getInstance().addObserver(this, FileLoader.FileDidFailedLoad); NotificationCenter.getInstance().addObserver(this, FileLoader.FileDidLoaded); NotificationCenter.getInstance().addObserver(this, FileLoader.FileLoadProgressChanged); + NotificationCenter.getInstance().addObserver(this, FileLoader.FileUploadProgressChanged); Timer progressTimer = new Timer(); progressTimer.schedule(new TimerTask() { @@ -273,6 +282,12 @@ public class MediaController implements NotificationCenter.NotificationCenterDel public void cleanup() { clenupPlayer(false); + if (currentGifDrawable != null) { + currentGifDrawable.recycle(); + currentGifDrawable = null; + } + currentMediaCell = null; + currentGifMessageObject = null; } public int generateObserverTag() { @@ -377,6 +392,22 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } listenerInProgress = false; processLaterArrays(); + } else if (id == FileLoader.FileUploadProgressChanged) { + String location = (String)args[0]; + listenerInProgress = true; + String fileName = (String)args[0]; + ArrayList> arrayList = loadingFileObservers.get(fileName); + if (arrayList != null) { + Float progress = (Float)args[1]; + Boolean enc = (Boolean)args[2]; + for (WeakReference reference : arrayList) { + if (reference.get() != null) { + reference.get().onProgressUpload(fileName, progress, enc); + } + } + } + listenerInProgress = false; + processLaterArrays(); } } @@ -1079,4 +1110,73 @@ public class MediaController implements NotificationCenter.NotificationCenterDel }); } } + + public GifDrawable getGifDrawable(ChatMediaCell cell, boolean create) { + if (cell == null) { + return null; + } + + MessageObject messageObject = cell.getMessageObject(); + if (messageObject == null) { + return null; + } + + if (currentGifMessageObject != null && messageObject.messageOwner.id == currentGifMessageObject.messageOwner.id) { + currentMediaCell = cell; + currentGifDrawable.parentView = new WeakReference(cell); + return currentGifDrawable; + } + + if (create) { + if (currentMediaCell != null) { + if (currentGifDrawable != null) { + currentGifDrawable.stop(); + currentGifDrawable.recycle(); + } + currentMediaCell.clearGifImage(); + } + currentGifMessageObject = cell.getMessageObject(); + currentMediaCell = cell; + + File cacheFile = null; + if (currentGifMessageObject.messageOwner.attachPath != null && currentGifMessageObject.messageOwner.attachPath.length() != 0) { + File f = new File(currentGifMessageObject.messageOwner.attachPath); + if (f.length() > 0) { + cacheFile = f; + } + } else { + cacheFile = new File(Utilities.getCacheDir(), messageObject.getFileName()); + } + try { + currentGifDrawable = new GifDrawable(cacheFile); + currentGifDrawable.parentView = new WeakReference(cell); + return currentGifDrawable; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + return null; + } + + public void clearGifDrawable(ChatMediaCell cell) { + if (cell == null) { + return; + } + + MessageObject messageObject = cell.getMessageObject(); + if (messageObject == null) { + return; + } + + if (currentGifMessageObject != null && messageObject.messageOwner.id == currentGifMessageObject.messageOwner.id) { + if (currentGifDrawable != null) { + currentGifDrawable.stop(); + currentGifDrawable.recycle(); + currentGifDrawable = null; + } + currentMediaCell = null; + currentGifMessageObject = null; + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index a71ef4b99..7aac77931 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -1895,6 +1895,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter delayedMessage.type = 2; delayedMessage.obj = newMsgObj; delayedMessage.documentLocation = document; + delayedMessage.location = document.thumb.location; performSendDelayedMessage(delayedMessage); } else if (type == 8) { reqSend.media = new TLRPC.TL_inputMediaUploadedAudio(); @@ -1976,9 +1977,15 @@ public class MessagesController implements NotificationCenter.NotificationCenter random.nextBytes(reqSend.media.iv); random.nextBytes(reqSend.media.key); reqSend.media.size = document.size; - reqSend.media.thumb = new byte[0]; - reqSend.media.thumb_h = 0; - reqSend.media.thumb_w = 0; + if (!(document.thumb instanceof TLRPC.TL_photoSizeEmpty)) { + reqSend.media.thumb = document.thumb.bytes; + reqSend.media.thumb_h = document.thumb.h; + reqSend.media.thumb_w = document.thumb.w; + } else { + reqSend.media.thumb = new byte[0]; + reqSend.media.thumb_h = 0; + reqSend.media.thumb_w = 0; + } reqSend.media.file_name = document.file_name; reqSend.media.mime_type = document.mime_type; @@ -2051,18 +2058,30 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (size2.location != null && size.location != null && !(size instanceof TLRPC.TL_photoSizeEmpty) && !(size2 instanceof TLRPC.TL_photoSizeEmpty)) { String fileName = size2.location.volume_id + "_" + size2.location.local_id; String fileName2 = size.location.volume_id + "_" + size.location.local_id; - if (fileName.equals(fileName2)) { - return; + if (!fileName.equals(fileName2)) { + File cacheFile = new File(Utilities.getCacheDir(), fileName + ".jpg"); + File cacheFile2 = new File(Utilities.getCacheDir(), fileName2 + ".jpg"); + boolean result = cacheFile.renameTo(cacheFile2); + FileLoader.getInstance().replaceImageInCache(fileName, fileName2); + size2.location = size.location; } - File cacheFile = new File(Utilities.getCacheDir(), fileName + ".jpg"); - File cacheFile2 = new File(Utilities.getCacheDir(), fileName2 + ".jpg"); - boolean result = cacheFile.renameTo(cacheFile2); - FileLoader.getInstance().replaceImageInCache(fileName, fileName2); - size2.location = size.location; - sentMessage.message = newMsg.message; - sentMessage.attachPath = newMsg.attachPath; } + sentMessage.message = newMsg.message; + sentMessage.attachPath = newMsg.attachPath; } else if (sentMessage.media instanceof TLRPC.TL_messageMediaDocument && sentMessage.media.document != null && newMsg.media instanceof TLRPC.TL_messageMediaDocument && newMsg.media.document != null) { + TLRPC.PhotoSize size2 = newMsg.media.document.thumb; + TLRPC.PhotoSize size = sentMessage.media.document.thumb; + if (size2.location != null && size.location != null && !(size instanceof TLRPC.TL_photoSizeEmpty) && !(size2 instanceof TLRPC.TL_photoSizeEmpty)) { + String fileName = size2.location.volume_id + "_" + size2.location.local_id; + String fileName2 = size.location.volume_id + "_" + size.location.local_id; + if (!fileName.equals(fileName2)) { + File cacheFile = new File(Utilities.getCacheDir(), fileName + ".jpg"); + File cacheFile2 = new File(Utilities.getCacheDir(), fileName2 + ".jpg"); + boolean result = cacheFile.renameTo(cacheFile2); + FileLoader.getInstance().replaceImageInCache(fileName, fileName2); + size2.location = size.location; + } + } sentMessage.message = newMsg.message; sentMessage.attachPath = newMsg.attachPath; } else if (sentMessage.media instanceof TLRPC.TL_messageMediaAudio && sentMessage.media.audio != null && newMsg.media instanceof TLRPC.TL_messageMediaAudio && newMsg.media.audio != null) { @@ -2071,14 +2090,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter String fileName = newMsg.media.audio.dc_id + "_" + newMsg.media.audio.id + ".m4a"; String fileName2 = sentMessage.media.audio.dc_id + "_" + sentMessage.media.audio.id + ".m4a"; - if (fileName.equals(fileName2)) { - return; + if (!fileName.equals(fileName2)) { + File cacheFile = new File(Utilities.getCacheDir(), fileName); + File cacheFile2 = new File(Utilities.getCacheDir(), fileName2); + cacheFile.renameTo(cacheFile2); + newMsg.media.audio.dc_id = sentMessage.media.audio.dc_id; + newMsg.media.audio.id = sentMessage.media.audio.id; } - File cacheFile = new File(Utilities.getCacheDir(), fileName); - File cacheFile2 = new File(Utilities.getCacheDir(), fileName2); - cacheFile.renameTo(cacheFile2); - newMsg.media.audio.dc_id = sentMessage.media.audio.dc_id; - newMsg.media.audio.id = sentMessage.media.audio.id; } } else if (file != null) { if (newMsg.media instanceof TLRPC.TL_messageMediaPhoto && newMsg.media.photo != null) { @@ -2154,12 +2172,11 @@ public class MessagesController implements NotificationCenter.NotificationCenter String fileName = audio.dc_id + "_" + audio.id + ".m4a"; String fileName2 = newMsg.media.audio.dc_id + "_" + newMsg.media.audio.id + ".m4a"; - if (fileName.equals(fileName2)) { - return; + if (!fileName.equals(fileName2)) { + File cacheFile = new File(Utilities.getCacheDir(), fileName); + File cacheFile2 = new File(Utilities.getCacheDir(), fileName2); + cacheFile.renameTo(cacheFile2); } - File cacheFile = new File(Utilities.getCacheDir(), fileName); - File cacheFile2 = new File(Utilities.getCacheDir(), fileName2); - cacheFile.renameTo(cacheFile2); ArrayList arr = new ArrayList(); arr.add(newMsg); @@ -2429,12 +2446,18 @@ public class MessagesController implements NotificationCenter.NotificationCenter FileLoader.getInstance().uploadFile(location, message.sendEncryptedRequest.media.key, message.sendEncryptedRequest.media.iv); } } else if (message.type == 2) { - String location = message.documentLocation.path; - putToDelayedMessages(location, message); - if (message.sendRequest != null) { + if (message.sendRequest != null && message.sendRequest.media.thumb == null && message.location != null) { + String location = Utilities.getCacheDir() + "/" + message.location.volume_id + "_" + message.location.local_id + ".jpg"; + putToDelayedMessages(location, message); FileLoader.getInstance().uploadFile(location, null, null); } else { - FileLoader.getInstance().uploadFile(location, message.sendEncryptedRequest.media.key, message.sendEncryptedRequest.media.iv); + String location = message.documentLocation.path; + putToDelayedMessages(location, message); + if (message.sendRequest != null) { + FileLoader.getInstance().uploadFile(location, null, null); + } else { + FileLoader.getInstance().uploadFile(location, message.sendEncryptedRequest.media.key, message.sendEncryptedRequest.media.iv); + } } } else if (message.type == 3) { String location = message.audioLocation.path; @@ -2545,8 +2568,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter performSendMessageRequest(message.sendRequest, message.obj); } } else if (message.type == 2) { - message.sendRequest.media.file = file; - performSendMessageRequest(message.sendRequest, message.obj); + if (message.sendRequest.media.thumb == null && message.location != null) { + message.sendRequest.media.thumb = file; + performSendDelayedMessage(message); + } else { + message.sendRequest.media.file = file; + performSendMessageRequest(message.sendRequest, message.obj); + } } else if (message.type == 3) { message.sendRequest.media.file = file; performSendMessageRequest(message.sendRequest, message.obj); @@ -4692,7 +4720,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter newMessage.media.geo.lat = decryptedMessage.media.lat; newMessage.media.geo._long = decryptedMessage.media._long; } else if (decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaPhoto) { - if (decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv.length != 32) { + if (decryptedMessage.media.key == null || decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv == null || decryptedMessage.media.iv.length != 32) { return null; } newMessage.media = new TLRPC.TL_messageMediaPhoto(); @@ -4725,7 +4753,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter big.location.local_id = message.file.key_fingerprint; newMessage.media.photo.sizes.add(big); } else if (decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaVideo) { - if (decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv.length != 32) { + if (decryptedMessage.media.key == null || decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv == null || decryptedMessage.media.iv.length != 32) { return null; } newMessage.media = new TLRPC.TL_messageMediaVideo(); @@ -4754,7 +4782,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter newMessage.media.video.key = decryptedMessage.media.key; newMessage.media.video.iv = decryptedMessage.media.iv; } else if (decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaDocument) { - if (decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv.length != 32) { + if (decryptedMessage.media.key == null || decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv == null || decryptedMessage.media.iv.length != 32) { return null; } newMessage.media = new TLRPC.TL_messageMediaDocument(); @@ -4781,7 +4809,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } newMessage.media.document.dc_id = message.file.dc_id; } else if (decryptedMessage.media instanceof TLRPC.TL_decryptedMessageMediaAudio) { - if (decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv.length != 32) { + if (decryptedMessage.media.key == null || decryptedMessage.media.key.length != 32 || decryptedMessage.media.iv == null || decryptedMessage.media.iv.length != 32) { return null; } newMessage.media = new TLRPC.TL_messageMediaAudio(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java index f8ca9bc5a..5f7259290 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java @@ -76,9 +76,6 @@ public class Utilities { public static volatile DispatchQueue stageQueue = new DispatchQueue("stageQueue"); public static volatile DispatchQueue globalQueue = new DispatchQueue("globalQueue"); - public static volatile DispatchQueue cacheOutQueue = new DispatchQueue("cacheOutQueue"); - public static volatile DispatchQueue imageLoadQueue = new DispatchQueue("imageLoadQueue"); - public static volatile DispatchQueue fileUploadQueue = new DispatchQueue("fileUploadQueue"); public static int[] arrColors = {0xffee4928, 0xff41a903, 0xffe09602, 0xff0f94ed, 0xff8f3bf7, 0xfffc4380, 0xff00a1c4, 0xffeb7002}; public static int[] arrUsersAvatars = { diff --git a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java index 31ac47dff..c4f37d0c0 100644 --- a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java @@ -35,6 +35,7 @@ public class MessageObject { public TLRPC.Message messageOwner; public CharSequence messageText; public int type; + public int contentType; public ArrayList photoThumbs; public Bitmap imagePreview; public PhotoObject previewPhoto; @@ -244,6 +245,11 @@ 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); @@ -255,68 +261,53 @@ public class MessageObject { if (message instanceof TLRPC.TL_message || (message instanceof TLRPC.TL_messageForwarded && (message.media == null || !(message.media instanceof TLRPC.TL_messageMediaEmpty)))) { if (message.media == null || message.media instanceof TLRPC.TL_messageMediaEmpty) { - if (message.from_id == UserConfig.clientUserId) { - type = 0; - } else { - type = 1; - } + contentType = type = 0; } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaPhoto) { - if (message.from_id == UserConfig.clientUserId) { - type = 2; - } else { - type = 3; - } + contentType = type = 1; } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaGeo) { if (message.from_id == UserConfig.clientUserId) { - type = 4; + contentType = type = 4; } else { - type = 5; + contentType = type = 5; } } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaVideo) { if (message.from_id == UserConfig.clientUserId) { - type = 6; + contentType = type = 6; } else { - type = 7; + contentType = type = 7; } } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaContact) { if (message.from_id == UserConfig.clientUserId) { - type = 12; + contentType = type = 12; } else { - type = 13; + contentType = type = 13; } } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaUnsupported) { - if (message.from_id == UserConfig.clientUserId) { - type = 0; - } else { - type = 1; - } + contentType = type = 0; } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaDocument) { - if (message.from_id == UserConfig.clientUserId) { - type = 16; + if (message.media.document.thumb != null && !(message.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty) && message.media.document.mime_type != null && message.media.document.mime_type.equals("image/gif")) { + contentType = 1; + type = 8; } else { - type = 17; + if (message.from_id == UserConfig.clientUserId) { + contentType = type = 8; + } else { + contentType = type = 9; + } } } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaAudio) { - if (message.from_id == UserConfig.clientUserId) { - type = 18; - } else { - type = 19; - } + contentType = type = 2; } } else if (message instanceof TLRPC.TL_messageService) { if (message.action instanceof TLRPC.TL_messageActionLoginUnknownLocation) { - type = 1; + contentType = type = 0; } else if (message.action instanceof TLRPC.TL_messageActionChatEditPhoto || message.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) { - type = 11; + contentType = type = 11; } else { - type = 10; + contentType = type = 10; } } else if (message instanceof TLRPC.TL_messageForwarded) { - if (message.from_id == UserConfig.clientUserId) { - type = 8; - } else { - type = 9; - } + contentType = type = 0; } Calendar rightNow = new GregorianCalendar(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java index 25d943e99..386ef6175 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java @@ -60,8 +60,8 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega private TLRPC.FileLocation currentPhoto; private String currentNameString; - public ChatAudioCell(Context context, boolean isChat) { - super(context, isChat); + public ChatAudioCell(Context context) { + super(context, false); TAG = MediaController.getInstance().generateObserverTag(); avatarImage = new ImageReceiver(); @@ -101,6 +101,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega avatarImage.clearImage(); currentPhoto = null; } + MediaController.getInstance().removeLoadingFileObserver(this); } @Override @@ -230,7 +231,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega } progressView.setProgress(0); } else { - MediaController.getInstance().addLoadingFileObserver(currentMessageObject.getFileName(), this); + MediaController.getInstance().addLoadingFileObserver(fileName, this); if (!FileLoader.getInstance().isLoadingFile(fileName)) { buttonState = 2; progressView.setProgress(0); @@ -263,6 +264,11 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega invalidate(); } + @Override + public void onProgressUpload(String fileName, float progress, boolean isEncrypted) { + + } + @Override public int getObserverTag() { return TAG; @@ -281,7 +287,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); setMeasuredDimension(width, Utilities.dp(68)); - if (chat) { + if (isChat) { backgroundWidth = Math.min(width - Utilities.dp(102), Utilities.dp(300)); } else { backgroundWidth = Math.min(width - Utilities.dp(50), Utilities.dp(300)); @@ -298,7 +304,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega buttonX = layoutWidth - backgroundWidth + Utilities.dp(67); timeX = layoutWidth - backgroundWidth + Utilities.dp(71); } else { - if (chat) { + if (isChat) { avatarImage.imageX = Utilities.dp(69); seekBarX = Utilities.dp(158); buttonX = Utilities.dp(128); @@ -355,10 +361,10 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega if (messageObject.messageOwner.out) { seekBar.type = 0; - progressView.type = 0; + progressView.setProgressColors(0xffb4e396, 0xff6ac453); } else { seekBar.type = 1; - progressView.type = 1; + progressView.setProgressColors(0xffd9e2eb, 0xff86c5f8); } super.setMessageObject(messageObject); @@ -405,10 +411,4 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega timeLayout.draw(canvas); canvas.restore(); } - - @Override - protected void finalize() throws Throwable { - MediaController.getInstance().removeLoadingFileObserver(this); - super.finalize(); - } } 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 074f0e35c..0a565250e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java @@ -35,25 +35,37 @@ public class ChatBaseCell extends BaseCell { public static interface ChatBaseCellDelegate { public abstract void didPressedUserAvatar(ChatBaseCell cell, TLRPC.User user); + public abstract void didPressedCanceSendButton(ChatBaseCell cell); } - protected boolean chat; + public boolean isChat = false; protected boolean isPressed = false; protected boolean forwardName = false; + protected boolean media = false; private boolean isCheckPressed = true; private boolean wasLayout = false; + protected boolean isAvatarVisible = false; protected MessageObject currentMessageObject; private static Drawable backgroundDrawableIn; private static Drawable backgroundDrawableInSelected; private static Drawable backgroundDrawableOut; private static Drawable backgroundDrawableOutSelected; + private static Drawable backgroundMediaDrawableIn; + private static Drawable backgroundMediaDrawableInSelected; + private static Drawable backgroundMediaDrawableOut; + private static Drawable backgroundMediaDrawableOutSelected; private static Drawable checkDrawable; private static Drawable halfCheckDrawable; private static Drawable clockDrawable; + private static Drawable checkMediaDrawable; + private static Drawable halfCheckMediaDrawable; + private static Drawable clockMediaDrawable; private static Drawable errorDrawable; + protected static Drawable mediaBackgroundDrawable; private static TextPaint timePaintIn; private static TextPaint timePaintOut; + private static TextPaint timeMediaPaint; private static TextPaint namePaint; private static TextPaint forwardNamePaint; @@ -95,23 +107,19 @@ public class ChatBaseCell extends BaseCell { protected int namesOffset = 0; - public ChatBaseCell(Context context, boolean isChat) { + public ChatBaseCell(Context context, boolean isMedia) { super(context); init(); - chat = isChat; - if (chat) { - avatarImage = new ImageReceiver(); - avatarImage.parentView = new WeakReference(this); - } + media = isMedia; + avatarImage = new ImageReceiver(); + avatarImage.parentView = new WeakReference(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (avatarImage != null) { - avatarImage.clearImage(); - currentPhoto = null; - } + avatarImage.clearImage(); + currentPhoto = null; } private void init() { @@ -120,10 +128,18 @@ public class ChatBaseCell extends BaseCell { backgroundDrawableInSelected = getResources().getDrawable(R.drawable.msg_in_selected); backgroundDrawableOut = getResources().getDrawable(R.drawable.msg_out); backgroundDrawableOutSelected = getResources().getDrawable(R.drawable.msg_out_selected); + backgroundMediaDrawableIn = getResources().getDrawable(R.drawable.msg_in_photo); + backgroundMediaDrawableInSelected = getResources().getDrawable(R.drawable.msg_in_photo_selected); + backgroundMediaDrawableOut = getResources().getDrawable(R.drawable.msg_out_photo); + backgroundMediaDrawableOutSelected = getResources().getDrawable(R.drawable.msg_out_photo_selected); checkDrawable = getResources().getDrawable(R.drawable.msg_check); halfCheckDrawable = getResources().getDrawable(R.drawable.msg_halfcheck); clockDrawable = getResources().getDrawable(R.drawable.msg_clock); + checkMediaDrawable = getResources().getDrawable(R.drawable.msg_check_w); + halfCheckMediaDrawable = getResources().getDrawable(R.drawable.msg_halfcheck_w); + clockMediaDrawable = getResources().getDrawable(R.drawable.msg_clock_photo); errorDrawable = getResources().getDrawable(R.drawable.msg_warning); + mediaBackgroundDrawable = getResources().getDrawable(R.drawable.phototime); timePaintIn = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); timePaintIn.setTextSize(Utilities.dp(12)); @@ -133,11 +149,16 @@ public class ChatBaseCell extends BaseCell { timePaintOut.setTextSize(Utilities.dp(12)); timePaintOut.setColor(0xff70b15c); + timeMediaPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); + timeMediaPaint.setTextSize(Utilities.dp(12)); + timeMediaPaint.setColor(0xffffffff); + namePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); namePaint.setTextSize(Utilities.dp(15)); forwardNamePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); forwardNamePaint.setTextSize(Utilities.dp(14)); + } } @@ -160,7 +181,7 @@ public class ChatBaseCell extends BaseCell { TLRPC.User newUser = MessagesController.getInstance().users.get(currentMessageObject.messageOwner.from_id); TLRPC.FileLocation newPhoto = null; - if (avatarImage != null && newUser != null && newUser.photo != null) { + if (isAvatarVisible && newUser != null && newUser.photo != null) { newPhoto = newUser.photo.photo_small; } @@ -169,7 +190,7 @@ public class ChatBaseCell extends BaseCell { } String newNameString = null; - if (drawName && chat && newUser != null && !currentMessageObject.messageOwner.out) { + if (drawName && isChat && newUser != null && !currentMessageObject.messageOwner.out) { newNameString = Utilities.formatName(newUser.first_name, newUser.last_name); } @@ -198,7 +219,8 @@ public class ChatBaseCell extends BaseCell { } currentUser = MessagesController.getInstance().users.get(messageObject.messageOwner.from_id); - if (avatarImage != null) { + if (isChat && !messageObject.messageOwner.out) { + isAvatarVisible = true; if (currentUser != null) { if (currentUser.photo != null) { currentPhoto = currentUser.photo.photo_small; @@ -209,10 +231,14 @@ public class ChatBaseCell extends BaseCell { } } - if (currentMessageObject.messageOwner.out) { - currentTimePaint = timePaintOut; + if (!media) { + if (currentMessageObject.messageOwner.out) { + currentTimePaint = timePaintOut; + } else { + currentTimePaint = timePaintIn; + } } else { - currentTimePaint = timePaintIn; + currentTimePaint = timeMediaPaint; } currentTimeString = LocaleController.formatterDay.format((long) (currentMessageObject.messageOwner.date) * 1000); @@ -220,7 +246,7 @@ public class ChatBaseCell extends BaseCell { namesOffset = 0; - if (drawName && chat && currentUser != null && !currentMessageObject.messageOwner.out) { + if (drawName && isChat && currentUser != null && !currentMessageObject.messageOwner.out) { currentNameString = Utilities.formatName(currentUser.first_name, currentUser.last_name); nameWidth = getMaxNameWidth(); @@ -284,7 +310,7 @@ public class ChatBaseCell extends BaseCell { float x = event.getX(); float y = event.getY(); if (event.getAction() == MotionEvent.ACTION_DOWN) { - if (avatarImage != null && x >= avatarImage.imageX && x <= avatarImage.imageX + avatarImage.imageW && y >= avatarImage.imageY && y <= avatarImage.imageY + avatarImage.imageH) { + if (isAvatarVisible && x >= avatarImage.imageX && x <= avatarImage.imageX + avatarImage.imageW && y >= avatarImage.imageY && y <= avatarImage.imageY + avatarImage.imageH) { avatarPressed = true; result = true; } else if (drawForwardedName && forwardedNameLayout != null) { @@ -303,7 +329,7 @@ public class ChatBaseCell extends BaseCell { } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { avatarPressed = false; } else if (event.getAction() == MotionEvent.ACTION_MOVE) { - if (avatarImage != null && !(x >= avatarImage.imageX && x <= avatarImage.imageX + avatarImage.imageW && y >= avatarImage.imageY && y <= avatarImage.imageY + avatarImage.imageH)) { + if (isAvatarVisible && !(x >= avatarImage.imageX && x <= avatarImage.imageX + avatarImage.imageW && y >= avatarImage.imageY && y <= avatarImage.imageY + avatarImage.imageH)) { avatarPressed = false; } } @@ -338,13 +364,21 @@ public class ChatBaseCell extends BaseCell { layoutHeight = getMeasuredHeight(); timeLayout = new StaticLayout(currentTimeString, currentTimePaint, timeWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); - if (!currentMessageObject.messageOwner.out) { - timeX = backgroundWidth - Utilities.dp(9) - timeWidth + (chat ? Utilities.dp(52) : 0); + if (!media) { + if (!currentMessageObject.messageOwner.out) { + timeX = backgroundWidth - Utilities.dp(9) - timeWidth + (isChat ? Utilities.dp(52) : 0); + } else { + timeX = layoutWidth - timeWidth - Utilities.dpf(38.5f); + } } else { - timeX = layoutWidth - timeWidth - Utilities.dpf(38.5f); + if (!currentMessageObject.messageOwner.out) { + timeX = backgroundWidth - Utilities.dp(4) - timeWidth + (isChat ? Utilities.dp(52) : 0); + } else { + timeX = layoutWidth - timeWidth - Utilities.dpf(42.0f); + } } - if (avatarImage != null) { + if (isAvatarVisible) { avatarImage.imageX = Utilities.dp(6); avatarImage.imageY = layoutHeight - Utilities.dp(45); avatarImage.imageW = Utilities.dp(42); @@ -355,6 +389,11 @@ public class ChatBaseCell extends BaseCell { } } + protected void onAfterBackgroundDraw(Canvas canvas) { + + } + + @Override protected void onDraw(Canvas canvas) { if (currentMessageObject == null) { @@ -366,32 +405,50 @@ public class ChatBaseCell extends BaseCell { return; } - if (avatarImage != null) { + if (isAvatarVisible) { avatarImage.draw(canvas, Utilities.dp(6), layoutHeight - Utilities.dp(45), Utilities.dp(42), Utilities.dp(42)); } Drawable currentBackgroundDrawable = null; if (currentMessageObject.messageOwner.out) { if (isPressed() && isCheckPressed || !isCheckPressed && isPressed) { - currentBackgroundDrawable = backgroundDrawableOutSelected; + if (!media) { + currentBackgroundDrawable = backgroundDrawableOutSelected; + } else { + currentBackgroundDrawable = backgroundMediaDrawableOutSelected; + } } else { - currentBackgroundDrawable = backgroundDrawableOut; + if (!media) { + currentBackgroundDrawable = backgroundDrawableOut; + } else { + currentBackgroundDrawable = backgroundMediaDrawableOut; + } } - setDrawableBounds(currentBackgroundDrawable, layoutWidth - backgroundWidth, Utilities.dp(1), backgroundWidth, layoutHeight - Utilities.dp(2)); + setDrawableBounds(currentBackgroundDrawable, layoutWidth - backgroundWidth - (!media ? 0 : Utilities.dp(9)), Utilities.dp(1), backgroundWidth, layoutHeight - Utilities.dp(2)); } else { if (isPressed() && isCheckPressed || !isCheckPressed && isPressed) { - currentBackgroundDrawable = backgroundDrawableInSelected; + if (!media) { + currentBackgroundDrawable = backgroundDrawableInSelected; + } else { + currentBackgroundDrawable = backgroundMediaDrawableInSelected; + } } else { - currentBackgroundDrawable = backgroundDrawableIn; + if (!media) { + currentBackgroundDrawable = backgroundDrawableIn; + } else { + currentBackgroundDrawable = backgroundMediaDrawableIn; + } } - if (chat) { - setDrawableBounds(currentBackgroundDrawable, Utilities.dp(52), Utilities.dp(1), backgroundWidth, layoutHeight - Utilities.dp(2)); + if (isChat) { + setDrawableBounds(currentBackgroundDrawable, Utilities.dp(52 + (!media ? 0 : 9)), Utilities.dp(1), backgroundWidth, layoutHeight - Utilities.dp(2)); } else { - setDrawableBounds(currentBackgroundDrawable, 0, Utilities.dp(1), backgroundWidth, layoutHeight - Utilities.dp(2)); + setDrawableBounds(currentBackgroundDrawable, (!media ? 0 : Utilities.dp(9)), Utilities.dp(1), backgroundWidth, layoutHeight - Utilities.dp(2)); } } currentBackgroundDrawable.draw(canvas); + onAfterBackgroundDraw(canvas); + if (drawName && nameLayout != null) { canvas.save(); canvas.translate(currentBackgroundDrawable.getBounds().left + Utilities.dp(19) - nameOffsetX, Utilities.dp(10)); @@ -416,10 +473,20 @@ public class ChatBaseCell extends BaseCell { canvas.restore(); } - canvas.save(); - canvas.translate(timeX, layoutHeight - Utilities.dpf(6.5f) - timeLayout.getHeight()); - timeLayout.draw(canvas); - canvas.restore(); + if (media) { + setDrawableBounds(mediaBackgroundDrawable, timeX - Utilities.dp(3), layoutHeight - Utilities.dpf(27.5f), timeWidth + Utilities.dp(6 + (currentMessageObject.messageOwner.out ? 20 : 0)), Utilities.dpf(16.5f)); + mediaBackgroundDrawable.draw(canvas); + + canvas.save(); + canvas.translate(timeX, layoutHeight - Utilities.dpf(12.0f) - timeLayout.getHeight()); + timeLayout.draw(canvas); + canvas.restore(); + } else { + canvas.save(); + canvas.translate(timeX, layoutHeight - Utilities.dpf(6.5f) - timeLayout.getHeight()); + timeLayout.draw(canvas); + canvas.restore(); + } if (currentMessageObject.messageOwner.out) { boolean drawCheck1 = false; @@ -450,24 +517,48 @@ public class ChatBaseCell extends BaseCell { } if (drawClock) { - setDrawableBounds(clockDrawable, layoutWidth - Utilities.dpf(18.5f) - clockDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - clockDrawable.getIntrinsicHeight()); - clockDrawable.draw(canvas); + if (!media) { + setDrawableBounds(clockDrawable, layoutWidth - Utilities.dpf(18.5f) - clockDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - clockDrawable.getIntrinsicHeight()); + clockDrawable.draw(canvas); + } else { + setDrawableBounds(clockMediaDrawable, layoutWidth - Utilities.dpf(22.0f) - clockMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - clockMediaDrawable.getIntrinsicHeight()); + clockMediaDrawable.draw(canvas); + } } if (drawCheck2) { - if (drawCheck1) { - setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + if (!media) { + if (drawCheck1) { + setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + } else { + setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + } + checkDrawable.draw(canvas); } else { - setDrawableBounds(checkDrawable, layoutWidth - Utilities.dpf(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - checkDrawable.getIntrinsicHeight()); + if (drawCheck1) { + setDrawableBounds(checkMediaDrawable, layoutWidth - Utilities.dpf(26.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); + } else { + setDrawableBounds(checkMediaDrawable, layoutWidth - Utilities.dpf(22.0f) - checkMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.0f) - checkMediaDrawable.getIntrinsicHeight()); + } + checkMediaDrawable.draw(canvas); } - checkDrawable.draw(canvas); } if (drawCheck1) { - setDrawableBounds(halfCheckDrawable, layoutWidth - Utilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - halfCheckDrawable.getIntrinsicHeight()); - halfCheckDrawable.draw(canvas); + if (!media) { + setDrawableBounds(halfCheckDrawable, layoutWidth - Utilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(8.5f) - halfCheckDrawable.getIntrinsicHeight()); + halfCheckDrawable.draw(canvas); + } else { + setDrawableBounds(halfCheckMediaDrawable, layoutWidth - Utilities.dpf(20.5f) - halfCheckMediaDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(13.5f) - halfCheckMediaDrawable.getIntrinsicHeight()); + halfCheckMediaDrawable.draw(canvas); + } } if (drawError) { - setDrawableBounds(errorDrawable, layoutWidth - Utilities.dp(18) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(6.5f) - errorDrawable.getIntrinsicHeight()); - errorDrawable.draw(canvas); + if (!media) { + setDrawableBounds(errorDrawable, layoutWidth - Utilities.dp(18) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(6.5f) - errorDrawable.getIntrinsicHeight()); + errorDrawable.draw(canvas); + } else { + setDrawableBounds(errorDrawable, layoutWidth - Utilities.dpf(20.5f) - errorDrawable.getIntrinsicWidth(), layoutHeight - Utilities.dpf(12.5f) - errorDrawable.getIntrinsicHeight()); + errorDrawable.draw(canvas); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java new file mode 100644 index 000000000..b230ff1c5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -0,0 +1,514 @@ +/* + * This is the source code of Telegram for Android v. 1.4.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.Cells; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.view.MotionEvent; +import android.view.SoundEffectConstants; +import android.view.View; + +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.MediaController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; +import org.telegram.objects.MessageObject; +import org.telegram.objects.PhotoObject; +import org.telegram.ui.Views.GifDrawable; +import org.telegram.ui.Views.ImageReceiver; +import org.telegram.ui.Views.ProgressView; + +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.Locale; + +public class ChatMediaCell extends ChatBaseCell implements MediaController.FileDownloadProgressListener { + + public static interface ChatMediaCellDelegate { + public abstract void didPressedImage(ChatBaseCell cell); + } + + private static Drawable placeholderInDrawable; + private static Drawable placeholderOutDrawable; + private static Drawable[][] buttonStatesDrawables = new Drawable[3][2]; + private static TextPaint infoPaint; + + private GifDrawable gifDrawable = null; + + private int photoWidth; + private int photoHeight; + private PhotoObject currentPhotoObject; + private String currentPhotoFilter; + private ImageReceiver photoImage; + private ProgressView progressView; + public boolean downloadPhotos = true; + private boolean progressVisible = false; + + private int TAG; + + private int buttonState = 0; + private int buttonPressed = 0; + private boolean imagePressed = false; + private int buttonX; + private int buttonY; + + private StaticLayout infoLayout; + protected int infoWidth; + private String currentInfoString; + + public ChatMediaCellDelegate mediaDelegate = null; + + public ChatMediaCell(Context context) { + super(context, true); + + 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); + + infoPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + infoPaint.setColor(0xffffffff); + infoPaint.setTextSize(Utilities.dp(12)); + } + + TAG = MediaController.getInstance().generateObserverTag(); + + photoImage = new ImageReceiver(); + photoImage.parentView = new WeakReference(this); + progressView = new ProgressView(); + progressView.setProgressColors(0x802a2a2a, 0xffffffff); + } + + public void clearGifImage() { + if (currentMessageObject != null && currentMessageObject.type == 8) { + gifDrawable = null; + buttonState = 2; + invalidate(); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + //if (photoImage != null) { + // photoImage.clearImage(); + //} + if (gifDrawable != null) { + MediaController.getInstance().clearGifDrawable(this); + gifDrawable = null; + } + MediaController.getInstance().removeLoadingFileObserver(this); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX(); + float y = event.getY(); + + boolean result = false; + int side = Utilities.dp(44); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (buttonState != -1 && x >= buttonX && x <= buttonX + side && y >= buttonY && y <= buttonY + side) { + buttonPressed = 1; + invalidate(); + result = true; + } else if (x >= photoImage.imageX && x <= photoImage.imageX + photoImage.imageW && y >= photoImage.imageY && y <= photoImage.imageY + photoImage.imageH) { + imagePressed = true; + result = true; + } + } else if (buttonPressed == 1) { + if (event.getAction() == MotionEvent.ACTION_UP) { + buttonPressed = 0; + playSoundEffect(SoundEffectConstants.CLICK); + didPressedButton(); + invalidate(); + } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { + buttonPressed = 0; + invalidate(); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (!(x >= buttonX && x <= buttonX + side && y >= buttonY && y <= buttonY + side)) { + buttonPressed = 0; + invalidate(); + } + } + } else if (imagePressed) { + if (event.getAction() == MotionEvent.ACTION_UP) { + imagePressed = false; + playSoundEffect(SoundEffectConstants.CLICK); + didPressedImage(); + invalidate(); + } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { + imagePressed = false; + invalidate(); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (!(x >= photoImage.imageX && x <= photoImage.imageX + photoImage.imageW && y >= photoImage.imageY && y <= photoImage.imageY + photoImage.imageH)) { + imagePressed = false; + invalidate(); + } + } + } + if (!result) { + result = super.onTouchEvent(event); + } + + return result; + } + + private void didPressedImage() { + if (currentMessageObject.type == 1) { + if (buttonState == -1) { + if (currentMessageObject.type == 1) { + if (mediaDelegate != null) { + mediaDelegate.didPressedImage(this); + } + } + } else if (buttonState == 0) { + didPressedButton(); + } + } else if (currentMessageObject.type == 8) { + if (buttonState == -1) { + buttonState = 2; + gifDrawable.pause(); + invalidate(); + } else if (buttonState == 2 || buttonState == 0) { + didPressedButton(); + } + } + } + + private void didPressedButton() { + if (buttonState == 0) { + if (currentMessageObject.type == 1) { + if (currentMessageObject.imagePreview != null) { + photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, new BitmapDrawable(currentMessageObject.imagePreview), currentPhotoObject.photoOwner.size); + } else { + photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, currentMessageObject.messageOwner.out ? placeholderOutDrawable : placeholderInDrawable, currentPhotoObject.photoOwner.size); + } + } else if (currentMessageObject.type == 8) { + FileLoader.getInstance().loadFile(null, null, currentMessageObject.messageOwner.media.document, null); + } + progressVisible = true; + buttonState = 1; + invalidate(); + } else if (buttonState == 1) { + if (currentMessageObject.messageOwner.out && currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) { + if (delegate != null) { + delegate.didPressedCanceSendButton(this); + } + } else { + if (currentMessageObject.type == 1) { + FileLoader.getInstance().cancelLoadingForImageView(photoImage); + } else if (currentMessageObject.type == 8) { + FileLoader.getInstance().cancelLoadFile(null, null, currentMessageObject.messageOwner.media.document, null); + } + progressVisible = false; + buttonState = 0; + invalidate(); + } + } else if (buttonState == 2) { + if (gifDrawable == null) { + gifDrawable = MediaController.getInstance().getGifDrawable(this, true); + } + if (gifDrawable != null) { + gifDrawable.start(); + gifDrawable.invalidateSelf(); + buttonState = -1; + invalidate(); + } + } + } + + @Override + public void setMessageObject(MessageObject messageObject) { + super.setMessageObject(messageObject); + + progressVisible = false; + buttonState = -1; + gifDrawable = null; + + if (messageObject.type == 8) { + gifDrawable = MediaController.getInstance().getGifDrawable(this, false); + + String str = Utilities.formatFileSize(messageObject.messageOwner.media.document.size); + if (currentInfoString == null || !currentInfoString.equals(str)) { + currentInfoString = str; + infoWidth = (int) Math.ceil(infoPaint.measureText(currentInfoString)); + infoLayout = new StaticLayout(currentInfoString, infoPaint, infoWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + } + } else { + currentInfoString = null; + infoLayout = null; + } + + photoWidth = (int) (Math.min(Utilities.displaySize.x, Utilities.displaySize.y) * 0.7f); + photoHeight = photoWidth + Utilities.dp(100); + if (messageObject.type == 6 || messageObject.type == 7) { + photoWidth = (int) (Math.min(Utilities.displaySize.x, Utilities.displaySize.y) / 2.5f); + photoHeight = photoWidth + 100; + } + if (photoWidth > 800) { + photoWidth = 800; + } + if (photoHeight > 800) { + photoHeight = 800; + } + + currentPhotoObject = PhotoObject.getClosestImageWithSize(messageObject.photoThumbs, photoWidth, photoHeight); + if (currentPhotoObject != null) { + float scale = (float) currentPhotoObject.photoOwner.w / (float) photoWidth; + + int w = (int) (currentPhotoObject.photoOwner.w / scale); + int h = (int) (currentPhotoObject.photoOwner.h / scale); + if (h > photoHeight) { + float scale2 = h; + h = photoHeight; + scale2 /= h; + w = (int) (w / scale2); + } else if (h < Utilities.dp(120)) { + h = Utilities.dp(120); + float hScale = (float) currentPhotoObject.photoOwner.h / h; + if (currentPhotoObject.photoOwner.w / hScale < photoWidth) { + w = (int) (currentPhotoObject.photoOwner.w / hScale); + } + } + + photoWidth = w; + photoHeight = h; + backgroundWidth = w + Utilities.dp(12); + currentPhotoFilter = String.format(Locale.US, "%d_%d", (int) (w / Utilities.density), (int) (h / Utilities.density)); + + if (currentPhotoObject.image != null) { + photoImage.setImageBitmap(currentPhotoObject.image); + } else { + boolean photoExist = true; + String fileName = MessageObject.getAttachFileName(currentPhotoObject.photoOwner); + if (messageObject.type == 1) { + File cacheFile = new File(Utilities.getCacheDir(), fileName); + if (!cacheFile.exists()) { + photoExist = false; + } else { + MediaController.getInstance().removeLoadingFileObserver(this); + } + } + if (photoExist || downloadPhotos) { + if (messageObject.imagePreview != null) { + photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, new BitmapDrawable(messageObject.imagePreview), currentPhotoObject.photoOwner.size); + } else { + photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, messageObject.messageOwner.out ? placeholderOutDrawable : placeholderInDrawable, currentPhotoObject.photoOwner.size); + } + } else { + if (messageObject.imagePreview != null) { + photoImage.setImageBitmap(messageObject.imagePreview); + } else { + photoImage.setImageBitmap(messageObject.messageOwner.out ? placeholderOutDrawable : placeholderInDrawable); + } + } + } + } else { + photoImage.setImageBitmap(messageObject.messageOwner.out ? placeholderOutDrawable : placeholderInDrawable); + } + + /*if ((type == 6 || type == 7) && videoTimeText != null) { + int duration = message.messageOwner.media.video.duration; + int minutes = duration / 60; + int seconds = duration - minutes * 60; + videoTimeText.setText(String.format("%d:%02d", minutes, seconds)); + }*/ + + updateButtonState(); + invalidate(); + } + + public void updateButtonState() { + String fileName = null; + File cacheFile = null; + if (currentMessageObject.type == 1) { + fileName = MessageObject.getAttachFileName(currentPhotoObject.photoOwner); + cacheFile = new File(Utilities.getCacheDir(), fileName); + } else if (currentMessageObject.type == 8) { + if (currentMessageObject.messageOwner.attachPath != null && currentMessageObject.messageOwner.attachPath.length() != 0) { + File f = new File(currentMessageObject.messageOwner.attachPath); + if (f.exists()) { + fileName = currentMessageObject.messageOwner.attachPath; + cacheFile = f; + } + } else { + fileName = currentMessageObject.getFileName(); + cacheFile = new File(Utilities.getCacheDir(), fileName); + } + } + if (fileName == null) { + return; + } + if (currentMessageObject.messageOwner.out && currentMessageObject.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) { + if (currentMessageObject.messageOwner.attachPath != null) { + MediaController.getInstance().addLoadingFileObserver(currentMessageObject.messageOwner.attachPath, this); + progressVisible = true; + buttonState = 1; + Float progress = FileLoader.getInstance().fileProgresses.get(currentMessageObject.messageOwner.attachPath); + if (progress != null) { + progressView.setProgress(progress); + } else { + progressView.setProgress(0); + } + } + } else { + if (currentMessageObject.messageOwner.attachPath != null) { + MediaController.getInstance().removeLoadingFileObserver(this); + } + if (cacheFile.exists() && cacheFile.length() == 0) { + cacheFile.delete(); + } + if (!cacheFile.exists()) { + MediaController.getInstance().addLoadingFileObserver(fileName, this); + if (!FileLoader.getInstance().isLoadingFile(fileName)) { + if (currentMessageObject.type != 1 || !downloadPhotos) { + buttonState = 0; + progressVisible = false; + } else { + buttonState = -1; + progressVisible = true; + } + progressView.setProgress(0); + } else { + if (currentMessageObject.type != 1 || !downloadPhotos) { + buttonState = 1; + } else { + buttonState = -1; + } + progressVisible = true; + Float progress = FileLoader.getInstance().fileProgresses.get(fileName); + if (progress != null) { + progressView.setProgress(progress); + } else { + progressView.setProgress(0); + } + } + } else { + MediaController.getInstance().removeLoadingFileObserver(this); + progressVisible = false; + if (currentMessageObject.type == 8 && gifDrawable == null) { + buttonState = 2; + } else { + buttonState = -1; + } + invalidate(); + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), photoHeight + Utilities.dp(14)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + if (currentMessageObject.messageOwner.out) { + photoImage.imageX = layoutWidth - backgroundWidth - Utilities.dp(3); + } else { + if (isChat) { + photoImage.imageX = Utilities.dp(67); + } else { + photoImage.imageX = Utilities.dp(15); + } + } + photoImage.imageY = Utilities.dp(7); + photoImage.imageW = photoWidth; + photoImage.imageH = photoHeight; + + progressView.width = timeX - photoImage.imageX - Utilities.dpf(23.0f); + progressView.height = Utilities.dp(3); + progressView.progressHeight = Utilities.dp(3); + + int size = Utilities.dp(44); + buttonX = (int)(photoImage.imageX + (photoWidth - size) / 2.0f); + buttonY = (int)(photoImage.imageY + (photoHeight - size) / 2.0f); + } + + @Override + protected void onAfterBackgroundDraw(Canvas canvas) { + if (gifDrawable != null) { + canvas.save(); + gifDrawable.setBounds(photoImage.imageX, photoImage.imageY, photoImage.imageX + photoWidth, photoImage.imageY + photoHeight); + gifDrawable.draw(canvas); + canvas.restore(); + } else { + photoImage.draw(canvas, photoImage.imageX, photoImage.imageY, photoWidth, photoHeight); + } + + if (progressVisible) { + setDrawableBounds(mediaBackgroundDrawable, photoImage.imageX + Utilities.dp(4), layoutHeight - Utilities.dpf(27.5f), progressView.width + Utilities.dp(12), Utilities.dpf(16.5f)); + mediaBackgroundDrawable.draw(canvas); + + canvas.save(); + canvas.translate(photoImage.imageX + Utilities.dp(10), layoutHeight - Utilities.dpf(21.0f)); + progressView.draw(canvas); + canvas.restore(); + } + + if (buttonState >= 0 && buttonState < 3) { + Drawable currentButtonDrawable = buttonStatesDrawables[buttonState][buttonPressed]; + setDrawableBounds(currentButtonDrawable, buttonX, buttonY); + currentButtonDrawable.draw(canvas); + } + + if (infoLayout != null && (buttonState == 1 || buttonState == 0)) { + setDrawableBounds(mediaBackgroundDrawable, photoImage.imageX + Utilities.dp(4), photoImage.imageY + Utilities.dp(4), infoWidth + Utilities.dp(8), Utilities.dpf(16.5f)); + mediaBackgroundDrawable.draw(canvas); + + canvas.save(); + canvas.translate(photoImage.imageX + Utilities.dp(8), photoImage.imageY + Utilities.dpf(5.5f)); + infoLayout.draw(canvas); + canvas.restore(); + } + } + + @Override + public void onFailedDownload(String fileName) { + updateButtonState(); + } + + @Override + public void onSuccessDownload(String fileName) { + updateButtonState(); + } + + @Override + public void onProgressDownload(String fileName, float progress) { + progressVisible = true; + progressView.setProgress(progress); + invalidate(); + } + + @Override + public void onProgressUpload(String fileName, float progress, boolean isEncrypted) { + progressView.setProgress(progress); + invalidate(); + } + + @Override + public int getObserverTag() { + return TAG; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 0ed5388a3..517f7f072 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -28,8 +28,8 @@ public class ChatMessageCell extends ChatBaseCell { private int firstVisibleBlockNum = 0; private int totalVisibleBlocksCount = 0; - public ChatMessageCell(Context context, boolean isChat) { - super(context, isChat); + public ChatMessageCell(Context context) { + super(context, false); drawForwardedName = true; } @@ -131,7 +131,7 @@ public class ChatMessageCell extends ChatBaseCell { } pressedLink = null; int maxWidth; - if (chat) { + if (isChat) { maxWidth = Utilities.displaySize.x - Utilities.dp(122); drawName = true; } else { @@ -180,7 +180,7 @@ public class ChatMessageCell extends ChatBaseCell { textX = layoutWidth - backgroundWidth + Utilities.dp(10); textY = Utilities.dp(10) + namesOffset; } else { - textX = Utilities.dp(19) + (chat ? Utilities.dp(52) : 0); + textX = Utilities.dp(19) + (isChat ? Utilities.dp(52) : 0); textY = Utilities.dp(10) + namesOffset; } } @@ -196,7 +196,7 @@ public class ChatMessageCell extends ChatBaseCell { textX = layoutWidth - backgroundWidth + Utilities.dp(10); textY = Utilities.dp(10) + namesOffset; } else { - textX = Utilities.dp(19) + (chat ? Utilities.dp(52) : 0); + textX = Utilities.dp(19) + (isChat ? Utilities.dp(52) : 0); textY = Utilities.dp(10) + namesOffset; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 40a2ab21d..a94a7888e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -88,10 +88,12 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.ui.Cells.ChatAudioCell; import org.telegram.ui.Cells.ChatBaseCell; +import org.telegram.ui.Cells.ChatMediaCell; import org.telegram.ui.Cells.ChatMessageCell; import org.telegram.ui.Views.BackupImageView; import org.telegram.ui.Views.BaseFragment; import org.telegram.ui.Views.EmojiView; +import org.telegram.ui.Views.GifDrawable; import org.telegram.ui.Views.LayoutListView; import org.telegram.ui.Views.MessageActionLayout; import org.telegram.ui.Views.OnSwipeTouchListener; @@ -1225,9 +1227,29 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa return 1; } else { if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { - if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { - File f = new File(Utilities.getCacheDir(), messageObject.getFileName()); - if (f.exists()) { + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo || + messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || + messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { + boolean canSave = false; + if (messageObject.messageOwner.attachPath != null && messageObject.messageOwner.attachPath.length() != 0) { + File f = new File(messageObject.messageOwner.attachPath); + if (f.exists()) { + canSave = true; + } + } + if (!canSave) { + File f = new File(Utilities.getCacheDir(), messageObject.getFileName()); + if (f.exists()) { + canSave = true; + } + } + if (canSave) { + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { + String mime = messageObject.messageOwner.media.document.mime_type; + if (mime != null && mime.equals("text/xml")) { + return 5; + } + } return 4; } } @@ -1249,12 +1271,32 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa return 1; } else { if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { - /*if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) { - File f = new File(Utilities.getCacheDir(), messageObject.getFileName()); - if (f.exists()) { - return 4; + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo || + messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto || + messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { + boolean canSave = false; + if (messageObject.messageOwner.attachPath != null && messageObject.messageOwner.attachPath.length() != 0) { + File f = new File(messageObject.messageOwner.attachPath); + if (f.exists()) { + canSave = true; + } } - }*/ + if (!canSave) { + File f = new File(Utilities.getCacheDir(), messageObject.getFileName()); + if (f.exists()) { + canSave = true; + } + } + if (canSave) { + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { + String mime = messageObject.messageOwner.media.document.mime_type; + if (mime != null && mime.equals("text/xml")) { + return 5; + } + } + //return 4; + } + } return 2; } else { return 3; @@ -1266,12 +1308,12 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa private void addToSelectedMessages(MessageObject messageObject) { if (selectedMessagesIds.containsKey(messageObject.messageOwner.id)) { selectedMessagesIds.remove(messageObject.messageOwner.id); - if (messageObject.type == 0 || messageObject.type == 1 || messageObject.type == 8 || messageObject.type == 9) { + if (messageObject.type == 0) { selectedMessagesCanCopyIds.remove(messageObject.messageOwner.id); } } else { selectedMessagesIds.put(messageObject.messageOwner.id, messageObject); - if (messageObject.type == 0 || messageObject.type == 1 || messageObject.type == 8 || messageObject.type == 9) { + if (messageObject.type == 0) { selectedMessagesCanCopyIds.put(messageObject.messageOwner.id, messageObject); } } @@ -1576,8 +1618,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa ext = documentFilePath.substring(idx); } TLRPC.TL_document document = new TLRPC.TL_document(); - document.thumb = new TLRPC.TL_photoSizeEmpty(); - document.thumb.type = "s"; document.id = 0; document.user_id = UserConfig.clientUserId; document.date = ConnectionsManager.getInstance().getCurrentTime(); @@ -1596,6 +1636,27 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else { document.mime_type = "application/octet-stream"; } + if (document.mime_type.equals("image/gif")) { + GifDrawable gifDrawable = null; + try { + gifDrawable = new GifDrawable(f); + Bitmap bitmap = gifDrawable.getBitmap(); + if (bitmap != null) { + document.thumb = FileLoader.scaleAndSaveImage(bitmap, 90, 90, 55, currentEncryptedChat != null); + document.thumb.type = "s"; + } + gifDrawable.recycle(); + } catch (Exception e) { + if (gifDrawable != null) { + gifDrawable.recycle(); + } + FileLog.e("tmessages", e); + } + } + if (document.thumb == null) { + document.thumb = new TLRPC.TL_photoSizeEmpty(); + document.thumb.type = "s"; + } MessagesController.getInstance().sendMessage(document, dialog_id); } @@ -1707,7 +1768,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date); dateMsg.id = 0; MessageObject dateObj = new MessageObject(dateMsg, null); - dateObj.type = 10; + dateObj.contentType = dateObj.type = 10; if (forwardLoad) { messages.add(0, dateObj); } else { @@ -1730,7 +1791,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa dateMsg.message = ""; dateMsg.id = 0; MessageObject dateObj = new MessageObject(dateMsg, null); - dateObj.type = 15; + dateObj.contentType = dateObj.type = 15; boolean dateAdded = true; if (a != messArr.size() - 1) { MessageObject next = messArr.get(a + 1); @@ -1985,7 +2046,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date); dateMsg.id = 0; MessageObject dateObj = new MessageObject(dateMsg, null); - dateObj.type = 10; + dateObj.contentType = dateObj.type = 10; messages.add(0, dateObj); } if (!obj.messageOwner.out && obj.messageOwner.unread) { @@ -2864,6 +2925,8 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else if (type == 4) { items = new CharSequence[] {LocaleController.getString(selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? "SaveToDownloads" : "SaveToGallery", selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? R.string.SaveToDownloads : R.string.SaveToGallery), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)}; + } else if (type == 5) { + items = new CharSequence[] {LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile), LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)}; } } else { if (type == 0) { @@ -2877,6 +2940,8 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else if (type == 4) { items = new CharSequence[] {LocaleController.getString(selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? "SaveToDownloads" : "SaveToGallery", selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? R.string.SaveToDownloads : R.string.SaveToGallery), LocaleController.getString("Delete", R.string.Delete)}; + } else if (type == 5) { + items = new CharSequence[] {LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile), LocaleController.getString("Delete", R.string.Delete)}; } } @@ -2923,9 +2988,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa String fileName = selectedObject.getFileName(); if (selectedObject.type == 6 || selectedObject.type == 7) { MediaController.saveFile(fileName, parentActivity, 1, null); - } else if (selectedObject.type == 2 || selectedObject.type == 3) { + } else if (selectedObject.type == 1) { MediaController.saveFile(fileName, parentActivity, 0, null); - } else if (selectedObject.type == 16 || selectedObject.type == 17) { + } else if (selectedObject.type == 8 || selectedObject.type == 9) { MediaController.saveFile(fileName, parentActivity, 2, selectedObject.messageOwner.media.document.file_name); } } else if (i == 1) { @@ -2940,6 +3005,47 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa processSelectedOption(1); } } + } else if (type == 5) { + if (currentEncryptedChat == null) { + if (i == 1) { + String fileName = selectedObject.getFileName(); + if (selectedObject.type == 6 || selectedObject.type == 7) { + MediaController.saveFile(fileName, parentActivity, 1, null); + } else if (selectedObject.type == 1) { + MediaController.saveFile(fileName, parentActivity, 0, null); + } else if (selectedObject.type == 8 || selectedObject.type == 9) { + MediaController.saveFile(fileName, parentActivity, 2, selectedObject.messageOwner.media.document.file_name); + } + } else if (i == 2) { + processSelectedOption(2); + } else if (i == 3) { + processSelectedOption(1); + } + } else { + if (i == 1) { + processSelectedOption(1); + } + } + if (i == 0) { + File locFile = null; + if (selectedObject.messageOwner.attachPath != null && selectedObject.messageOwner.attachPath.length() != 0) { + File f = new File(selectedObject.messageOwner.attachPath); + if (f.exists()) { + locFile = f; + } + } + if (locFile == null) { + File f = new File(Utilities.getCacheDir(), selectedObject.getFileName()); + if (f.exists()) { + locFile = f; + } + } + if (locFile != null) { + if (LocaleController.getInstance().applyLanguageFile(locFile)) { + ((LaunchActivity)parentActivity).presentFragment(new LanguageSelectActivity(), "settings_lang", false); + } + } + } } } }); @@ -2966,17 +3072,15 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa private void processSelectedOption(int option) { if (option == 0) { if (selectedObject != null && selectedObject.messageOwner.id < 0) { - if (selectedObject.type == 0 || selectedObject.type == 1) { + if (selectedObject.type == 0) { if (selectedObject.messageOwner instanceof TLRPC.TL_messageForwarded) { MessagesController.getInstance().sendMessage(selectedObject, dialog_id); } else { MessagesController.getInstance().sendMessage(selectedObject.messageOwner.message, dialog_id); } - } else if (selectedObject.type == 8 || selectedObject.type == 9) { - MessagesController.getInstance().sendMessage(selectedObject, dialog_id); } else if (selectedObject.type == 4 || selectedObject.type == 5) { MessagesController.getInstance().sendMessage(selectedObject.messageOwner.media.geo.lat, selectedObject.messageOwner.media.geo._long, dialog_id); - } else if (selectedObject.type == 2 || selectedObject.type == 3) { + } else if (selectedObject.type == 1) { if (selectedObject.messageOwner instanceof TLRPC.TL_messageForwarded) { MessagesController.getInstance().sendMessage(selectedObject, dialog_id); } else { @@ -2994,11 +3098,11 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else if (selectedObject.type == 12 || selectedObject.type == 13) { TLRPC.User user = MessagesController.getInstance().users.get(selectedObject.messageOwner.media.user_id); MessagesController.getInstance().sendMessage(user, dialog_id); - } else if (selectedObject.type == 16 || selectedObject.type == 17) { + } else if (selectedObject.type == 8 || selectedObject.type == 9) { TLRPC.TL_document document = (TLRPC.TL_document)selectedObject.messageOwner.media.document; document.path = selectedObject.messageOwner.attachPath; MessagesController.getInstance().sendMessage(document, dialog_id); - } else if (selectedObject.type == 18 || selectedObject.type == 19) { + } else if (selectedObject.type == 2) { TLRPC.TL_audio audio = (TLRPC.TL_audio)selectedObject.messageOwner.media.audio; audio.path = selectedObject.messageOwner.attachPath; MessagesController.getInstance().sendMessage(audio, dialog_id); @@ -3064,8 +3168,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa public void didSelectFile(DocumentSelectActivity activity, String path, String name, String ext, long size) { activity.finishFragment(); TLRPC.TL_document document = new TLRPC.TL_document(); - document.thumb = new TLRPC.TL_photoSizeEmpty(); - document.thumb.type = "s"; document.id = 0; document.user_id = UserConfig.clientUserId; document.date = ConnectionsManager.getInstance().getCurrentTime(); @@ -3084,6 +3186,27 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else { document.mime_type = "application/octet-stream"; } + if (document.mime_type.equals("image/gif")) { + GifDrawable gifDrawable = null; + try { + gifDrawable = new GifDrawable(path); + Bitmap bitmap = gifDrawable.getBitmap(); + if (bitmap != null) { + document.thumb = FileLoader.scaleAndSaveImage(bitmap, 90, 90, 55, currentEncryptedChat != null); + document.thumb.type = "s"; + } + gifDrawable.recycle(); + } catch (Exception e) { + if (gifDrawable != null) { + gifDrawable.recycle(); + } + FileLog.e("tmessages", e); + } + } + if (document.thumb == null) { + document.thumb = new TLRPC.TL_photoSizeEmpty(); + document.thumb.type = "s"; + } MessagesController.getInstance().sendMessage(document, dialog_id); } @@ -3322,9 +3445,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa private void updateRowBackground(ChatListRowHolderEx holder, boolean disableSelection, boolean selected) { int messageType = holder.message.type; if (!disableSelection) { - if (messageType == 2 || messageType == 4 || messageType == 6) { + if (messageType == 4 || messageType == 6) { holder.chatBubbleView.setBackgroundResource(R.drawable.chat_outgoing_photo_states); - } else if (messageType == 3 || messageType == 5 || messageType == 7) { + } else if (messageType == 5 || messageType == 7) { holder.chatBubbleView.setBackgroundResource(R.drawable.chat_incoming_photo_states); } else if (messageType == 12) { holder.chatBubbleView.setBackgroundResource(R.drawable.chat_outgoing_text_states); @@ -3332,21 +3455,21 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else if (messageType == 13) { holder.chatBubbleView.setBackgroundResource(R.drawable.chat_incoming_text_states); holder.chatBubbleView.setPadding(Utilities.dp(15), Utilities.dp(6), Utilities.dp(9), 0); - } else if (messageType == 16) { + } else if (messageType == 8) { holder.chatBubbleView.setBackgroundResource(R.drawable.chat_outgoing_text_states); holder.chatBubbleView.setPadding(Utilities.dp(9), Utilities.dp(9), Utilities.dp(18), 0); - } else if (messageType == 17) { + } else if (messageType == 9) { holder.chatBubbleView.setBackgroundResource(R.drawable.chat_incoming_text_states); holder.chatBubbleView.setPadding(Utilities.dp(18), Utilities.dp(9), Utilities.dp(9), 0); } } else { - if (messageType == 2 || messageType == 4 || messageType == 6) { + if (messageType == 4 || messageType == 6) { if (selected) { holder.chatBubbleView.setBackgroundResource(R.drawable.msg_out_photo_selected); } else { holder.chatBubbleView.setBackgroundResource(R.drawable.msg_out_photo); } - } else if (messageType == 3 || messageType == 5 || messageType == 7) { + } else if (messageType == 5 || messageType == 7) { if (selected) { holder.chatBubbleView.setBackgroundResource(R.drawable.msg_in_photo_selected); } else { @@ -3366,14 +3489,14 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa holder.chatBubbleView.setBackgroundResource(R.drawable.msg_in); } holder.chatBubbleView.setPadding(Utilities.dp(15), Utilities.dp(6), Utilities.dp(9), 0); - } else if (messageType == 16) { + } else if (messageType == 8) { if (selected) { holder.chatBubbleView.setBackgroundResource(R.drawable.msg_out_selected); } else { holder.chatBubbleView.setBackgroundResource(R.drawable.msg_out); } holder.chatBubbleView.setPadding(Utilities.dp(9), Utilities.dp(9), Utilities.dp(18), 0); - } else if (messageType == 17) { + } else if (messageType == 9) { if (selected) { holder.chatBubbleView.setBackgroundResource(R.drawable.msg_in_selected); } else { @@ -3453,17 +3576,11 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } } MessageObject message = messages.get(messages.size() - i - offset); - int type = message.type; + int type = message.contentType; if (view == null) { LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (type == 0) { - view = new ChatMessageCell(mContext, false); - } else if (type == 1) { - view = new ChatMessageCell(mContext, currentChat != null); - } else if (type == 8) { - view = new ChatMessageCell(mContext, false); - } else if (type == 9) { - view = new ChatMessageCell(mContext, currentChat != null); + view = new ChatMessageCell(mContext); } else if (type == 4) { view = li.inflate(R.layout.chat_outgoing_location_layout, viewGroup, false); } else if (type == 5) { @@ -3472,14 +3589,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else { view = li.inflate(R.layout.chat_incoming_location_layout, viewGroup, false); } - } else if (type == 2) { - view = li.inflate(R.layout.chat_outgoing_photo_layout, viewGroup, false); - } else if (type == 3) { - if (currentChat != null) { - view = li.inflate(R.layout.chat_group_incoming_photo_layout, viewGroup, false); - } else { - view = li.inflate(R.layout.chat_incoming_photo_layout, viewGroup, false); - } + } else if (type == 1) { + view = new ChatMediaCell(mContext); + ((ChatMediaCell)view).downloadPhotos = downloadPhotos; } else if (type == 6) { view = li.inflate(R.layout.chat_outgoing_video_layout, viewGroup, false); } else if (type == 7) { @@ -3502,36 +3614,19 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } } else if (type == 15) { view = li.inflate(R.layout.chat_unread_layout, viewGroup, false); - } else if (type == 16) { + } else if (type == 8) { view = li.inflate(R.layout.chat_outgoing_document_layout, viewGroup, false); - } else if (type == 17) { + } else if (type == 9) { if (currentChat != null) { view = li.inflate(R.layout.chat_group_incoming_document_layout, viewGroup, false); } else { view = li.inflate(R.layout.chat_incoming_document_layout, viewGroup, false); } - } else if (type == 18) { - view = new ChatAudioCell(mContext, false); - } else if (type == 19) { - view = new ChatAudioCell(mContext, currentChat != null); + } else if (type == 2) { + view = new ChatAudioCell(mContext); } } - if (view instanceof ChatBaseCell) { - ((ChatBaseCell)view).delegate = new ChatBaseCell.ChatBaseCellDelegate() { - @Override - public void didPressedUserAvatar(ChatBaseCell cell, TLRPC.User user) { - if (user != null && user.id != UserConfig.clientUserId) { - UserProfileActivity fragment = new UserProfileActivity(); - Bundle args = new Bundle(); - args.putInt("user_id", user.id); - fragment.setArguments(args); - ((LaunchActivity)parentActivity).presentFragment(fragment, "user_" + user.id, false); - } - } - }; - } - boolean selected = false; boolean disableSelection = false; if (mActionMode != null) { @@ -3547,15 +3642,49 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } if (view instanceof ChatBaseCell) { + ((ChatBaseCell)view).delegate = new ChatBaseCell.ChatBaseCellDelegate() { + @Override + public void didPressedUserAvatar(ChatBaseCell cell, TLRPC.User user) { + if (user != null && user.id != UserConfig.clientUserId) { + UserProfileActivity fragment = new UserProfileActivity(); + Bundle args = new Bundle(); + args.putInt("user_id", user.id); + fragment.setArguments(args); + ((LaunchActivity)parentActivity).presentFragment(fragment, "user_" + user.id, false); + } + } + + @Override + public void didPressedCanceSendButton(ChatBaseCell cell) { + MessageObject message = cell.getMessageObject(); + if (message.messageOwner.send_state != 0) { + MessagesController.getInstance().cancelSendingMessage(message); + } + } + }; + if (view instanceof ChatMediaCell) { + ((ChatMediaCell)view).mediaDelegate = new ChatMediaCell.ChatMediaCellDelegate() { + @Override + public void didPressedImage(ChatBaseCell cell) { + NotificationCenter.getInstance().addToMemCache(51, cell.getMessageObject()); + Intent intent = new Intent(parentActivity, GalleryImageViewer.class); + startActivity(intent); + } + }; + } + + ((ChatBaseCell)view).isChat = currentChat != null; ((ChatBaseCell)view).setMessageObject(message); ((ChatBaseCell)view).setCheckPressed(!disableSelection, disableSelection && selected); if (view instanceof ChatAudioCell && downloadAudios) { ((ChatAudioCell)view).downloadAudioIfNeed(); + } else if (view instanceof ChatMediaCell) { + ((ChatMediaCell)view).downloadPhotos = downloadPhotos; } } else { ChatListRowHolderEx holder = (ChatListRowHolderEx)view.getTag(); if (holder == null) { - holder = new ChatListRowHolderEx(view, type); + holder = new ChatListRowHolderEx(view, message.type); view.setTag(holder); } holder.message = message; @@ -3579,12 +3708,12 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa return 14; } MessageObject message = messages.get(messages.size() - i - offset); - return message.type; + return message.contentType; } @Override public int getViewTypeCount() { - return 20; + return 16; } @Override @@ -3620,7 +3749,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa public ImageView addContactButton; public View addContactView; public View chatBubbleView; - public View photoProgressView; public ProgressBar actionProgress; public View actionView; @@ -3649,12 +3777,12 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa avatarImageView.setImage(photo, "50_50", placeHolderId); } - if (type != 12 && type != 13 && nameTextView != null && fromUser != null && type != 16 && type != 17) { + if (type != 12 && type != 13 && nameTextView != null && fromUser != null && type != 8 && type != 9) { nameTextView.setText(Utilities.formatName(fromUser.first_name, fromUser.last_name)); nameTextView.setTextColor(Utilities.getColorForId(message.messageOwner.from_id)); } - if (type == 2 || type == 3 || type == 6 || type == 7) { + if (type == 6 || type == 7) { int width = (int)(Math.min(displaySize.x, displaySize.y) * 0.7f); int height = width + Utilities.dp(100); if (type == 6 || type == 7) { @@ -3669,11 +3797,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } PhotoObject photo = PhotoObject.getClosestImageWithSize(message.photoThumbs, width, height); - if (type == 3) { - if (photoProgressView != null) { - photoProgressView.setVisibility(View.GONE); - } - } if (photo != null) { float scale = (float)photo.photoOwner.w / (float)width; @@ -3706,17 +3829,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (photo.image != null) { photoImage.setImageBitmap(photo.image); } else { - if (type == 2 || type == 3) { - String fileName = MessageObject.getAttachFileName(photo.photoOwner); - File cacheFile = new File(Utilities.getCacheDir(), fileName); - if (!cacheFile.exists()) { - photoFileName = fileName; - photoFile = cacheFile; - } else { - photoFileName = null; - photoFile = null; - } - } if (photoFileName == null) { if (message.imagePreview != null) { photoImage.setImage(photo.photoOwner.location, String.format(Locale.US, "%d_%d", (int)(w / Utilities.density), (int)(h / Utilities.density)), message.imagePreview); @@ -3817,7 +3929,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else { messageTextView.setText(LocaleController.formatString("FewNewMessages", R.string.FewNewMessages, unread_to_load)); } - } else if (type == 16 || type == 17) { + } else if (type == 8 || type == 9) { TLRPC.Document document = message.messageOwner.media.document; if (document instanceof TLRPC.TL_document || document instanceof TLRPC.TL_documentEncrypted) { nameTextView.setText(message.messageOwner.media.document.file_name); @@ -3844,7 +3956,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else if (document.thumb instanceof TLRPC.TL_photoCachedSize) { } else { - if (type == 16) { + if (type == 8) { contactAvatar.setImageResource(R.drawable.doc_green); } else { contactAvatar.setImageResource(R.drawable.doc_blue); @@ -3853,7 +3965,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else { nameTextView.setText("Error"); phoneTextView.setText("Error"); - if (type == 16) { + if (type == 8) { contactAvatar.setImageResource(R.drawable.doc_green); } else { contactAvatar.setImageResource(R.drawable.doc_blue); @@ -3871,19 +3983,16 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (halfCheckImage != null) { if (message.messageOwner.send_state == MessagesController.MESSAGE_SEND_STATE_SENDING) { checkImage.setVisibility(View.INVISIBLE); - if (type == 2 || type == 6 || type == 4) { + if (type == 6 || type == 4) { halfCheckImage.setImageResource(R.drawable.msg_clock_photo); } else { halfCheckImage.setImageResource(R.drawable.msg_clock); } halfCheckImage.setVisibility(View.VISIBLE); - if (actionView != null || photoProgressView != null) { + if (actionView != null) { if (actionView != null) { actionView.setVisibility(View.VISIBLE); } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.VISIBLE); - } Float progress = FileLoader.getInstance().fileProgresses.get(message.messageOwner.attachPath); if (progress != null) { actionProgress.setProgress((int)(progress * 100)); @@ -3905,9 +4014,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (actionView != null) { actionView.setVisibility(View.GONE); } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.GONE); - } if (actionAttachButton != null) { actionAttachButton.setVisibility(View.GONE); } @@ -3915,7 +4021,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (!message.messageOwner.unread) { halfCheckImage.setVisibility(View.VISIBLE); checkImage.setVisibility(View.VISIBLE); - if (type == 2 || type == 6 || type == 4) { + if (type == 6 || type == 4) { halfCheckImage.setImageResource(R.drawable.msg_halfcheck_w); } else { halfCheckImage.setImageResource(R.drawable.msg_halfcheck); @@ -3923,7 +4029,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } else { halfCheckImage.setVisibility(View.VISIBLE); checkImage.setVisibility(View.INVISIBLE); - if (type == 2 || type == 6 || type == 4) { + if (type == 6 || type == 4) { halfCheckImage.setImageResource(R.drawable.msg_check_w); } else { halfCheckImage.setImageResource(R.drawable.msg_check); @@ -3932,16 +4038,13 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (actionView != null) { actionView.setVisibility(View.GONE); } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.GONE); - } if (actionAttachButton != null) { actionAttachButton.setVisibility(View.VISIBLE); } } } } - if (message.type == 2 || message.type == 3 || message.type == 6 || message.type == 7 || message.type == 16 || message.type == 17) { + if (message.type == 6 || message.type == 7 || message.type == 8 || message.type == 9) { Integer tag = (Integer)actionProgress.getTag(); String file = progressByTag.get(tag); if (file != null) { @@ -3965,37 +4068,31 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa actionAttachButton.setVisibility(View.VISIBLE); if (message.type == 6 || message.type == 7) { actionAttachButton.setText(LocaleController.getString("ViewVideo", R.string.ViewVideo)); - } else if (message.type == 16 || message.type == 17) { + } else if (message.type == 8 || message.type == 9) { actionAttachButton.setText(LocaleController.getString("Open", R.string.Open)); } } if (actionView != null) { actionView.setVisibility(View.GONE); } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.GONE); - } } else { load = true; } } if (load && message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0 || !load && (message.messageOwner.attachPath == null || message.messageOwner.attachPath.length() == 0)) { File cacheFile = null; - if (((message.type == 2 || message.type == 3) && photoFileName == null) || (cacheFile = new File(Utilities.getCacheDir(), fileName)).exists()) { + if ((cacheFile = new File(Utilities.getCacheDir(), fileName)).exists()) { if (actionAttachButton != null) { actionAttachButton.setVisibility(View.VISIBLE); if (message.type == 6 || message.type == 7) { actionAttachButton.setText(LocaleController.getString("ViewVideo", R.string.ViewVideo)); - } else if (message.type == 16 || message.type == 17) { + } else if (message.type == 8 || message.type == 9) { actionAttachButton.setText(LocaleController.getString("Open", R.string.Open)); } } if (actionView != null) { actionView.setVisibility(View.GONE); } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.GONE); - } load = false; } else { load = true; @@ -4012,47 +4109,32 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa progressByTag.put((Integer)actionProgress.getTag(), fileName); addToLoadingFile(fileName, actionProgress); if (actionView != null) { - if ((message.type == 2 || message.type == 3) && downloadPhotos) { - actionView.setVisibility(View.GONE); - } else { - actionView.setVisibility(View.VISIBLE); - if (photoFileName != null) { - actionCancelButton.setImageResource(R.drawable.photo_download_cancel_states); - } + actionView.setVisibility(View.VISIBLE); + if (photoFileName != null) { + actionCancelButton.setImageResource(R.drawable.photo_download_cancel_states); } } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.VISIBLE); - } if (actionAttachButton != null) { actionAttachButton.setVisibility(View.GONE); } } else { if (actionView != null) { - if ((message.type == 2 || message.type == 3) && !downloadPhotos) { - actionView.setVisibility(View.VISIBLE); - actionCancelButton.setImageResource(R.drawable.photo_download_states); - } else { - actionView.setVisibility(View.GONE); - } - } - if (photoProgressView != null) { - photoProgressView.setVisibility(View.GONE); + actionView.setVisibility(View.GONE); } if (actionAttachButton != null) { actionAttachButton.setVisibility(View.VISIBLE); if (message.type == 6 || message.type == 7) { actionAttachButton.setText(String.format("%s %.1f MB", LocaleController.getString("DOWNLOAD", R.string.DOWNLOAD), message.messageOwner.media.video.size / 1024.0f / 1024.0f)); - } else if (message.type == 16 || message.type == 17) { + } else if (message.type == 8 || message.type == 9) { actionAttachButton.setText(LocaleController.getString("DOWNLOAD", R.string.DOWNLOAD)); } } } } } - if (message.type == 16 || message.type == 17) { + if (message.type == 8 || message.type == 9) { int width; - if (currentChat != null && type != 16) { + if (currentChat != null && type != 8) { if (actionView.getVisibility() == View.VISIBLE) { width = displaySize.x - Utilities.dp(290); } else { @@ -4091,7 +4173,6 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa addContactButton = (ImageView)view.findViewById(R.id.add_contact_button); addContactView = view.findViewById(R.id.add_contact_view); chatBubbleView = view.findViewById(R.id.chat_bubble_layout); - photoProgressView = view.findViewById(R.id.photo_progress); if (messageTextView != null) { messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, MessagesController.getInstance().fontSize); } @@ -4149,7 +4230,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa contactView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (message.type == 16 || message.type == 17) { + if (message.type == 8 || message.type == 9) { processOnClick(view); } else if (message.type == 12 || message.type == 13) { if (mActionMode != null) { @@ -4230,15 +4311,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa contactAvatar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (message.type == 18 || message.type == 19) { - if (message.messageOwner.media.audio.user_id != UserConfig.clientUserId && message.messageOwner.media.audio.user_id != 0) { - UserProfileActivity fragment = new UserProfileActivity(); - Bundle args = new Bundle(); - args.putInt("user_id", message.messageOwner.media.audio.user_id); - fragment.setArguments(args); - ((LaunchActivity)parentActivity).presentFragment(fragment, "user_" + message.messageOwner.media.audio.user_id, false); - } - } + } }); } @@ -4283,33 +4356,17 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa if (file != null) { progressBarMap.remove(file); } - } else if (message.type == 6 || message.type == 7 || message.type == 16 || message.type == 17) { + } else if (message.type == 6 || message.type == 7 || message.type == 8 || message.type == 9) { String file = progressByTag.get(tag); if (file != null) { loadingFile.remove(file); if (message.type == 6 || message.type == 7) { FileLoader.getInstance().cancelLoadFile(message.messageOwner.media.video, null, null, null); - } else if (message.type == 16 || message.type == 17) { + } else if (message.type == 8 || message.type == 9) { FileLoader.getInstance().cancelLoadFile(null, null, message.messageOwner.media.document, null); } updateVisibleRows(); } - } else if (message.type == 2 || message.type == 3) { - if (photoFile != null && !photoFile.exists() && photoObjectToSet != null) { - if (loadingFile.containsKey(photoFileName)) { - loadingFile.remove(photoFileName); - FileLoader.getInstance().cancelLoadingForImageView(photoImage); - updateVisibleRows(); - } else { - addToLoadingFile(photoFileName, actionProgress); - if (message.imagePreview != null) { - photoImage.setImage(photoObjectToSet.photoOwner.location, photoFilter, message.imagePreview, photoObjectToSet.photoOwner.size); - } else { - photoImage.setImage(photoObjectToSet.photoOwner.location, photoFilter, message.messageOwner.out ? R.drawable.photo_placeholder_out : R.drawable.photo_placeholder_in, photoObjectToSet.photoOwner.size); - } - updateVisibleRows(); - } - } } } } @@ -4367,25 +4424,11 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa NotificationCenter.getInstance().addToMemCache(0, message); LocationActivity fragment = new LocationActivity(); ((LaunchActivity)parentActivity).presentFragment(fragment, "location_view", false); - } else if (message.type == 2 || message.type == 3) { - if (photoFile == null || photoObjectToSet == null || photoFile != null && photoFile.exists()) { - NotificationCenter.getInstance().addToMemCache(51, message); - Intent intent = new Intent(parentActivity, GalleryImageViewer.class); - startActivity(intent); - } else { - addToLoadingFile(photoFileName, actionProgress); - if (message.imagePreview != null) { - photoImage.setImage(photoObjectToSet.photoOwner.location, photoFilter, message.imagePreview, photoObjectToSet.photoOwner.size); - } else { - photoImage.setImage(photoObjectToSet.photoOwner.location, photoFilter, message.messageOwner.out ? R.drawable.photo_placeholder_out : R.drawable.photo_placeholder_in, photoObjectToSet.photoOwner.size); - } - updateVisibleRows(); - } } else if (message.type == 11) { NotificationCenter.getInstance().addToMemCache(51, message); Intent intent = new Intent(parentActivity, GalleryImageViewer.class); startActivity(intent); - } else if (message.type == 6 || message.type == 7 || message.type == 16 || message.type == 17) { + } else if (message.type == 6 || message.type == 7 || message.type == 8 || message.type == 9) { File f = null; String fileName = message.getFileName(); if (message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0) { @@ -4400,7 +4443,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa Intent intent = new Intent(Intent.ACTION_VIEW); if (message.type == 6 || message.type == 7) { intent.setDataAndType(Uri.fromFile(f), "video/mp4"); - } else if (message.type == 16 || message.type == 17) { + } else if (message.type == 8 || message.type == 9) { MimeTypeMap myMime = MimeTypeMap.getSingleton(); int idx = fileName.lastIndexOf("."); if (idx != -1) { @@ -4435,7 +4478,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa addToLoadingFile(fileName, actionProgress); if (message.type == 6 || message.type == 7) { FileLoader.getInstance().loadFile(message.messageOwner.media.video, null, null, null); - } else if (message.type == 16 || message.type == 17) { + } else if (message.type == 8 || message.type == 9) { FileLoader.getInstance().loadFile(null, null, message.messageOwner.media.document, null); } updateVisibleRows(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 508536041..cfdf9c2db 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -409,7 +409,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter listView.invalidateViews(); } } else if (i == languageRow) { - ((LaunchActivity)parentActivity).presentFragment(new LanguageSelectActivity(), "settings_wallpapers", false); + ((LaunchActivity)parentActivity).presentFragment(new LanguageSelectActivity(), "settings_lang", false); } else if (i == switchBackendButtonRow) { AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity); builder.setMessage(LocaleController.getString("AreYouSure", R.string.AreYouSure)); 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 be0dc655f..cf65c1481 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java @@ -24,6 +24,7 @@ THE SOFTWARE. package org.telegram.ui.Views; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; @@ -33,9 +34,11 @@ import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; +import android.view.View; import android.widget.MediaController; import java.io.File; +import java.lang.ref.WeakReference; import java.util.Locale; public class GifDrawable extends Drawable implements Animatable, MediaController.MediaPlayerControl { @@ -68,6 +71,8 @@ public class GifDrawable extends Drawable implements Animatable, MediaController private boolean mApplyTransformation; private final Rect mDstRect = new Rect(); + public WeakReference parentView = null; + protected final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG); protected final int[] mColors; @@ -82,7 +87,10 @@ public class GifDrawable extends Drawable implements Animatable, MediaController @Override public void run() { restoreRemainder(mGifInfoPtr); - invalidateSelf(); + if (parentView != null && parentView.get() != null) { + parentView.get().invalidate(); + } + mMetaData[4] = 0; } }; @@ -96,7 +104,9 @@ public class GifDrawable extends Drawable implements Animatable, MediaController private final Runnable mInvalidateTask = new Runnable() { @Override public void run() { - invalidateSelf(); + if (parentView != null && parentView.get() != null) { + parentView.get().invalidate(); + } } }; @@ -109,18 +119,12 @@ public class GifDrawable extends Drawable implements Animatable, MediaController } public GifDrawable(String filePath) throws Exception { - if (filePath == null) { - throw new NullPointerException("Source is null"); - } mInputSourceLength = new File(filePath).length(); mGifInfoPtr = openFile(mMetaData, filePath); mColors = new int[mMetaData[0] * mMetaData[1]]; } public GifDrawable(File file) throws Exception { - if (file == null) { - throw new NullPointerException("Source is null"); - } mInputSourceLength = file.length(); mGifInfoPtr = openFile(mMetaData, file.getPath()); mColors = new int[mMetaData[0] * mMetaData[1]]; @@ -169,6 +173,9 @@ public class GifDrawable extends Drawable implements Animatable, MediaController @Override public void start() { + if (mIsRunning) { + return; + } mIsRunning = true; runOnUiThread(mStartTask); } @@ -240,7 +247,9 @@ public class GifDrawable extends Drawable implements Animatable, MediaController @Override public void run() { seekToTime(mGifInfoPtr, position, mColors); - invalidateSelf(); + if (parentView != null && parentView.get() != null) { + parentView.get().invalidate(); + } } }); } @@ -253,7 +262,9 @@ public class GifDrawable extends Drawable implements Animatable, MediaController @Override public void run() { seekToFrame(mGifInfoPtr, frameIndex, mColors); - invalidateSelf(); + if (parentView != null && parentView.get() != null) { + parentView.get().invalidate(); + } } }); } @@ -323,6 +334,11 @@ public class GifDrawable extends Drawable implements Animatable, MediaController return mColors[mMetaData[1] * y + x]; } + public Bitmap getBitmap() { + seekToFrame(mGifInfoPtr, 0, mColors); + return Bitmap.createBitmap(mColors, 0, mMetaData[0], mMetaData[0], mMetaData[1], Bitmap.Config.ARGB_8888); + } + @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); @@ -343,6 +359,7 @@ public class GifDrawable extends Drawable implements Animatable, MediaController } else { mMetaData[4] = -1; } + canvas.translate(mDstRect.left, mDstRect.top); canvas.scale(mSx, mSy); canvas.drawBitmap(mColors, 0, mMetaData[0], 0f, 0f, mMetaData[0], mMetaData[1], true, mPaint); if (mMetaData[4] >= 0 && mMetaData[2] > 1) { @@ -365,13 +382,17 @@ public class GifDrawable extends Drawable implements Animatable, MediaController @Override public void setFilterBitmap(boolean filter) { mPaint.setFilterBitmap(filter); - invalidateSelf(); + if (parentView != null && parentView.get() != null) { + parentView.get().invalidate(); + } } @Override public void setDither(boolean dither) { mPaint.setDither(dither); - invalidateSelf(); + if (parentView != null && parentView.get() != null) { + parentView.get().invalidate(); + } } @Override 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 372a2a5cd..2eceb99d1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ImageReceiver.java @@ -111,10 +111,47 @@ public class ImageReceiver { } } + public void setImageBitmap(Bitmap bitmap) { + currentPath = null; + last_path = null; + last_httpUrl = null; + last_filter = null; + last_placeholder = null; + last_size = 0; + FileLoader.getInstance().cancelLoadingForImageView(this); + if (bitmap != null) { + recycleBitmap(null); + currentImage = new BitmapDrawable(null, bitmap); + } + } + + public void setImageBitmap(Drawable bitmap) { + currentPath = null; + last_path = null; + last_httpUrl = null; + last_filter = null; + last_placeholder = null; + last_size = 0; + FileLoader.getInstance().cancelLoadingForImageView(this); + if (bitmap != null) { + recycleBitmap(null); + currentImage = bitmap; + } + } + public void clearImage() { recycleBitmap(null); } + @Override + protected void finalize() throws Throwable { + try { + clearImage(); + } finally { + super.finalize(); + } + } + private void recycleBitmap(Bitmap newBitmap) { if (currentImage == null || isPlaceholder) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/ProgressView.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/ProgressView.java index da0e62184..cc6e95013 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/ProgressView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/ProgressView.java @@ -14,50 +14,35 @@ import android.graphics.Paint; import org.telegram.messenger.Utilities; public class ProgressView { - private static Paint innerPaint1; - private static Paint outerPaint1; - private static Paint innerPaint2; - private static Paint outerPaint2; + private Paint innerPaint; + private Paint outerPaint; - public int type; - public int thumbX = 0; + public float currentProgress = 0; public int width; public int height; + public float progressHeight = Utilities.dpf(2.0f); public ProgressView() { - if (innerPaint1 == null) { - innerPaint1 = new Paint(); - outerPaint1 = new Paint(); - innerPaint2 = new Paint(); - outerPaint2 = new Paint(); + innerPaint = new Paint(); + outerPaint = new Paint(); + } - innerPaint1.setColor(0xffb4e396); - outerPaint1.setColor(0xff6ac453); - innerPaint2.setColor(0xffd9e2eb); - outerPaint2.setColor(0xff86c5f8); - } + public void setProgressColors(int innerColor, int outerColor) { + innerPaint.setColor(innerColor); + outerPaint.setColor(outerColor); } public void setProgress(float progress) { - thumbX = (int)Math.ceil(width * progress); - if (thumbX < 0) { - thumbX = 0; - } else if (thumbX > width) { - thumbX = width; + currentProgress = progress; + if (currentProgress < 0) { + currentProgress = 0; + } else if (currentProgress > 1) { + currentProgress = 1; } } public void draw(Canvas canvas) { - Paint inner = null; - Paint outer = null; - if (type == 0) { - inner = innerPaint1; - outer = outerPaint1; - } else if (type == 1) { - inner = innerPaint2; - outer = outerPaint2; - } - canvas.drawRect(0, height / 2 - Utilities.dp(1), width, height / 2 + Utilities.dp(1), inner); - canvas.drawRect(0, height / 2 - Utilities.dp(1), thumbX, height / 2 + Utilities.dp(1), outer); + canvas.drawRect(0, height / 2 - progressHeight / 2.0f, width, height / 2 + progressHeight / 2.0f, innerPaint); + canvas.drawRect(0, height / 2 - progressHeight / 2.0f, width * currentProgress, height / 2 + progressHeight / 2.0f, outerPaint); } } diff --git a/TMessagesProj/src/main/res/layout/chat_group_incoming_photo_layout.xml b/TMessagesProj/src/main/res/layout/chat_group_incoming_photo_layout.xml deleted file mode 100644 index 28199c0cf..000000000 --- a/TMessagesProj/src/main/res/layout/chat_group_incoming_photo_layout.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/chat_incoming_photo_layout.xml b/TMessagesProj/src/main/res/layout/chat_incoming_photo_layout.xml deleted file mode 100644 index ab8b885e7..000000000 --- a/TMessagesProj/src/main/res/layout/chat_incoming_photo_layout.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/chat_outgoing_photo_layout.xml b/TMessagesProj/src/main/res/layout/chat_outgoing_photo_layout.xml deleted file mode 100644 index 1420ce15a..000000000 --- a/TMessagesProj/src/main/res/layout/chat_outgoing_photo_layout.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index 8101ba203..b029c840d 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -5,8 +5,9 @@ Telegram - العربية - Arabic + العربية + Arabic + ar رقم هاتفك المحمول @@ -110,7 +111,7 @@ حذف المجموعة قم بالسحب للإلغاء حفظ في الجهاز - Apply localization file + تطبيق ملف التعريب تم طلب محادثة سرية diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 19a295c8e..a8ae5d466 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -5,8 +5,9 @@ Telegram - Deutsch - German + Deutsch + German + de Dein Telefon @@ -110,7 +111,7 @@ Diese Gruppe löschen WISCHEN UM ABZUBRECHEN In Ordner Downloads speichern - Apply localization file + Sprachdatei benutzen Geheimen Chat angefordert diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 92dcea329..8482f11c2 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -5,8 +5,9 @@ Telegram - Español - Spanish + Español + Spanish + es Tu teléfono @@ -110,7 +111,7 @@ Eliminar este grupo DESLIZA PARA CANCELAR Guardar en descargas - Apply localization file + Aplicar fichero de localización Chat secreto solicitado diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 0703954a5..9823c665c 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -5,8 +5,9 @@ Telegram - Italiano - Italian + Italiano + Italian + it Il tuo telefono @@ -110,7 +111,7 @@ Elimina questo gruppo TRASCINA PER ANNULLARE Salva in download - Apply localization file + Applica file di localizzazione Chat segreta richiesta diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 6e04af471..2f252ab0e 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -5,8 +5,9 @@ Telegram - Nederlands - Dutch + Nederlands + Dutch + nl Uw telefoon @@ -110,7 +111,7 @@ Deze groep verwijderen SLEEP OM TE ANNULEREN Opslaan in downloads - Apply localization file + Vertaling toepassen Privégesprek aangevraagd diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 700c6c733..9f168d03f 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -5,8 +5,9 @@ Telegram - English - English + English + English + en Your phone