From ebe7ab78a3cbd8e12461914a6313241308157670 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Mon, 31 Mar 2014 18:14:49 +0400 Subject: [PATCH] Gif support, applying localization files from document messages --- TMessagesProj/jni/gif.c | 3 + .../libs/armeabi-v7a/libtmessages.so | Bin 778916 -> 778916 bytes TMessagesProj/libs/armeabi/libtmessages.so | Bin 795280 -> 795280 bytes TMessagesProj/libs/x86/libtmessages.so | Bin 1377300 -> 1377300 bytes .../telegram/messenger/FileLoadOperation.java | 6 +- .../org/telegram/messenger/FileLoader.java | 200 +++---- .../telegram/messenger/LocaleController.java | 87 ++- .../telegram/messenger/MediaController.java | 100 ++++ .../messenger/MessagesController.java | 96 ++-- .../org/telegram/messenger/Utilities.java | 3 - .../org/telegram/objects/MessageObject.java | 65 +-- .../org/telegram/ui/Cells/ChatAudioCell.java | 26 +- .../org/telegram/ui/Cells/ChatBaseCell.java | 185 +++++-- .../org/telegram/ui/Cells/ChatMediaCell.java | 514 ++++++++++++++++++ .../telegram/ui/Cells/ChatMessageCell.java | 10 +- .../java/org/telegram/ui/ChatActivity.java | 415 +++++++------- .../org/telegram/ui/SettingsActivity.java | 2 +- .../org/telegram/ui/Views/GifDrawable.java | 45 +- .../org/telegram/ui/Views/ImageReceiver.java | 37 ++ .../org/telegram/ui/Views/ProgressView.java | 49 +- .../chat_group_incoming_photo_layout.xml | 113 ---- .../res/layout/chat_incoming_photo_layout.xml | 103 ---- .../res/layout/chat_outgoing_photo_layout.xml | 123 ----- .../src/main/res/values-ar/strings.xml | 7 +- .../src/main/res/values-de/strings.xml | 7 +- .../src/main/res/values-es/strings.xml | 7 +- .../src/main/res/values-it/strings.xml | 7 +- .../src/main/res/values-nl/strings.xml | 7 +- TMessagesProj/src/main/res/values/strings.xml | 5 +- 29 files changed, 1368 insertions(+), 854 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java delete mode 100644 TMessagesProj/src/main/res/layout/chat_group_incoming_photo_layout.xml delete mode 100644 TMessagesProj/src/main/res/layout/chat_incoming_photo_layout.xml delete mode 100644 TMessagesProj/src/main/res/layout/chat_outgoing_photo_layout.xml diff --git a/TMessagesProj/jni/gif.c b/TMessagesProj/jni/gif.c index f6198bf3..28ab98aa 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 e9cc442ae58391928516274deba2954e7cc46c7d..7c8460871a4fa0e64421953d5282634b60edbe80 100755 GIT binary patch delta 30138 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%0D*7xO9^dUjpX) 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 RD(95y>XW@PUo!vJ{10B6iG=_F diff --git a/TMessagesProj/libs/armeabi/libtmessages.so b/TMessagesProj/libs/armeabi/libtmessages.so index 4528300224fe82b31e555eb471e9246d70698b0a..bcd3173b025f2926f1a424c93f3413322e4b53ba 100755 GIT binary patch delta 44623 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

=Rz0DYM2=(NVue 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 delta 44614 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 diff --git a/TMessagesProj/libs/x86/libtmessages.so b/TMessagesProj/libs/x86/libtmessages.so index 2446256a0e540ae43d608962c28b1e7c535407e8..1a8afe2e2ed3da2c02138998991fb0a17c87fa59 100755 GIT binary patch delta 55114 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%0AKWad2dlje_ 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 NX?V8uOzzs8^nape1s(tZ delta 55081 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 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 4a17defe..9e3671c7 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 49b15d1c..ec2d0a84 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 792d3eb1..018ffefb 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 a71ef4b9..7aac7793 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 f8ca9bc5..5f725929 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 31ac47df..c4f37d0c 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 25d943e9..386ef617 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 074f0e35..0a565250 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 00000000..b230ff1c --- /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 0ed5388a..517f7f07 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 40a2ab21..a94a7888 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 50853604..cfdf9c2d 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 be0dc655..cf65c148 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 372a2a5c..2eceb99d 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 da0e6218..cc6e9501 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 28199c0c..00000000 --- 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 ab8b885e..00000000 --- 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 1420ce15..00000000 --- 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 8101ba20..b029c840 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 19a295c8..a8ae5d46 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 92dcea32..8482f11c 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 0703954a..9823c665 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 6e04af47..2f252ab0 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 700c6c73..9f168d03 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