Update to 2.4.0
@ -82,7 +82,7 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 8
|
minSdkVersion 8
|
||||||
targetSdkVersion 21
|
targetSdkVersion 21
|
||||||
versionCode 416
|
versionCode 423
|
||||||
versionName "2.3.3"
|
versionName "2.4.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,6 +149,7 @@
|
|||||||
|
|
||||||
<service android:name="org.telegram.android.NotificationsService" android:enabled="true"/>
|
<service android:name="org.telegram.android.NotificationsService" android:enabled="true"/>
|
||||||
<service android:name="org.telegram.android.NotificationRepeat" android:exported="false"/>
|
<service android:name="org.telegram.android.NotificationRepeat" android:exported="false"/>
|
||||||
|
<service android:name="org.telegram.android.NotificationDelay" android:exported="false"/>
|
||||||
<service android:name="org.telegram.android.VideoEncodingService" android:enabled="true"/>
|
<service android:name="org.telegram.android.VideoEncodingService" android:enabled="true"/>
|
||||||
|
|
||||||
<receiver android:name="org.telegram.android.AppStartReceiver" android:enabled="true">
|
<receiver android:name="org.telegram.android.AppStartReceiver" android:enabled="true">
|
||||||
|
@ -27,33 +27,49 @@ import org.telegram.messenger.TLRPC;
|
|||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
|
|
||||||
public class ImageReceiver {
|
public class ImageReceiver implements NotificationCenter.NotificationCenterDelegate {
|
||||||
private TLObject last_path = null;
|
|
||||||
private String last_httpUrl = null;
|
public static interface ImageReceiverDelegate {
|
||||||
private String last_filter = null;
|
public void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb);
|
||||||
private Drawable last_placeholder = null;
|
}
|
||||||
private TLRPC.FileLocation last_placeholderLocation = null;
|
|
||||||
private int last_size = 0;
|
private View parentView;
|
||||||
private String currentPath = null;
|
private Integer tag;
|
||||||
private boolean isPlaceholder = false;
|
private Integer thumbTag;
|
||||||
private Drawable currentImage = null;
|
private MessageObject parentMessageObject;
|
||||||
private Integer tag = null;
|
private boolean canceledLoading;
|
||||||
private View parentView = null;
|
|
||||||
private int imageX = 0, imageY = 0, imageW = 0, imageH = 0;
|
private TLObject currentImageLocation;
|
||||||
|
private String currentKey;
|
||||||
|
private String currentThumbKey;
|
||||||
|
private String currentHttpUrl;
|
||||||
|
private String currentFilter;
|
||||||
|
private String currentThumbFilter;
|
||||||
|
private TLRPC.FileLocation currentThumbLocation;
|
||||||
|
private int currentSize;
|
||||||
|
private boolean currentCacheOnly;
|
||||||
|
private BitmapDrawable currentImage;
|
||||||
|
private BitmapDrawable currentThumb;
|
||||||
|
private Drawable staticThumb;
|
||||||
|
|
||||||
|
private boolean needsQualityThumb;
|
||||||
|
private boolean shouldGenerateQualityThumb;
|
||||||
|
|
||||||
|
private int imageX, imageY, imageW, imageH;
|
||||||
private Rect drawRegion = new Rect();
|
private Rect drawRegion = new Rect();
|
||||||
private boolean isVisible = true;
|
private boolean isVisible = true;
|
||||||
private boolean isAspectFit = false;
|
private boolean isAspectFit;
|
||||||
private boolean lastCacheOnly = false;
|
private boolean forcePreview;
|
||||||
private boolean forcePreview = false;
|
private int roundRadius;
|
||||||
private int roundRadius = 0;
|
private BitmapShader bitmapShader;
|
||||||
private BitmapShader bitmapShader = null;
|
private Paint roundPaint;
|
||||||
private Paint roundPaint = null;
|
private RectF roundRect;
|
||||||
private RectF roundRect = null;
|
private RectF bitmapRect;
|
||||||
private RectF bitmapRect = null;
|
private Matrix shaderMatrix;
|
||||||
private Matrix shaderMatrix = null;
|
|
||||||
private int alpha = 255;
|
private int alpha = 255;
|
||||||
private boolean isPressed;
|
private boolean isPressed;
|
||||||
private boolean disableRecycle;
|
private boolean disableRecycle;
|
||||||
|
private ImageReceiverDelegate delegate;
|
||||||
|
|
||||||
public ImageReceiver() {
|
public ImageReceiver() {
|
||||||
|
|
||||||
@ -63,38 +79,64 @@ public class ImageReceiver {
|
|||||||
parentView = view;
|
parentView = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String filter, Drawable placeholder, boolean cacheOnly) {
|
public void cancelLoadImage() {
|
||||||
setImage(path, null, filter, placeholder, null, 0, cacheOnly);
|
ImageLoader.getInstance().cancelLoadingForImageReceiver(this, 0);
|
||||||
|
canceledLoading = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String filter, Drawable placeholder, int size, boolean cacheOnly) {
|
public void setImage(TLObject path, String filter, Drawable thumb, boolean cacheOnly) {
|
||||||
setImage(path, null, filter, placeholder, null, size, cacheOnly);
|
setImage(path, null, filter, thumb, null, null, 0, cacheOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(String path, String filter, Drawable placeholder, int size) {
|
public void setImage(TLObject path, String filter, Drawable thumb, int size, boolean cacheOnly) {
|
||||||
setImage(null, path, filter, placeholder, null, size, true);
|
setImage(path, null, filter, thumb, null, null, size, cacheOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject fileLocation, String httpUrl, String filter, Drawable placeholder, TLRPC.FileLocation placeholderLocation, int size, boolean cacheOnly) {
|
public void setImage(String httpUrl, String filter, Drawable thumb, int size) {
|
||||||
if ((fileLocation == null && httpUrl == null) || (fileLocation != null && !(fileLocation instanceof TLRPC.TL_fileLocation) && !(fileLocation instanceof TLRPC.TL_fileEncryptedLocation) && !(fileLocation instanceof TLRPC.TL_document))) {
|
setImage(null, httpUrl, filter, thumb, null, null, size, true);
|
||||||
recycleBitmap(null);
|
}
|
||||||
currentPath = null;
|
|
||||||
isPlaceholder = true;
|
public void setImage(TLObject fileLocation, String filter, TLRPC.FileLocation thumbLocation, String thumbFilter, boolean cacheOnly) {
|
||||||
last_path = null;
|
setImage(fileLocation, null, filter, null, thumbLocation, thumbFilter, 0, cacheOnly);
|
||||||
last_httpUrl = null;
|
}
|
||||||
last_filter = null;
|
|
||||||
lastCacheOnly = false;
|
public void setImage(TLObject fileLocation, String filter, TLRPC.FileLocation thumbLocation, String thumbFilter, int size, boolean cacheOnly) {
|
||||||
bitmapShader = null;
|
setImage(fileLocation, null, filter, null, thumbLocation, thumbFilter, size, cacheOnly);
|
||||||
last_placeholder = placeholder;
|
}
|
||||||
last_placeholderLocation = placeholderLocation;
|
|
||||||
last_size = 0;
|
public void setImage(TLObject fileLocation, String httpUrl, String filter, Drawable thumb, TLRPC.FileLocation thumbLocation, String thumbFilter, int size, boolean cacheOnly) {
|
||||||
|
if ((fileLocation == null && httpUrl == null && thumbLocation == null)
|
||||||
|
|| (fileLocation != null && !(fileLocation instanceof TLRPC.TL_fileLocation)
|
||||||
|
&& !(fileLocation instanceof TLRPC.TL_fileEncryptedLocation)
|
||||||
|
&& !(fileLocation instanceof TLRPC.TL_document))) {
|
||||||
|
recycleBitmap(null, false);
|
||||||
|
recycleBitmap(null, true);
|
||||||
|
currentKey = null;
|
||||||
|
currentThumbKey = null;
|
||||||
|
currentThumbFilter = null;
|
||||||
|
currentImageLocation = null;
|
||||||
|
currentHttpUrl = null;
|
||||||
|
currentFilter = null;
|
||||||
|
currentCacheOnly = false;
|
||||||
|
staticThumb = thumb;
|
||||||
|
currentThumbLocation = null;
|
||||||
|
currentSize = 0;
|
||||||
currentImage = null;
|
currentImage = null;
|
||||||
ImageLoader.getInstance().cancelLoadingForImageView(this);
|
bitmapShader = null;
|
||||||
|
ImageLoader.getInstance().cancelLoadingForImageReceiver(this, 0);
|
||||||
if (parentView != null) {
|
if (parentView != null) {
|
||||||
parentView.invalidate();
|
parentView.invalidate();
|
||||||
}
|
}
|
||||||
|
if (delegate != null) {
|
||||||
|
delegate.didSetImage(this, currentImage != null || currentThumb != null || staticThumb != null, currentImage == null);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(thumbLocation instanceof TLRPC.TL_fileLocation)) {
|
||||||
|
thumbLocation = null;
|
||||||
|
}
|
||||||
|
|
||||||
String key = null;
|
String key = null;
|
||||||
if (fileLocation != null) {
|
if (fileLocation != null) {
|
||||||
if (fileLocation instanceof TLRPC.FileLocation) {
|
if (fileLocation instanceof TLRPC.FileLocation) {
|
||||||
@ -104,80 +146,61 @@ public class ImageReceiver {
|
|||||||
TLRPC.Document location = (TLRPC.Document) fileLocation;
|
TLRPC.Document location = (TLRPC.Document) fileLocation;
|
||||||
key = location.dc_id + "_" + location.id;
|
key = location.dc_id + "_" + location.id;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (httpUrl != null) {
|
||||||
key = Utilities.MD5(httpUrl);
|
key = Utilities.MD5(httpUrl);
|
||||||
}
|
}
|
||||||
if (filter != null) {
|
if (key != null) {
|
||||||
key += "@" + filter;
|
if (filter != null) {
|
||||||
}
|
key += "@" + filter;
|
||||||
boolean sameFile = false;
|
|
||||||
BitmapDrawable img = null;
|
|
||||||
if (currentPath != null) {
|
|
||||||
if (currentPath.equals(key)) {
|
|
||||||
sameFile = true;
|
|
||||||
if (currentImage != null) {
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
img = ImageLoader.getInstance().getImageFromMemory(fileLocation, httpUrl, filter, this);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
img = ImageLoader.getInstance().getImageFromMemory(fileLocation, httpUrl, filter, this);
|
|
||||||
recycleBitmap(img);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
img = ImageLoader.getInstance().getImageFromMemory(fileLocation, httpUrl, filter, this);
|
|
||||||
currentPath = key;
|
|
||||||
last_path = fileLocation;
|
|
||||||
last_httpUrl = httpUrl;
|
|
||||||
last_filter = filter;
|
|
||||||
if (!sameFile) {
|
|
||||||
last_placeholder = placeholder;
|
|
||||||
last_placeholderLocation = placeholderLocation;
|
|
||||||
}
|
|
||||||
last_size = size;
|
|
||||||
lastCacheOnly = cacheOnly;
|
|
||||||
bitmapShader = null;
|
|
||||||
if (img == null) {
|
|
||||||
isPlaceholder = true;
|
|
||||||
if (!sameFile && last_placeholderLocation != null && last_placeholder == null) {
|
|
||||||
last_placeholder = ImageLoader.getInstance().getImageFromMemory(last_placeholderLocation, null, null, null);
|
|
||||||
if (last_placeholder != null) {
|
|
||||||
try {
|
|
||||||
Bitmap bitmap = ((BitmapDrawable) last_placeholder).getBitmap();
|
|
||||||
bitmap = bitmap.copy(bitmap.getConfig(), true);
|
|
||||||
Utilities.blurBitmap(bitmap, 1);
|
|
||||||
last_placeholder = new BitmapDrawable(bitmap);
|
|
||||||
} catch (Exception e) {
|
|
||||||
FileLog.e("tmessages", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ImageLoader.getInstance().loadImage(fileLocation, httpUrl, this, size, cacheOnly);
|
|
||||||
if (parentView != null) {
|
|
||||||
parentView.invalidate();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setImageBitmap(img, currentPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImageBitmap(BitmapDrawable bitmap, String imgKey) {
|
if (currentKey != null && key != null && currentKey.equals(key)) {
|
||||||
if (currentPath == null || !imgKey.equals(currentPath)) {
|
if (delegate != null) {
|
||||||
return;
|
delegate.didSetImage(this, currentImage != null || currentThumb != null || staticThumb != null, currentImage == null);
|
||||||
|
}
|
||||||
|
if (!canceledLoading && !forcePreview) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
isPlaceholder = false;
|
|
||||||
ImageLoader.getInstance().incrementUseCount(currentPath);
|
String thumbKey = null;
|
||||||
currentImage = bitmap;
|
if (thumbLocation != null) {
|
||||||
if (roundRadius != 0) {
|
thumbKey = thumbLocation.volume_id + "_" + thumbLocation.local_id;
|
||||||
bitmapShader = new BitmapShader(bitmap.getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
|
if (thumbFilter != null) {
|
||||||
roundPaint.setShader(bitmapShader);
|
thumbKey += "@" + thumbFilter;
|
||||||
bitmapRect.set(0, 0, bitmap.getBitmap().getWidth(), bitmap.getBitmap().getHeight());
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recycleBitmap(key, false);
|
||||||
|
recycleBitmap(thumbKey, true);
|
||||||
|
|
||||||
|
currentThumbKey = thumbKey;
|
||||||
|
currentKey = key;
|
||||||
|
currentImageLocation = fileLocation;
|
||||||
|
currentHttpUrl = httpUrl;
|
||||||
|
currentFilter = filter;
|
||||||
|
currentThumbFilter = thumbFilter;
|
||||||
|
currentSize = size;
|
||||||
|
currentCacheOnly = cacheOnly;
|
||||||
|
currentThumbLocation = thumbLocation;
|
||||||
|
staticThumb = thumb;
|
||||||
|
bitmapShader = null;
|
||||||
|
|
||||||
|
if (delegate != null) {
|
||||||
|
delegate.didSetImage(this, currentImage != null || currentThumb != null || staticThumb != null, currentImage == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageLoader.getInstance().loadImageForImageReceiver(this);
|
||||||
if (parentView != null) {
|
if (parentView != null) {
|
||||||
parentView.invalidate();
|
parentView.invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setDelegate(ImageReceiverDelegate delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
public void setPressed(boolean value) {
|
public void setPressed(boolean value) {
|
||||||
isPressed = value;
|
isPressed = value;
|
||||||
}
|
}
|
||||||
@ -195,62 +218,50 @@ public class ImageReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setImageBitmap(Drawable bitmap) {
|
public void setImageBitmap(Drawable bitmap) {
|
||||||
ImageLoader.getInstance().cancelLoadingForImageView(this);
|
ImageLoader.getInstance().cancelLoadingForImageReceiver(this, 0);
|
||||||
recycleBitmap(null);
|
recycleBitmap(null, false);
|
||||||
last_placeholder = bitmap;
|
recycleBitmap(null, true);
|
||||||
isPlaceholder = true;
|
staticThumb = bitmap;
|
||||||
last_placeholderLocation = null;
|
currentThumbLocation = null;
|
||||||
currentPath = null;
|
currentKey = null;
|
||||||
|
currentThumbKey = null;
|
||||||
currentImage = null;
|
currentImage = null;
|
||||||
last_path = null;
|
currentThumbFilter = null;
|
||||||
last_httpUrl = null;
|
currentImageLocation = null;
|
||||||
last_filter = null;
|
currentHttpUrl = null;
|
||||||
|
currentFilter = null;
|
||||||
|
currentSize = 0;
|
||||||
|
currentCacheOnly = false;
|
||||||
bitmapShader = null;
|
bitmapShader = null;
|
||||||
last_size = 0;
|
if (delegate != null) {
|
||||||
lastCacheOnly = false;
|
delegate.didSetImage(this, currentImage != null || currentThumb != null || staticThumb != null, currentImage == null);
|
||||||
|
}
|
||||||
if (parentView != null) {
|
if (parentView != null) {
|
||||||
parentView.invalidate();
|
parentView.invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearImage() {
|
public void clearImage() {
|
||||||
recycleBitmap(null);
|
recycleBitmap(null, false);
|
||||||
}
|
recycleBitmap(null, true);
|
||||||
|
if (needsQualityThumb) {
|
||||||
private void recycleBitmap(BitmapDrawable newBitmap) {
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageThumbGenerated);
|
||||||
if (currentImage == null || isPlaceholder || disableRecycle) {
|
ImageLoader.getInstance().cancelLoadingForImageReceiver(this, 0);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (currentImage instanceof BitmapDrawable) {
|
|
||||||
if (currentImage != newBitmap) {
|
|
||||||
if (currentPath != null) {
|
|
||||||
Bitmap bitmap = ((BitmapDrawable) currentImage).getBitmap();
|
|
||||||
boolean canDelete = ImageLoader.getInstance().decrementUseCount(currentPath);
|
|
||||||
if (!ImageLoader.getInstance().isInCache(currentPath)) {
|
|
||||||
if (ImageLoader.getInstance().runtimeHack != null) {
|
|
||||||
ImageLoader.getInstance().runtimeHack.trackAlloc(bitmap.getRowBytes() * bitmap.getHeight());
|
|
||||||
}
|
|
||||||
if (canDelete) {
|
|
||||||
currentImage = null;
|
|
||||||
bitmap.recycle();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
currentImage = null;
|
|
||||||
}
|
|
||||||
currentPath = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean draw(Canvas canvas) {
|
public boolean draw(Canvas canvas) {
|
||||||
try {
|
try {
|
||||||
Drawable bitmapDrawable = currentImage;
|
BitmapDrawable bitmapDrawable = null;
|
||||||
if (forcePreview || bitmapDrawable == null && last_placeholder != null && last_placeholder instanceof BitmapDrawable) {
|
if (!forcePreview && currentImage != null) {
|
||||||
bitmapDrawable = last_placeholder;
|
bitmapDrawable = currentImage;
|
||||||
|
} else if (staticThumb instanceof BitmapDrawable) {
|
||||||
|
bitmapDrawable = (BitmapDrawable) staticThumb;
|
||||||
|
} else if (currentThumb != null) {
|
||||||
|
bitmapDrawable = currentThumb;
|
||||||
}
|
}
|
||||||
if (bitmapDrawable != null) {
|
if (bitmapDrawable != null) {
|
||||||
Paint paint = ((BitmapDrawable) bitmapDrawable).getPaint();
|
Paint paint = bitmapDrawable.getPaint();
|
||||||
boolean hasFilter = paint != null && paint.getColorFilter() != null;
|
boolean hasFilter = paint != null && paint.getColorFilter() != null;
|
||||||
if (hasFilter && !isPressed) {
|
if (hasFilter && !isPressed) {
|
||||||
bitmapDrawable.setColorFilter(null);
|
bitmapDrawable.setColorFilter(null);
|
||||||
@ -285,11 +296,14 @@ public class ImageReceiver {
|
|||||||
bitmapDrawable.setAlpha(alpha);
|
bitmapDrawable.setAlpha(alpha);
|
||||||
bitmapDrawable.draw(canvas);
|
bitmapDrawable.draw(canvas);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (currentPath != null) {
|
if (bitmapDrawable == currentImage && currentKey != null) {
|
||||||
ImageLoader.getInstance().removeImage(currentPath);
|
ImageLoader.getInstance().removeImage(currentKey);
|
||||||
currentPath = null;
|
currentKey = null;
|
||||||
|
} else if (bitmapDrawable == currentThumb && currentThumbKey != null) {
|
||||||
|
ImageLoader.getInstance().removeImage(currentThumbKey);
|
||||||
|
currentThumbKey = null;
|
||||||
}
|
}
|
||||||
setImage(last_path, last_httpUrl, last_filter, last_placeholder, last_placeholderLocation, last_size, lastCacheOnly);
|
setImage(currentImageLocation, currentHttpUrl, currentFilter, currentThumb, currentThumbLocation, currentThumbFilter, currentSize, currentCacheOnly);
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
@ -311,11 +325,14 @@ public class ImageReceiver {
|
|||||||
bitmapDrawable.setAlpha(alpha);
|
bitmapDrawable.setAlpha(alpha);
|
||||||
bitmapDrawable.draw(canvas);
|
bitmapDrawable.draw(canvas);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (currentPath != null) {
|
if (bitmapDrawable == currentImage && currentKey != null) {
|
||||||
ImageLoader.getInstance().removeImage(currentPath);
|
ImageLoader.getInstance().removeImage(currentKey);
|
||||||
currentPath = null;
|
currentKey = null;
|
||||||
|
} else if (bitmapDrawable == currentThumb && currentThumbKey != null) {
|
||||||
|
ImageLoader.getInstance().removeImage(currentThumbKey);
|
||||||
|
currentThumbKey = null;
|
||||||
}
|
}
|
||||||
setImage(last_path, last_httpUrl, last_filter, last_placeholder, last_placeholderLocation, last_size, lastCacheOnly);
|
setImage(currentImageLocation, currentHttpUrl, currentFilter, currentThumb, currentThumbLocation, currentThumbFilter, currentSize, currentCacheOnly);
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -329,11 +346,14 @@ public class ImageReceiver {
|
|||||||
bitmapDrawable.setAlpha(alpha);
|
bitmapDrawable.setAlpha(alpha);
|
||||||
bitmapDrawable.draw(canvas);
|
bitmapDrawable.draw(canvas);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (currentPath != null) {
|
if (bitmapDrawable == currentImage && currentKey != null) {
|
||||||
ImageLoader.getInstance().removeImage(currentPath);
|
ImageLoader.getInstance().removeImage(currentKey);
|
||||||
currentPath = null;
|
currentKey = null;
|
||||||
|
} else if (bitmapDrawable == currentThumb && currentThumbKey != null) {
|
||||||
|
ImageLoader.getInstance().removeImage(currentThumbKey);
|
||||||
|
currentThumbKey = null;
|
||||||
}
|
}
|
||||||
setImage(last_path, last_httpUrl, last_filter, last_placeholder, last_placeholderLocation, last_size, lastCacheOnly);
|
setImage(currentImageLocation, currentHttpUrl, currentFilter, currentThumb, currentThumbLocation, currentThumbFilter, currentSize, currentCacheOnly);
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,19 +361,14 @@ public class ImageReceiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (last_placeholder != null) {
|
} else if (staticThumb != null) {
|
||||||
drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH);
|
drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH);
|
||||||
last_placeholder.setBounds(drawRegion);
|
staticThumb.setBounds(drawRegion);
|
||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
try {
|
try {
|
||||||
last_placeholder.setAlpha(alpha);
|
staticThumb.setAlpha(alpha);
|
||||||
last_placeholder.draw(canvas);
|
staticThumb.draw(canvas);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (currentPath != null) {
|
|
||||||
ImageLoader.getInstance().removeImage(currentPath);
|
|
||||||
currentPath = null;
|
|
||||||
}
|
|
||||||
setImage(last_path, last_httpUrl, last_filter, last_placeholder, last_placeholderLocation, last_size, lastCacheOnly);
|
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -366,10 +381,12 @@ public class ImageReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getBitmap() {
|
public Bitmap getBitmap() {
|
||||||
if (currentImage != null && currentImage instanceof BitmapDrawable) {
|
if (currentImage != null) {
|
||||||
return ((BitmapDrawable)currentImage).getBitmap();
|
return currentImage.getBitmap();
|
||||||
} else if (isPlaceholder && last_placeholder != null && last_placeholder instanceof BitmapDrawable) {
|
} else if (currentThumb != null) {
|
||||||
return ((BitmapDrawable)last_placeholder).getBitmap();
|
return currentThumb.getBitmap();
|
||||||
|
} else if (staticThumb instanceof BitmapDrawable) {
|
||||||
|
return ((BitmapDrawable) staticThumb).getBitmap();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -393,7 +410,7 @@ public class ImageReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasImage() {
|
public boolean hasImage() {
|
||||||
return currentImage != null || last_placeholder != null || currentPath != null || last_httpUrl != null;
|
return currentImage != null || currentThumb != null || currentKey != null || currentHttpUrl != null || staticThumb != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAspectFit(boolean value) {
|
public void setAspectFit(boolean value) {
|
||||||
@ -404,14 +421,6 @@ public class ImageReceiver {
|
|||||||
parentView = view;
|
parentView = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Integer getTag() {
|
|
||||||
return tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setTag(Integer tag) {
|
|
||||||
this.tag = tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setImageCoords(int x, int y, int width, int height) {
|
public void setImageCoords(int x, int y, int width, int height) {
|
||||||
imageX = x;
|
imageX = x;
|
||||||
imageY = y;
|
imageY = y;
|
||||||
@ -444,17 +453,49 @@ public class ImageReceiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getFilter() {
|
public String getFilter() {
|
||||||
return last_filter;
|
return currentFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getThumbFilter() {
|
||||||
|
return currentThumbFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getKey() {
|
public String getKey() {
|
||||||
return currentPath;
|
return currentKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getThumbKey() {
|
||||||
|
return currentThumbKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return currentSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TLObject getImageLocation() {
|
||||||
|
return currentImageLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TLRPC.FileLocation getThumbLocation() {
|
||||||
|
return currentThumbLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHttpImageLocation() {
|
||||||
|
return currentHttpUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getCacheOnly() {
|
||||||
|
return currentCacheOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setForcePreview(boolean value) {
|
public void setForcePreview(boolean value) {
|
||||||
forcePreview = value;
|
forcePreview = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isForcePreview() {
|
||||||
|
return forcePreview;
|
||||||
|
}
|
||||||
|
|
||||||
public void setRoundRadius(int value) {
|
public void setRoundRadius(int value) {
|
||||||
roundRadius = value;
|
roundRadius = value;
|
||||||
if (roundRadius != 0) {
|
if (roundRadius != 0) {
|
||||||
@ -475,4 +516,146 @@ public class ImageReceiver {
|
|||||||
public int getRoundRadius() {
|
public int getRoundRadius() {
|
||||||
return roundRadius;
|
return roundRadius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setParentMessageObject(MessageObject messageObject) {
|
||||||
|
parentMessageObject = messageObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageObject getParentMessageObject() {
|
||||||
|
return parentMessageObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNeedsQualityThumb(boolean value) {
|
||||||
|
needsQualityThumb = value;
|
||||||
|
if (needsQualityThumb) {
|
||||||
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageThumbGenerated);
|
||||||
|
} else {
|
||||||
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageThumbGenerated);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNeedsQualityThumb() {
|
||||||
|
return needsQualityThumb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShouldGenerateQualityThumb(boolean value) {
|
||||||
|
shouldGenerateQualityThumb = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isShouldGenerateQualityThumb() {
|
||||||
|
return shouldGenerateQualityThumb;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Integer getTag(boolean thumb) {
|
||||||
|
if (thumb) {
|
||||||
|
return thumbTag;
|
||||||
|
} else {
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setTag(Integer value, boolean thumb) {
|
||||||
|
if (thumb) {
|
||||||
|
thumbTag = value;
|
||||||
|
} else {
|
||||||
|
tag = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setImageBitmapByKey(BitmapDrawable bitmap, String key, boolean thumb) {
|
||||||
|
if (bitmap == null || key == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!thumb) {
|
||||||
|
if (currentKey == null || !key.equals(currentKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ImageLoader.getInstance().incrementUseCount(currentKey);
|
||||||
|
currentImage = bitmap;
|
||||||
|
if (roundRadius != 0 && bitmap instanceof BitmapDrawable) {
|
||||||
|
Bitmap object = bitmap.getBitmap();
|
||||||
|
bitmapShader = new BitmapShader(object, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
|
||||||
|
roundPaint.setShader(bitmapShader);
|
||||||
|
bitmapRect.set(0, 0, object.getWidth(), object.getHeight());
|
||||||
|
}
|
||||||
|
if (parentView != null) {
|
||||||
|
parentView.invalidate();
|
||||||
|
}
|
||||||
|
} else if (currentThumb == null && (currentImage == null || forcePreview)) {
|
||||||
|
if (currentThumbKey == null || !key.equals(currentThumbKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ImageLoader.getInstance().incrementUseCount(currentThumbKey);
|
||||||
|
currentThumb = bitmap;
|
||||||
|
if (!(staticThumb instanceof BitmapDrawable) && parentView != null) {
|
||||||
|
parentView.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delegate != null) {
|
||||||
|
delegate.didSetImage(this, currentImage != null || currentThumb != null || staticThumb != null, currentImage == null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void recycleBitmap(String newKey, boolean thumb) {
|
||||||
|
String key;
|
||||||
|
BitmapDrawable image;
|
||||||
|
if (thumb) {
|
||||||
|
if (currentThumb == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
key = currentThumbKey;
|
||||||
|
image = currentThumb;
|
||||||
|
} else {
|
||||||
|
if (currentImage == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
key = currentKey;
|
||||||
|
image = currentImage;
|
||||||
|
}
|
||||||
|
BitmapDrawable newBitmap = null;
|
||||||
|
if (newKey != null) {
|
||||||
|
newBitmap = ImageLoader.getInstance().getImageFromMemory(newKey);
|
||||||
|
}
|
||||||
|
if (key == null || image == null || image == newBitmap || disableRecycle) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bitmap bitmap = image.getBitmap();
|
||||||
|
boolean canDelete = ImageLoader.getInstance().decrementUseCount(key);
|
||||||
|
if (!ImageLoader.getInstance().isInCache(key)) {
|
||||||
|
if (ImageLoader.getInstance().runtimeHack != null) {
|
||||||
|
ImageLoader.getInstance().runtimeHack.trackAlloc(bitmap.getRowBytes() * bitmap.getHeight());
|
||||||
|
}
|
||||||
|
if (canDelete) {
|
||||||
|
bitmap.recycle();
|
||||||
|
ImageLoader.getInstance().callGC();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (thumb) {
|
||||||
|
currentThumb = null;
|
||||||
|
currentThumbKey = null;
|
||||||
|
} else {
|
||||||
|
currentImage = null;
|
||||||
|
currentKey = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void didReceivedNotification(int id, Object... args) {
|
||||||
|
if (id == NotificationCenter.messageThumbGenerated) {
|
||||||
|
String key = (String) args[1];
|
||||||
|
if (currentThumbKey != null && currentThumbKey.equals(key)) {
|
||||||
|
if (currentThumb == null) {
|
||||||
|
ImageLoader.getInstance().incrementUseCount(currentThumbKey);
|
||||||
|
}
|
||||||
|
currentThumb = (BitmapDrawable) args[0];
|
||||||
|
if (staticThumb instanceof BitmapDrawable) {
|
||||||
|
staticThumb = null;
|
||||||
|
}
|
||||||
|
if (parentView != null) {
|
||||||
|
parentView.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,17 +58,19 @@ public class LocaleController {
|
|||||||
public static FastDateFormat chatDate;
|
public static FastDateFormat chatDate;
|
||||||
public static FastDateFormat chatFullDate;
|
public static FastDateFormat chatFullDate;
|
||||||
|
|
||||||
private HashMap<String, PluralRules> allRules = new HashMap<String, PluralRules>();
|
private HashMap<String, PluralRules> allRules = new HashMap<>();
|
||||||
|
|
||||||
private Locale currentLocale;
|
private Locale currentLocale;
|
||||||
private Locale systemDefaultLocale;
|
private Locale systemDefaultLocale;
|
||||||
private PluralRules currentPluralRules;
|
private PluralRules currentPluralRules;
|
||||||
private LocaleInfo currentLocaleInfo;
|
private LocaleInfo currentLocaleInfo;
|
||||||
private LocaleInfo defaultLocalInfo;
|
private LocaleInfo defaultLocalInfo;
|
||||||
private HashMap<String, String> localeValues = new HashMap<String, String>();
|
private HashMap<String, String> localeValues = new HashMap<>();
|
||||||
private String languageOverride;
|
private String languageOverride;
|
||||||
private boolean changingConfiguration = false;
|
private boolean changingConfiguration = false;
|
||||||
|
|
||||||
|
private HashMap<String, String> translitChars;
|
||||||
|
|
||||||
private class TimeZoneChangedReceiver extends BroadcastReceiver {
|
private class TimeZoneChangedReceiver extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@ -110,10 +112,10 @@ public class LocaleController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<LocaleInfo> sortedLanguages = new ArrayList<LocaleController.LocaleInfo>();
|
public ArrayList<LocaleInfo> sortedLanguages = new ArrayList<>();
|
||||||
public HashMap<String, LocaleInfo> languagesDict = new HashMap<String, LocaleInfo>();
|
public HashMap<String, LocaleInfo> languagesDict = new HashMap<>();
|
||||||
|
|
||||||
private ArrayList<LocaleInfo> otherLanguages = new ArrayList<LocaleInfo>();
|
private ArrayList<LocaleInfo> otherLanguages = new ArrayList<>();
|
||||||
|
|
||||||
private static volatile LocaleController Instance = null;
|
private static volatile LocaleController Instance = null;
|
||||||
public static LocaleController getInstance() {
|
public static LocaleController getInstance() {
|
||||||
@ -442,7 +444,7 @@ public class LocaleController {
|
|||||||
|
|
||||||
private HashMap<String, String> getLocaleFileStrings(File file) {
|
private HashMap<String, String> getLocaleFileStrings(File file) {
|
||||||
try {
|
try {
|
||||||
HashMap<String, String> stringMap = new HashMap<String, String>();
|
HashMap<String, String> stringMap = new HashMap<>();
|
||||||
XmlPullParser parser = Xml.newPullParser();
|
XmlPullParser parser = Xml.newPullParser();
|
||||||
parser.setInput(new FileInputStream(file), "UTF-8");
|
parser.setInput(new FileInputStream(file), "UTF-8");
|
||||||
int eventType = parser.getEventType();
|
int eventType = parser.getEventType();
|
||||||
@ -818,6 +820,542 @@ public class LocaleController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTranslitString(String src) {
|
||||||
|
if (translitChars == null) {
|
||||||
|
translitChars = new HashMap<>(520);
|
||||||
|
translitChars.put("ȼ", "c");
|
||||||
|
translitChars.put("ᶇ", "n");
|
||||||
|
translitChars.put("ɖ", "d");
|
||||||
|
translitChars.put("ỿ", "y");
|
||||||
|
translitChars.put("ᴓ", "o");
|
||||||
|
translitChars.put("ø", "o");
|
||||||
|
translitChars.put("ḁ", "a");
|
||||||
|
translitChars.put("ʯ", "h");
|
||||||
|
translitChars.put("ŷ", "y");
|
||||||
|
translitChars.put("ʞ", "k");
|
||||||
|
translitChars.put("ừ", "u");
|
||||||
|
translitChars.put("ꜳ", "aa");
|
||||||
|
translitChars.put("ij", "ij");
|
||||||
|
translitChars.put("ḽ", "l");
|
||||||
|
translitChars.put("ɪ", "i");
|
||||||
|
translitChars.put("ḇ", "b");
|
||||||
|
translitChars.put("ʀ", "r");
|
||||||
|
translitChars.put("ě", "e");
|
||||||
|
translitChars.put("ffi", "ffi");
|
||||||
|
translitChars.put("ơ", "o");
|
||||||
|
translitChars.put("ⱹ", "r");
|
||||||
|
translitChars.put("ồ", "o");
|
||||||
|
translitChars.put("ǐ", "i");
|
||||||
|
translitChars.put("ꝕ", "p");
|
||||||
|
translitChars.put("ý", "y");
|
||||||
|
translitChars.put("ḝ", "e");
|
||||||
|
translitChars.put("ₒ", "o");
|
||||||
|
translitChars.put("ⱥ", "a");
|
||||||
|
translitChars.put("ʙ", "b");
|
||||||
|
translitChars.put("ḛ", "e");
|
||||||
|
translitChars.put("ƈ", "c");
|
||||||
|
translitChars.put("ɦ", "h");
|
||||||
|
translitChars.put("ᵬ", "b");
|
||||||
|
translitChars.put("ṣ", "s");
|
||||||
|
translitChars.put("đ", "d");
|
||||||
|
translitChars.put("ỗ", "o");
|
||||||
|
translitChars.put("ɟ", "j");
|
||||||
|
translitChars.put("ẚ", "a");
|
||||||
|
translitChars.put("ɏ", "y");
|
||||||
|
translitChars.put("л", "l");
|
||||||
|
translitChars.put("ʌ", "v");
|
||||||
|
translitChars.put("ꝓ", "p");
|
||||||
|
translitChars.put("fi", "fi");
|
||||||
|
translitChars.put("ᶄ", "k");
|
||||||
|
translitChars.put("ḏ", "d");
|
||||||
|
translitChars.put("ᴌ", "l");
|
||||||
|
translitChars.put("ė", "e");
|
||||||
|
translitChars.put("ё", "yo");
|
||||||
|
translitChars.put("ᴋ", "k");
|
||||||
|
translitChars.put("ċ", "c");
|
||||||
|
translitChars.put("ʁ", "r");
|
||||||
|
translitChars.put("ƕ", "hv");
|
||||||
|
translitChars.put("ƀ", "b");
|
||||||
|
translitChars.put("ṍ", "o");
|
||||||
|
translitChars.put("ȣ", "ou");
|
||||||
|
translitChars.put("ǰ", "j");
|
||||||
|
translitChars.put("ᶃ", "g");
|
||||||
|
translitChars.put("ṋ", "n");
|
||||||
|
translitChars.put("ɉ", "j");
|
||||||
|
translitChars.put("ǧ", "g");
|
||||||
|
translitChars.put("dz", "dz");
|
||||||
|
translitChars.put("ź", "z");
|
||||||
|
translitChars.put("ꜷ", "au");
|
||||||
|
translitChars.put("ǖ", "u");
|
||||||
|
translitChars.put("ᵹ", "g");
|
||||||
|
translitChars.put("ȯ", "o");
|
||||||
|
translitChars.put("ɐ", "a");
|
||||||
|
translitChars.put("ą", "a");
|
||||||
|
translitChars.put("õ", "o");
|
||||||
|
translitChars.put("ɻ", "r");
|
||||||
|
translitChars.put("ꝍ", "o");
|
||||||
|
translitChars.put("ǟ", "a");
|
||||||
|
translitChars.put("ȴ", "l");
|
||||||
|
translitChars.put("ʂ", "s");
|
||||||
|
translitChars.put("fl", "fl");
|
||||||
|
translitChars.put("ȉ", "i");
|
||||||
|
translitChars.put("ⱻ", "e");
|
||||||
|
translitChars.put("ṉ", "n");
|
||||||
|
translitChars.put("ï", "i");
|
||||||
|
translitChars.put("ñ", "n");
|
||||||
|
translitChars.put("ᴉ", "i");
|
||||||
|
translitChars.put("ʇ", "t");
|
||||||
|
translitChars.put("ẓ", "z");
|
||||||
|
translitChars.put("ỷ", "y");
|
||||||
|
translitChars.put("ȳ", "y");
|
||||||
|
translitChars.put("ṩ", "s");
|
||||||
|
translitChars.put("ɽ", "r");
|
||||||
|
translitChars.put("ĝ", "g");
|
||||||
|
translitChars.put("в", "v");
|
||||||
|
translitChars.put("ᴝ", "u");
|
||||||
|
translitChars.put("ḳ", "k");
|
||||||
|
translitChars.put("ꝫ", "et");
|
||||||
|
translitChars.put("ī", "i");
|
||||||
|
translitChars.put("ť", "t");
|
||||||
|
translitChars.put("ꜿ", "c");
|
||||||
|
translitChars.put("ʟ", "l");
|
||||||
|
translitChars.put("ꜹ", "av");
|
||||||
|
translitChars.put("û", "u");
|
||||||
|
translitChars.put("æ", "ae");
|
||||||
|
translitChars.put("и", "i");
|
||||||
|
translitChars.put("ă", "a");
|
||||||
|
translitChars.put("ǘ", "u");
|
||||||
|
translitChars.put("ꞅ", "s");
|
||||||
|
translitChars.put("ᵣ", "r");
|
||||||
|
translitChars.put("ᴀ", "a");
|
||||||
|
translitChars.put("ƃ", "b");
|
||||||
|
translitChars.put("ḩ", "h");
|
||||||
|
translitChars.put("ṧ", "s");
|
||||||
|
translitChars.put("ₑ", "e");
|
||||||
|
translitChars.put("ʜ", "h");
|
||||||
|
translitChars.put("ẋ", "x");
|
||||||
|
translitChars.put("ꝅ", "k");
|
||||||
|
translitChars.put("ḋ", "d");
|
||||||
|
translitChars.put("ƣ", "oi");
|
||||||
|
translitChars.put("ꝑ", "p");
|
||||||
|
translitChars.put("ħ", "h");
|
||||||
|
translitChars.put("ⱴ", "v");
|
||||||
|
translitChars.put("ẇ", "w");
|
||||||
|
translitChars.put("ǹ", "n");
|
||||||
|
translitChars.put("ɯ", "m");
|
||||||
|
translitChars.put("ɡ", "g");
|
||||||
|
translitChars.put("ɴ", "n");
|
||||||
|
translitChars.put("ᴘ", "p");
|
||||||
|
translitChars.put("ᵥ", "v");
|
||||||
|
translitChars.put("ū", "u");
|
||||||
|
translitChars.put("ḃ", "b");
|
||||||
|
translitChars.put("ṗ", "p");
|
||||||
|
translitChars.put("ь", "");
|
||||||
|
translitChars.put("å", "a");
|
||||||
|
translitChars.put("ɕ", "c");
|
||||||
|
translitChars.put("ọ", "o");
|
||||||
|
translitChars.put("ắ", "a");
|
||||||
|
translitChars.put("ƒ", "f");
|
||||||
|
translitChars.put("ǣ", "ae");
|
||||||
|
translitChars.put("ꝡ", "vy");
|
||||||
|
translitChars.put("ff", "ff");
|
||||||
|
translitChars.put("ᶉ", "r");
|
||||||
|
translitChars.put("ô", "o");
|
||||||
|
translitChars.put("ǿ", "o");
|
||||||
|
translitChars.put("ṳ", "u");
|
||||||
|
translitChars.put("ȥ", "z");
|
||||||
|
translitChars.put("ḟ", "f");
|
||||||
|
translitChars.put("ḓ", "d");
|
||||||
|
translitChars.put("ȇ", "e");
|
||||||
|
translitChars.put("ȕ", "u");
|
||||||
|
translitChars.put("п", "p");
|
||||||
|
translitChars.put("ȵ", "n");
|
||||||
|
translitChars.put("ʠ", "q");
|
||||||
|
translitChars.put("ấ", "a");
|
||||||
|
translitChars.put("ǩ", "k");
|
||||||
|
translitChars.put("ĩ", "i");
|
||||||
|
translitChars.put("ṵ", "u");
|
||||||
|
translitChars.put("ŧ", "t");
|
||||||
|
translitChars.put("ɾ", "r");
|
||||||
|
translitChars.put("ƙ", "k");
|
||||||
|
translitChars.put("ṫ", "t");
|
||||||
|
translitChars.put("ꝗ", "q");
|
||||||
|
translitChars.put("ậ", "a");
|
||||||
|
translitChars.put("н", "n");
|
||||||
|
translitChars.put("ʄ", "j");
|
||||||
|
translitChars.put("ƚ", "l");
|
||||||
|
translitChars.put("ᶂ", "f");
|
||||||
|
translitChars.put("д", "d");
|
||||||
|
translitChars.put("ᵴ", "s");
|
||||||
|
translitChars.put("ꞃ", "r");
|
||||||
|
translitChars.put("ᶌ", "v");
|
||||||
|
translitChars.put("ɵ", "o");
|
||||||
|
translitChars.put("ḉ", "c");
|
||||||
|
translitChars.put("ᵤ", "u");
|
||||||
|
translitChars.put("ẑ", "z");
|
||||||
|
translitChars.put("ṹ", "u");
|
||||||
|
translitChars.put("ň", "n");
|
||||||
|
translitChars.put("ʍ", "w");
|
||||||
|
translitChars.put("ầ", "a");
|
||||||
|
translitChars.put("lj", "lj");
|
||||||
|
translitChars.put("ɓ", "b");
|
||||||
|
translitChars.put("ɼ", "r");
|
||||||
|
translitChars.put("ò", "o");
|
||||||
|
translitChars.put("ẘ", "w");
|
||||||
|
translitChars.put("ɗ", "d");
|
||||||
|
translitChars.put("ꜽ", "ay");
|
||||||
|
translitChars.put("ư", "u");
|
||||||
|
translitChars.put("ᶀ", "b");
|
||||||
|
translitChars.put("ǜ", "u");
|
||||||
|
translitChars.put("ẹ", "e");
|
||||||
|
translitChars.put("ǡ", "a");
|
||||||
|
translitChars.put("ɥ", "h");
|
||||||
|
translitChars.put("ṏ", "o");
|
||||||
|
translitChars.put("ǔ", "u");
|
||||||
|
translitChars.put("ʎ", "y");
|
||||||
|
translitChars.put("ȱ", "o");
|
||||||
|
translitChars.put("ệ", "e");
|
||||||
|
translitChars.put("ế", "e");
|
||||||
|
translitChars.put("ĭ", "i");
|
||||||
|
translitChars.put("ⱸ", "e");
|
||||||
|
translitChars.put("ṯ", "t");
|
||||||
|
translitChars.put("ᶑ", "d");
|
||||||
|
translitChars.put("ḧ", "h");
|
||||||
|
translitChars.put("ṥ", "s");
|
||||||
|
translitChars.put("ë", "e");
|
||||||
|
translitChars.put("ᴍ", "m");
|
||||||
|
translitChars.put("ö", "o");
|
||||||
|
translitChars.put("é", "e");
|
||||||
|
translitChars.put("ı", "i");
|
||||||
|
translitChars.put("ď", "d");
|
||||||
|
translitChars.put("ᵯ", "m");
|
||||||
|
translitChars.put("ỵ", "y");
|
||||||
|
translitChars.put("я", "ya");
|
||||||
|
translitChars.put("ŵ", "w");
|
||||||
|
translitChars.put("ề", "e");
|
||||||
|
translitChars.put("ứ", "u");
|
||||||
|
translitChars.put("ƶ", "z");
|
||||||
|
translitChars.put("ĵ", "j");
|
||||||
|
translitChars.put("ḍ", "d");
|
||||||
|
translitChars.put("ŭ", "u");
|
||||||
|
translitChars.put("ʝ", "j");
|
||||||
|
translitChars.put("ж", "zh");
|
||||||
|
translitChars.put("ê", "e");
|
||||||
|
translitChars.put("ǚ", "u");
|
||||||
|
translitChars.put("ġ", "g");
|
||||||
|
translitChars.put("ṙ", "r");
|
||||||
|
translitChars.put("ƞ", "n");
|
||||||
|
translitChars.put("ъ", "");
|
||||||
|
translitChars.put("ḗ", "e");
|
||||||
|
translitChars.put("ẝ", "s");
|
||||||
|
translitChars.put("ᶁ", "d");
|
||||||
|
translitChars.put("ķ", "k");
|
||||||
|
translitChars.put("ᴂ", "ae");
|
||||||
|
translitChars.put("ɘ", "e");
|
||||||
|
translitChars.put("ợ", "o");
|
||||||
|
translitChars.put("ḿ", "m");
|
||||||
|
translitChars.put("ꜰ", "f");
|
||||||
|
translitChars.put("а", "a");
|
||||||
|
translitChars.put("ẵ", "a");
|
||||||
|
translitChars.put("ꝏ", "oo");
|
||||||
|
translitChars.put("ᶆ", "m");
|
||||||
|
translitChars.put("ᵽ", "p");
|
||||||
|
translitChars.put("ц", "ts");
|
||||||
|
translitChars.put("ữ", "u");
|
||||||
|
translitChars.put("ⱪ", "k");
|
||||||
|
translitChars.put("ḥ", "h");
|
||||||
|
translitChars.put("ţ", "t");
|
||||||
|
translitChars.put("ᵱ", "p");
|
||||||
|
translitChars.put("ṁ", "m");
|
||||||
|
translitChars.put("á", "a");
|
||||||
|
translitChars.put("ᴎ", "n");
|
||||||
|
translitChars.put("ꝟ", "v");
|
||||||
|
translitChars.put("è", "e");
|
||||||
|
translitChars.put("ᶎ", "z");
|
||||||
|
translitChars.put("ꝺ", "d");
|
||||||
|
translitChars.put("ᶈ", "p");
|
||||||
|
translitChars.put("м", "m");
|
||||||
|
translitChars.put("ɫ", "l");
|
||||||
|
translitChars.put("ᴢ", "z");
|
||||||
|
translitChars.put("ɱ", "m");
|
||||||
|
translitChars.put("ṝ", "r");
|
||||||
|
translitChars.put("ṽ", "v");
|
||||||
|
translitChars.put("ũ", "u");
|
||||||
|
translitChars.put("ß", "ss");
|
||||||
|
translitChars.put("т", "t");
|
||||||
|
translitChars.put("ĥ", "h");
|
||||||
|
translitChars.put("ᵵ", "t");
|
||||||
|
translitChars.put("ʐ", "z");
|
||||||
|
translitChars.put("ṟ", "r");
|
||||||
|
translitChars.put("ɲ", "n");
|
||||||
|
translitChars.put("à", "a");
|
||||||
|
translitChars.put("ẙ", "y");
|
||||||
|
translitChars.put("ỳ", "y");
|
||||||
|
translitChars.put("ᴔ", "oe");
|
||||||
|
translitChars.put("ы", "i");
|
||||||
|
translitChars.put("ₓ", "x");
|
||||||
|
translitChars.put("ȗ", "u");
|
||||||
|
translitChars.put("ⱼ", "j");
|
||||||
|
translitChars.put("ẫ", "a");
|
||||||
|
translitChars.put("ʑ", "z");
|
||||||
|
translitChars.put("ẛ", "s");
|
||||||
|
translitChars.put("ḭ", "i");
|
||||||
|
translitChars.put("ꜵ", "ao");
|
||||||
|
translitChars.put("ɀ", "z");
|
||||||
|
translitChars.put("ÿ", "y");
|
||||||
|
translitChars.put("ǝ", "e");
|
||||||
|
translitChars.put("ǭ", "o");
|
||||||
|
translitChars.put("ᴅ", "d");
|
||||||
|
translitChars.put("ᶅ", "l");
|
||||||
|
translitChars.put("ù", "u");
|
||||||
|
translitChars.put("ạ", "a");
|
||||||
|
translitChars.put("ḅ", "b");
|
||||||
|
translitChars.put("ụ", "u");
|
||||||
|
translitChars.put("к", "k");
|
||||||
|
translitChars.put("ằ", "a");
|
||||||
|
translitChars.put("ᴛ", "t");
|
||||||
|
translitChars.put("ƴ", "y");
|
||||||
|
translitChars.put("ⱦ", "t");
|
||||||
|
translitChars.put("з", "z");
|
||||||
|
translitChars.put("ⱡ", "l");
|
||||||
|
translitChars.put("ȷ", "j");
|
||||||
|
translitChars.put("ᵶ", "z");
|
||||||
|
translitChars.put("ḫ", "h");
|
||||||
|
translitChars.put("ⱳ", "w");
|
||||||
|
translitChars.put("ḵ", "k");
|
||||||
|
translitChars.put("ờ", "o");
|
||||||
|
translitChars.put("î", "i");
|
||||||
|
translitChars.put("ģ", "g");
|
||||||
|
translitChars.put("ȅ", "e");
|
||||||
|
translitChars.put("ȧ", "a");
|
||||||
|
translitChars.put("ẳ", "a");
|
||||||
|
translitChars.put("щ", "sch");
|
||||||
|
translitChars.put("ɋ", "q");
|
||||||
|
translitChars.put("ṭ", "t");
|
||||||
|
translitChars.put("ꝸ", "um");
|
||||||
|
translitChars.put("ᴄ", "c");
|
||||||
|
translitChars.put("ẍ", "x");
|
||||||
|
translitChars.put("ủ", "u");
|
||||||
|
translitChars.put("ỉ", "i");
|
||||||
|
translitChars.put("ᴚ", "r");
|
||||||
|
translitChars.put("ś", "s");
|
||||||
|
translitChars.put("ꝋ", "o");
|
||||||
|
translitChars.put("ỹ", "y");
|
||||||
|
translitChars.put("ṡ", "s");
|
||||||
|
translitChars.put("nj", "nj");
|
||||||
|
translitChars.put("ȁ", "a");
|
||||||
|
translitChars.put("ẗ", "t");
|
||||||
|
translitChars.put("ĺ", "l");
|
||||||
|
translitChars.put("ž", "z");
|
||||||
|
translitChars.put("ᵺ", "th");
|
||||||
|
translitChars.put("ƌ", "d");
|
||||||
|
translitChars.put("ș", "s");
|
||||||
|
translitChars.put("š", "s");
|
||||||
|
translitChars.put("ᶙ", "u");
|
||||||
|
translitChars.put("ẽ", "e");
|
||||||
|
translitChars.put("ẜ", "s");
|
||||||
|
translitChars.put("ɇ", "e");
|
||||||
|
translitChars.put("ṷ", "u");
|
||||||
|
translitChars.put("ố", "o");
|
||||||
|
translitChars.put("ȿ", "s");
|
||||||
|
translitChars.put("ᴠ", "v");
|
||||||
|
translitChars.put("ꝭ", "is");
|
||||||
|
translitChars.put("ᴏ", "o");
|
||||||
|
translitChars.put("ɛ", "e");
|
||||||
|
translitChars.put("ǻ", "a");
|
||||||
|
translitChars.put("ffl", "ffl");
|
||||||
|
translitChars.put("ⱺ", "o");
|
||||||
|
translitChars.put("ȋ", "i");
|
||||||
|
translitChars.put("ᵫ", "ue");
|
||||||
|
translitChars.put("ȡ", "d");
|
||||||
|
translitChars.put("ⱬ", "z");
|
||||||
|
translitChars.put("ẁ", "w");
|
||||||
|
translitChars.put("ᶏ", "a");
|
||||||
|
translitChars.put("ꞇ", "t");
|
||||||
|
translitChars.put("ğ", "g");
|
||||||
|
translitChars.put("ɳ", "n");
|
||||||
|
translitChars.put("ʛ", "g");
|
||||||
|
translitChars.put("ᴜ", "u");
|
||||||
|
translitChars.put("ф", "f");
|
||||||
|
translitChars.put("ẩ", "a");
|
||||||
|
translitChars.put("ṅ", "n");
|
||||||
|
translitChars.put("ɨ", "i");
|
||||||
|
translitChars.put("ᴙ", "r");
|
||||||
|
translitChars.put("ǎ", "a");
|
||||||
|
translitChars.put("ſ", "s");
|
||||||
|
translitChars.put("у", "u");
|
||||||
|
translitChars.put("ȫ", "o");
|
||||||
|
translitChars.put("ɿ", "r");
|
||||||
|
translitChars.put("ƭ", "t");
|
||||||
|
translitChars.put("ḯ", "i");
|
||||||
|
translitChars.put("ǽ", "ae");
|
||||||
|
translitChars.put("ⱱ", "v");
|
||||||
|
translitChars.put("ɶ", "oe");
|
||||||
|
translitChars.put("ṃ", "m");
|
||||||
|
translitChars.put("ż", "z");
|
||||||
|
translitChars.put("ĕ", "e");
|
||||||
|
translitChars.put("ꜻ", "av");
|
||||||
|
translitChars.put("ở", "o");
|
||||||
|
translitChars.put("ễ", "e");
|
||||||
|
translitChars.put("ɬ", "l");
|
||||||
|
translitChars.put("ị", "i");
|
||||||
|
translitChars.put("ᵭ", "d");
|
||||||
|
translitChars.put("st", "st");
|
||||||
|
translitChars.put("ḷ", "l");
|
||||||
|
translitChars.put("ŕ", "r");
|
||||||
|
translitChars.put("ᴕ", "ou");
|
||||||
|
translitChars.put("ʈ", "t");
|
||||||
|
translitChars.put("ā", "a");
|
||||||
|
translitChars.put("э", "e");
|
||||||
|
translitChars.put("ḙ", "e");
|
||||||
|
translitChars.put("ᴑ", "o");
|
||||||
|
translitChars.put("ç", "c");
|
||||||
|
translitChars.put("ᶊ", "s");
|
||||||
|
translitChars.put("ặ", "a");
|
||||||
|
translitChars.put("ų", "u");
|
||||||
|
translitChars.put("ả", "a");
|
||||||
|
translitChars.put("ǥ", "g");
|
||||||
|
translitChars.put("р", "r");
|
||||||
|
translitChars.put("ꝁ", "k");
|
||||||
|
translitChars.put("ẕ", "z");
|
||||||
|
translitChars.put("ŝ", "s");
|
||||||
|
translitChars.put("ḕ", "e");
|
||||||
|
translitChars.put("ɠ", "g");
|
||||||
|
translitChars.put("ꝉ", "l");
|
||||||
|
translitChars.put("ꝼ", "f");
|
||||||
|
translitChars.put("ᶍ", "x");
|
||||||
|
translitChars.put("х", "h");
|
||||||
|
translitChars.put("ǒ", "o");
|
||||||
|
translitChars.put("ę", "e");
|
||||||
|
translitChars.put("ổ", "o");
|
||||||
|
translitChars.put("ƫ", "t");
|
||||||
|
translitChars.put("ǫ", "o");
|
||||||
|
translitChars.put("i̇", "i");
|
||||||
|
translitChars.put("ṇ", "n");
|
||||||
|
translitChars.put("ć", "c");
|
||||||
|
translitChars.put("ᵷ", "g");
|
||||||
|
translitChars.put("ẅ", "w");
|
||||||
|
translitChars.put("ḑ", "d");
|
||||||
|
translitChars.put("ḹ", "l");
|
||||||
|
translitChars.put("ч", "ch");
|
||||||
|
translitChars.put("œ", "oe");
|
||||||
|
translitChars.put("ᵳ", "r");
|
||||||
|
translitChars.put("ļ", "l");
|
||||||
|
translitChars.put("ȑ", "r");
|
||||||
|
translitChars.put("ȭ", "o");
|
||||||
|
translitChars.put("ᵰ", "n");
|
||||||
|
translitChars.put("ᴁ", "ae");
|
||||||
|
translitChars.put("ŀ", "l");
|
||||||
|
translitChars.put("ä", "a");
|
||||||
|
translitChars.put("ƥ", "p");
|
||||||
|
translitChars.put("ỏ", "o");
|
||||||
|
translitChars.put("į", "i");
|
||||||
|
translitChars.put("ȓ", "r");
|
||||||
|
translitChars.put("dž", "dz");
|
||||||
|
translitChars.put("ḡ", "g");
|
||||||
|
translitChars.put("ṻ", "u");
|
||||||
|
translitChars.put("ō", "o");
|
||||||
|
translitChars.put("ľ", "l");
|
||||||
|
translitChars.put("ẃ", "w");
|
||||||
|
translitChars.put("ț", "t");
|
||||||
|
translitChars.put("ń", "n");
|
||||||
|
translitChars.put("ɍ", "r");
|
||||||
|
translitChars.put("ȃ", "a");
|
||||||
|
translitChars.put("ü", "u");
|
||||||
|
translitChars.put("ꞁ", "l");
|
||||||
|
translitChars.put("ᴐ", "o");
|
||||||
|
translitChars.put("ớ", "o");
|
||||||
|
translitChars.put("ᴃ", "b");
|
||||||
|
translitChars.put("ɹ", "r");
|
||||||
|
translitChars.put("ᵲ", "r");
|
||||||
|
translitChars.put("ʏ", "y");
|
||||||
|
translitChars.put("ᵮ", "f");
|
||||||
|
translitChars.put("ⱨ", "h");
|
||||||
|
translitChars.put("ŏ", "o");
|
||||||
|
translitChars.put("ú", "u");
|
||||||
|
translitChars.put("ṛ", "r");
|
||||||
|
translitChars.put("ʮ", "h");
|
||||||
|
translitChars.put("ó", "o");
|
||||||
|
translitChars.put("ů", "u");
|
||||||
|
translitChars.put("ỡ", "o");
|
||||||
|
translitChars.put("ṕ", "p");
|
||||||
|
translitChars.put("ᶖ", "i");
|
||||||
|
translitChars.put("ự", "u");
|
||||||
|
translitChars.put("ã", "a");
|
||||||
|
translitChars.put("ᵢ", "i");
|
||||||
|
translitChars.put("ṱ", "t");
|
||||||
|
translitChars.put("ể", "e");
|
||||||
|
translitChars.put("ử", "u");
|
||||||
|
translitChars.put("í", "i");
|
||||||
|
translitChars.put("ɔ", "o");
|
||||||
|
translitChars.put("с", "s");
|
||||||
|
translitChars.put("й", "i");
|
||||||
|
translitChars.put("ɺ", "r");
|
||||||
|
translitChars.put("ɢ", "g");
|
||||||
|
translitChars.put("ř", "r");
|
||||||
|
translitChars.put("ẖ", "h");
|
||||||
|
translitChars.put("ű", "u");
|
||||||
|
translitChars.put("ȍ", "o");
|
||||||
|
translitChars.put("ш", "sh");
|
||||||
|
translitChars.put("ḻ", "l");
|
||||||
|
translitChars.put("ḣ", "h");
|
||||||
|
translitChars.put("ȶ", "t");
|
||||||
|
translitChars.put("ņ", "n");
|
||||||
|
translitChars.put("ᶒ", "e");
|
||||||
|
translitChars.put("ì", "i");
|
||||||
|
translitChars.put("ẉ", "w");
|
||||||
|
translitChars.put("б", "b");
|
||||||
|
translitChars.put("ē", "e");
|
||||||
|
translitChars.put("ᴇ", "e");
|
||||||
|
translitChars.put("ł", "l");
|
||||||
|
translitChars.put("ộ", "o");
|
||||||
|
translitChars.put("ɭ", "l");
|
||||||
|
translitChars.put("ẏ", "y");
|
||||||
|
translitChars.put("ᴊ", "j");
|
||||||
|
translitChars.put("ḱ", "k");
|
||||||
|
translitChars.put("ṿ", "v");
|
||||||
|
translitChars.put("ȩ", "e");
|
||||||
|
translitChars.put("â", "a");
|
||||||
|
translitChars.put("ş", "s");
|
||||||
|
translitChars.put("ŗ", "r");
|
||||||
|
translitChars.put("ʋ", "v");
|
||||||
|
translitChars.put("ₐ", "a");
|
||||||
|
translitChars.put("ↄ", "c");
|
||||||
|
translitChars.put("ᶓ", "e");
|
||||||
|
translitChars.put("ɰ", "m");
|
||||||
|
translitChars.put("е", "e");
|
||||||
|
translitChars.put("ᴡ", "w");
|
||||||
|
translitChars.put("ȏ", "o");
|
||||||
|
translitChars.put("č", "c");
|
||||||
|
translitChars.put("ǵ", "g");
|
||||||
|
translitChars.put("ĉ", "c");
|
||||||
|
translitChars.put("ю", "yu");
|
||||||
|
translitChars.put("ᶗ", "o");
|
||||||
|
translitChars.put("ꝃ", "k");
|
||||||
|
translitChars.put("ꝙ", "q");
|
||||||
|
translitChars.put("г", "g");
|
||||||
|
translitChars.put("ṑ", "o");
|
||||||
|
translitChars.put("ꜱ", "s");
|
||||||
|
translitChars.put("ṓ", "o");
|
||||||
|
translitChars.put("ȟ", "h");
|
||||||
|
translitChars.put("ő", "o");
|
||||||
|
translitChars.put("ꜩ", "tz");
|
||||||
|
translitChars.put("ẻ", "e");
|
||||||
|
translitChars.put("о", "o");
|
||||||
|
}
|
||||||
|
StringBuilder dst = new StringBuilder(src.length());
|
||||||
|
int len = src.length();
|
||||||
|
for (int a = 0; a < len; a++) {
|
||||||
|
String ch = src.substring(a, a + 1);
|
||||||
|
String tch = translitChars.get(ch);
|
||||||
|
if (tch != null) {
|
||||||
|
dst.append(tch);
|
||||||
|
} else {
|
||||||
|
dst.append(ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dst.toString();
|
||||||
|
}
|
||||||
|
|
||||||
abstract public static class PluralRules {
|
abstract public static class PluralRules {
|
||||||
abstract int quantityForNumber(int n);
|
abstract int quantityForNumber(int n);
|
||||||
|
@ -14,7 +14,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static library version of {@link android.util.LruCache}. Used to write apps
|
* Static library version of {@link android.util.LruCache}. Used to write apps
|
||||||
@ -41,8 +40,8 @@ public class LruCache {
|
|||||||
throw new IllegalArgumentException("maxSize <= 0");
|
throw new IllegalArgumentException("maxSize <= 0");
|
||||||
}
|
}
|
||||||
this.maxSize = maxSize;
|
this.maxSize = maxSize;
|
||||||
this.map = new LinkedHashMap<String, BitmapDrawable>(0, 0.75f, true);
|
this.map = new LinkedHashMap<>(0, 0.75f, true);
|
||||||
this.mapFilters = new LinkedHashMap<String, ArrayList<String>>();
|
this.mapFilters = new LinkedHashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,7 +68,7 @@ public class LruCache {
|
|||||||
public ArrayList<String> getFilterKeys(String key) {
|
public ArrayList<String> getFilterKeys(String key) {
|
||||||
ArrayList<String> arr = mapFilters.get(key);
|
ArrayList<String> arr = mapFilters.get(key);
|
||||||
if (arr != null) {
|
if (arr != null) {
|
||||||
return new ArrayList<String>(arr);
|
return new ArrayList<>(arr);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -98,14 +97,17 @@ public class LruCache {
|
|||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
ArrayList<String> arr = mapFilters.get(args[0]);
|
ArrayList<String> arr = mapFilters.get(args[0]);
|
||||||
if (arr == null) {
|
if (arr == null) {
|
||||||
arr = new ArrayList<String>();
|
arr = new ArrayList<>();
|
||||||
mapFilters.put(args[0], arr);
|
mapFilters.put(args[0], arr);
|
||||||
}
|
}
|
||||||
arr.add(args[1]);
|
if (!arr.contains(args[1])) {
|
||||||
|
arr.add(args[1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (previous != null) {
|
if (previous != null) {
|
||||||
entryRemoved(false, key, previous, value);
|
entryRemoved(false, key, previous, value);
|
||||||
|
ImageLoader.getInstance().callGC();
|
||||||
}
|
}
|
||||||
|
|
||||||
trimToSize(maxSize, key);
|
trimToSize(maxSize, key);
|
||||||
@ -137,15 +139,16 @@ public class LruCache {
|
|||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
ArrayList<String> arr = mapFilters.get(args[0]);
|
ArrayList<String> arr = mapFilters.get(args[0]);
|
||||||
if (arr != null) {
|
if (arr != null) {
|
||||||
arr.remove(key);
|
arr.remove(args[1]);
|
||||||
if (arr.isEmpty()) {
|
if (arr.isEmpty()) {
|
||||||
mapFilters.remove(args[1]);
|
mapFilters.remove(args[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
entryRemoved(true, key, value, null);
|
entryRemoved(true, key, value, null);
|
||||||
}
|
}
|
||||||
|
ImageLoader.getInstance().callGC();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,14 +175,15 @@ public class LruCache {
|
|||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
ArrayList<String> arr = mapFilters.get(args[0]);
|
ArrayList<String> arr = mapFilters.get(args[0]);
|
||||||
if (arr != null) {
|
if (arr != null) {
|
||||||
arr.remove(key);
|
arr.remove(args[1]);
|
||||||
if (arr.isEmpty()) {
|
if (arr.isEmpty()) {
|
||||||
mapFilters.remove(args[1]);
|
mapFilters.remove(args[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
entryRemoved(false, key, previous, null);
|
entryRemoved(false, key, previous, null);
|
||||||
|
ImageLoader.getInstance().callGC();
|
||||||
}
|
}
|
||||||
|
|
||||||
return previous;
|
return previous;
|
||||||
|
@ -122,6 +122,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
public String bucketName;
|
public String bucketName;
|
||||||
public PhotoEntry coverPhoto;
|
public PhotoEntry coverPhoto;
|
||||||
public ArrayList<PhotoEntry> photos = new ArrayList<>();
|
public ArrayList<PhotoEntry> photos = new ArrayList<>();
|
||||||
|
public HashMap<Integer, PhotoEntry> photosByIds = new HashMap<>();
|
||||||
|
|
||||||
public AlbumEntry(int bucketId, String bucketName, PhotoEntry coverPhoto) {
|
public AlbumEntry(int bucketId, String bucketName, PhotoEntry coverPhoto) {
|
||||||
this.bucketId = bucketId;
|
this.bucketId = bucketId;
|
||||||
@ -131,6 +132,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
|
|
||||||
public void addPhoto(PhotoEntry photoEntry) {
|
public void addPhoto(PhotoEntry photoEntry) {
|
||||||
photos.add(photoEntry);
|
photos.add(photoEntry);
|
||||||
|
photosByIds.put(photoEntry.imageId, photoEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,6 +142,8 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
public long dateTaken;
|
public long dateTaken;
|
||||||
public String path;
|
public String path;
|
||||||
public int orientation;
|
public int orientation;
|
||||||
|
public String thumbPath;
|
||||||
|
public String imagePath;
|
||||||
|
|
||||||
public PhotoEntry(int bucketId, int imageId, long dateTaken, String path, int orientation) {
|
public PhotoEntry(int bucketId, int imageId, long dateTaken, String path, int orientation) {
|
||||||
this.bucketId = bucketId;
|
this.bucketId = bucketId;
|
||||||
@ -1095,11 +1099,11 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSensorChanged(SensorEvent event) {
|
public void onSensorChanged(SensorEvent event) {
|
||||||
if (audioTrackPlayer == null && audioPlayer == null || isPaused || (useFrontSpeaker == (event.values[0] == 0))) {
|
if (proximitySensor != null && audioTrackPlayer == null && audioPlayer == null || isPaused || (useFrontSpeaker == (event.values[0] < proximitySensor.getMaximumRange() / 10))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ignoreProximity = true;
|
ignoreProximity = true;
|
||||||
useFrontSpeaker = event.values[0] == 0;
|
useFrontSpeaker = event.values[0] < proximitySensor.getMaximumRange() / 10;
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioRouteChanged, useFrontSpeaker);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioRouteChanged, useFrontSpeaker);
|
||||||
MessageObject currentMessageObject = playingMessageObject;
|
MessageObject currentMessageObject = playingMessageObject;
|
||||||
float progress = playingMessageObject.audioProgress;
|
float progress = playingMessageObject.audioProgress;
|
||||||
@ -2450,11 +2454,15 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
decoder.start();
|
decoder.start();
|
||||||
|
|
||||||
final int TIMEOUT_USEC = 2500;
|
final int TIMEOUT_USEC = 2500;
|
||||||
ByteBuffer[] decoderInputBuffers = decoder.getInputBuffers();
|
ByteBuffer[] decoderInputBuffers = null;
|
||||||
ByteBuffer[] encoderOutputBuffers = encoder.getOutputBuffers();
|
ByteBuffer[] encoderOutputBuffers = null;
|
||||||
ByteBuffer[] encoderInputBuffers = null;
|
ByteBuffer[] encoderInputBuffers = null;
|
||||||
if (Build.VERSION.SDK_INT < 18) {
|
if (Build.VERSION.SDK_INT < 21) {
|
||||||
encoderInputBuffers = encoder.getInputBuffers();
|
decoderInputBuffers = decoder.getInputBuffers();
|
||||||
|
encoderOutputBuffers = encoder.getOutputBuffers();
|
||||||
|
if (Build.VERSION.SDK_INT < 18) {
|
||||||
|
encoderInputBuffers = encoder.getInputBuffers();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkConversionCanceled();
|
checkConversionCanceled();
|
||||||
@ -2467,7 +2475,12 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
if (index == videoIndex) {
|
if (index == videoIndex) {
|
||||||
int inputBufIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC);
|
int inputBufIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC);
|
||||||
if (inputBufIndex >= 0) {
|
if (inputBufIndex >= 0) {
|
||||||
ByteBuffer inputBuf = decoderInputBuffers[inputBufIndex];
|
ByteBuffer inputBuf = null;
|
||||||
|
if (Build.VERSION.SDK_INT < 21) {
|
||||||
|
inputBuf = decoderInputBuffers[inputBufIndex];
|
||||||
|
} else {
|
||||||
|
inputBuf = decoder.getInputBuffer(inputBufIndex);
|
||||||
|
}
|
||||||
int chunkSize = extractor.readSampleData(inputBuf, 0);
|
int chunkSize = extractor.readSampleData(inputBuf, 0);
|
||||||
if (chunkSize < 0) {
|
if (chunkSize < 0) {
|
||||||
decoder.queueInputBuffer(inputBufIndex, 0, 0, 0L, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
|
decoder.queueInputBuffer(inputBufIndex, 0, 0, 0L, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
|
||||||
@ -2497,7 +2510,9 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
|
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
|
||||||
encoderOutputAvailable = false;
|
encoderOutputAvailable = false;
|
||||||
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
|
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
|
||||||
encoderOutputBuffers = encoder.getOutputBuffers();
|
if (Build.VERSION.SDK_INT < 21) {
|
||||||
|
encoderOutputBuffers = encoder.getOutputBuffers();
|
||||||
|
}
|
||||||
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
|
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
|
||||||
MediaFormat newFormat = encoder.getOutputFormat();
|
MediaFormat newFormat = encoder.getOutputFormat();
|
||||||
if (videoTrackIndex == -5) {
|
if (videoTrackIndex == -5) {
|
||||||
@ -2506,7 +2521,12 @@ public class MediaController implements NotificationCenter.NotificationCenterDel
|
|||||||
} else if (encoderStatus < 0) {
|
} else if (encoderStatus < 0) {
|
||||||
throw new RuntimeException("unexpected result from encoder.dequeueOutputBuffer: " + encoderStatus);
|
throw new RuntimeException("unexpected result from encoder.dequeueOutputBuffer: " + encoderStatus);
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
|
ByteBuffer encodedData = null;
|
||||||
|
if (Build.VERSION.SDK_INT < 21) {
|
||||||
|
encodedData = encoderOutputBuffers[encoderStatus];
|
||||||
|
} else {
|
||||||
|
encodedData = encoder.getOutputBuffer(encoderStatus);
|
||||||
|
}
|
||||||
if (encodedData == null) {
|
if (encodedData == null) {
|
||||||
throw new RuntimeException("encoderOutputBuffer " + encoderStatus + " was null");
|
throw new RuntimeException("encoderOutputBuffer " + encoderStatus + " was null");
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
package org.telegram.android;
|
package org.telegram.android;
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.text.Layout;
|
import android.text.Layout;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
@ -42,12 +41,11 @@ public class MessageObject {
|
|||||||
public CharSequence messageText;
|
public CharSequence messageText;
|
||||||
public int type;
|
public int type;
|
||||||
public int contentType;
|
public int contentType;
|
||||||
public ArrayList<PhotoObject> photoThumbs;
|
|
||||||
public Bitmap imagePreview;
|
|
||||||
public String dateKey;
|
public String dateKey;
|
||||||
public boolean deleted = false;
|
public boolean deleted = false;
|
||||||
public float audioProgress;
|
public float audioProgress;
|
||||||
public int audioProgressSec;
|
public int audioProgressSec;
|
||||||
|
public ArrayList<TLRPC.PhotoSize> photoThumbs;
|
||||||
|
|
||||||
private static TextPaint textPaint;
|
private static TextPaint textPaint;
|
||||||
public int lastLineWidth;
|
public int lastLineWidth;
|
||||||
@ -66,11 +64,7 @@ public class MessageObject {
|
|||||||
|
|
||||||
public ArrayList<TextLayoutBlock> textLayoutBlocks;
|
public ArrayList<TextLayoutBlock> textLayoutBlocks;
|
||||||
|
|
||||||
public MessageObject(TLRPC.Message message, AbstractMap<Integer, TLRPC.User> users) {
|
public MessageObject(TLRPC.Message message, AbstractMap<Integer, TLRPC.User> users, boolean generateLayout) {
|
||||||
this(message, users, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MessageObject(TLRPC.Message message, AbstractMap<Integer, TLRPC.User> users, int preview) {
|
|
||||||
if (textPaint == null) {
|
if (textPaint == null) {
|
||||||
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
|
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
|
||||||
textPaint.setColor(0xff000000);
|
textPaint.setColor(0xff000000);
|
||||||
@ -319,6 +313,9 @@ public class MessageObject {
|
|||||||
type = 8;
|
type = 8;
|
||||||
} else if (message.media.document.mime_type.equals("image/webp") && isSticker()) {
|
} else if (message.media.document.mime_type.equals("image/webp") && isSticker()) {
|
||||||
type = 13;
|
type = 13;
|
||||||
|
if (messageOwner.media.document.thumb != null && messageOwner.media.document.thumb.location != null) {
|
||||||
|
messageOwner.media.document.thumb.location.ext = "webp";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
type = 9;
|
type = 9;
|
||||||
}
|
}
|
||||||
@ -355,37 +352,25 @@ public class MessageObject {
|
|||||||
int dateMonth = rightNow.get(Calendar.MONTH);
|
int dateMonth = rightNow.get(Calendar.MONTH);
|
||||||
dateKey = String.format("%d_%02d_%02d", dateYear, dateMonth, dateDay);
|
dateKey = String.format("%d_%02d_%02d", dateYear, dateMonth, dateDay);
|
||||||
|
|
||||||
if (preview != 0) {
|
if (generateLayout) {
|
||||||
generateLayout();
|
generateLayout();
|
||||||
}
|
}
|
||||||
generateThumbs(false, preview);
|
generateThumbs(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharSequence replaceWithLink(CharSequence source, String param, TLRPC.User user) {
|
public void generateThumbs(boolean update) {
|
||||||
String name = ContactsController.formatName(user.first_name, user.last_name);
|
|
||||||
int start = TextUtils.indexOf(source, param);
|
|
||||||
URLSpanNoUnderline span = new URLSpanNoUnderline("" + user.id);
|
|
||||||
SpannableStringBuilder builder = new SpannableStringBuilder(TextUtils.replace(source, new String[]{param}, new String[]{name}));
|
|
||||||
builder.setSpan(span, start, start + name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void generateThumbs(boolean update, int preview) {
|
|
||||||
if (messageOwner instanceof TLRPC.TL_messageService) {
|
if (messageOwner instanceof TLRPC.TL_messageService) {
|
||||||
if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto) {
|
if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto) {
|
||||||
if (!update) {
|
if (!update) {
|
||||||
photoThumbs = new ArrayList<>();
|
photoThumbs = new ArrayList<>(messageOwner.action.photo.sizes);
|
||||||
for (TLRPC.PhotoSize size : messageOwner.action.photo.sizes) {
|
|
||||||
photoThumbs.add(new PhotoObject(size, preview, isSecretMedia()));
|
|
||||||
}
|
|
||||||
} else if (photoThumbs != null && !photoThumbs.isEmpty()) {
|
} else if (photoThumbs != null && !photoThumbs.isEmpty()) {
|
||||||
for (PhotoObject photoObject : photoThumbs) {
|
for (TLRPC.PhotoSize photoObject : photoThumbs) {
|
||||||
for (TLRPC.PhotoSize size : messageOwner.action.photo.sizes) {
|
for (TLRPC.PhotoSize size : messageOwner.action.photo.sizes) {
|
||||||
if (size instanceof TLRPC.TL_photoSizeEmpty) {
|
if (size instanceof TLRPC.TL_photoSizeEmpty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (size.type.equals(photoObject.photoOwner.type)) {
|
if (size.type.equals(photoObject.type)) {
|
||||||
photoObject.photoOwner.location = size.location;
|
photoObject.location = size.location;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -395,22 +380,15 @@ public class MessageObject {
|
|||||||
} else if (messageOwner.media != null && !(messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) {
|
} else if (messageOwner.media != null && !(messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) {
|
||||||
if (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
|
if (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
|
||||||
if (!update) {
|
if (!update) {
|
||||||
photoThumbs = new ArrayList<>();
|
photoThumbs = new ArrayList<>(messageOwner.media.photo.sizes);
|
||||||
for (TLRPC.PhotoSize size : messageOwner.media.photo.sizes) {
|
|
||||||
PhotoObject obj = new PhotoObject(size, preview, isSecretMedia());
|
|
||||||
photoThumbs.add(obj);
|
|
||||||
if (imagePreview == null && obj.image != null) {
|
|
||||||
imagePreview = obj.image;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (photoThumbs != null && !photoThumbs.isEmpty()) {
|
} else if (photoThumbs != null && !photoThumbs.isEmpty()) {
|
||||||
for (PhotoObject photoObject : photoThumbs) {
|
for (TLRPC.PhotoSize photoObject : photoThumbs) {
|
||||||
for (TLRPC.PhotoSize size : messageOwner.media.photo.sizes) {
|
for (TLRPC.PhotoSize size : messageOwner.media.photo.sizes) {
|
||||||
if (size instanceof TLRPC.TL_photoSizeEmpty) {
|
if (size instanceof TLRPC.TL_photoSizeEmpty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (size.type.equals(photoObject.photoOwner.type)) {
|
if (size.type.equals(photoObject.type)) {
|
||||||
photoObject.photoOwner.location = size.location;
|
photoObject.location = size.location;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -419,36 +397,34 @@ public class MessageObject {
|
|||||||
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
||||||
if (!update) {
|
if (!update) {
|
||||||
photoThumbs = new ArrayList<>();
|
photoThumbs = new ArrayList<>();
|
||||||
PhotoObject obj = new PhotoObject(messageOwner.media.video.thumb, preview, isSecretMedia());
|
photoThumbs.add(messageOwner.media.video.thumb);
|
||||||
photoThumbs.add(obj);
|
|
||||||
if (imagePreview == null && obj.image != null) {
|
|
||||||
imagePreview = obj.image;
|
|
||||||
}
|
|
||||||
} else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.video.thumb != null) {
|
} else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.video.thumb != null) {
|
||||||
PhotoObject photoObject = photoThumbs.get(0);
|
TLRPC.PhotoSize photoObject = photoThumbs.get(0);
|
||||||
photoObject.photoOwner.location = messageOwner.media.video.thumb.location;
|
photoObject.location = messageOwner.media.video.thumb.location;
|
||||||
}
|
}
|
||||||
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
|
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
|
||||||
if (!(messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty)) {
|
if (!(messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty)) {
|
||||||
if (!update) {
|
if (!update) {
|
||||||
photoThumbs = new ArrayList<>();
|
photoThumbs = new ArrayList<>();
|
||||||
if (type == 13) {
|
photoThumbs.add(messageOwner.media.document.thumb);
|
||||||
messageOwner.media.document.thumb.location.ext = "webp";
|
|
||||||
}
|
|
||||||
PhotoObject obj = new PhotoObject(messageOwner.media.document.thumb, preview, isSecretMedia());
|
|
||||||
photoThumbs.add(obj);
|
|
||||||
if (imagePreview == null && obj.image != null) {
|
|
||||||
imagePreview = obj.image;
|
|
||||||
}
|
|
||||||
} else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.document.thumb != null) {
|
} else if (photoThumbs != null && !photoThumbs.isEmpty() && messageOwner.media.document.thumb != null) {
|
||||||
PhotoObject photoObject = photoThumbs.get(0);
|
TLRPC.PhotoSize photoObject = photoThumbs.get(0);
|
||||||
photoObject.photoOwner.location = messageOwner.media.document.thumb.location;
|
photoObject.location = messageOwner.media.document.thumb.location;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CharSequence replaceWithLink(CharSequence source, String param, TLRPC.User user) {
|
||||||
|
String name = ContactsController.formatName(user.first_name, user.last_name);
|
||||||
|
int start = TextUtils.indexOf(source, param);
|
||||||
|
URLSpanNoUnderline span = new URLSpanNoUnderline("" + user.id);
|
||||||
|
SpannableStringBuilder builder = new SpannableStringBuilder(TextUtils.replace(source, new String[]{param}, new String[]{name}));
|
||||||
|
builder.setSpan(span, start, start + name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
public String getFileName() {
|
public String getFileName() {
|
||||||
if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
||||||
return FileLoader.getAttachFileName(messageOwner.media.video);
|
return FileLoader.getAttachFileName(messageOwner.media.video);
|
||||||
@ -468,6 +444,19 @@ public class MessageObject {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFileType() {
|
||||||
|
if (messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
||||||
|
return FileLoader.MEDIA_DIR_VIDEO;
|
||||||
|
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaDocument) {
|
||||||
|
return FileLoader.MEDIA_DIR_DOCUMENT;
|
||||||
|
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaAudio) {
|
||||||
|
return FileLoader.MEDIA_DIR_AUDIO;
|
||||||
|
} else if (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
|
||||||
|
return FileLoader.MEDIA_DIR_IMAGE;
|
||||||
|
}
|
||||||
|
return FileLoader.MEDIA_DIR_CACHE;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean containsUrls(CharSequence message) {
|
private boolean containsUrls(CharSequence message) {
|
||||||
if (message == null || message.length() < 3 || message.length() > 1024 * 20) {
|
if (message == null || message.length() < 3 || message.length() > 1024 * 20) {
|
||||||
return false;
|
return false;
|
||||||
@ -787,9 +776,9 @@ public class MessageObject {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSticker() {
|
public static boolean isStickerMessage(TLRPC.Message message) {
|
||||||
if (messageOwner.media != null && messageOwner.media.document != null) {
|
if (message.media != null && message.media.document != null) {
|
||||||
for (TLRPC.DocumentAttribute attribute : messageOwner.media.document.attributes) {
|
for (TLRPC.DocumentAttribute attribute : message.media.document.attributes) {
|
||||||
if (attribute instanceof TLRPC.TL_documentAttributeSticker) {
|
if (attribute instanceof TLRPC.TL_documentAttributeSticker) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -797,4 +786,8 @@ public class MessageObject {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSticker() {
|
||||||
|
return isStickerMessage(messageOwner);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -314,9 +314,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
sendingTypings.clear();
|
sendingTypings.clear();
|
||||||
loadingFullUsers.clear();
|
loadingFullUsers.clear();
|
||||||
loadedFullUsers.clear();
|
loadedFullUsers.clear();
|
||||||
loadingFullUsers.clear();
|
|
||||||
loadedFullUsers.clear();
|
|
||||||
reloadingMessages.clear();
|
reloadingMessages.clear();
|
||||||
|
loadingFullChats.clear();
|
||||||
|
loadedFullChats.clear();
|
||||||
|
|
||||||
updatesStartWaitTime = 0;
|
updatesStartWaitTime = 0;
|
||||||
currentDeletingTaskTime = 0;
|
currentDeletingTaskTime = 0;
|
||||||
@ -568,6 +568,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
public void run(TLObject response, TLRPC.TL_error error) {
|
public void run(TLObject response, TLRPC.TL_error error) {
|
||||||
if (error == null) {
|
if (error == null) {
|
||||||
TLRPC.messages_Messages messagesRes = (TLRPC.messages_Messages) response;
|
TLRPC.messages_Messages messagesRes = (TLRPC.messages_Messages) response;
|
||||||
|
ImageLoader.saveMessagesThumbs(messagesRes.messages);
|
||||||
MessagesStorage.getInstance().putMessages(messagesRes, dialog_id);
|
MessagesStorage.getInstance().putMessages(messagesRes, dialog_id);
|
||||||
|
|
||||||
final ArrayList<MessageObject> objects = new ArrayList<>();
|
final ArrayList<MessageObject> objects = new ArrayList<>();
|
||||||
@ -578,7 +579,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
for (TLRPC.User u : messagesRes.users) {
|
for (TLRPC.User u : messagesRes.users) {
|
||||||
usersLocal.put(u.id, u);
|
usersLocal.put(u.id, u);
|
||||||
}
|
}
|
||||||
objects.add(new MessageObject(message, usersLocal, 2));
|
objects.add(new MessageObject(message, usersLocal, true));
|
||||||
}
|
}
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@ -898,151 +899,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processLoadedMedia(final TLRPC.messages_Messages res, final long uid, int offset, int count, int max_id, final boolean fromCache, final int classGuid) {
|
|
||||||
int lower_part = (int)uid;
|
|
||||||
if (fromCache && res.messages.isEmpty() && lower_part != 0) {
|
|
||||||
loadMedia(uid, offset, count, max_id, false, classGuid);
|
|
||||||
} else {
|
|
||||||
if (!fromCache) {
|
|
||||||
MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true);
|
|
||||||
MessagesStorage.getInstance().putMedia(uid, res.messages);
|
|
||||||
}
|
|
||||||
|
|
||||||
final HashMap<Integer, TLRPC.User> usersLocal = new HashMap<>();
|
|
||||||
for (TLRPC.User u : res.users) {
|
|
||||||
usersLocal.put(u.id, u);
|
|
||||||
}
|
|
||||||
final ArrayList<MessageObject> objects = new ArrayList<>();
|
|
||||||
for (TLRPC.Message message : res.messages) {
|
|
||||||
objects.add(new MessageObject(message, usersLocal));
|
|
||||||
}
|
|
||||||
|
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
int totalCount;
|
|
||||||
if (res instanceof TLRPC.TL_messages_messagesSlice) {
|
|
||||||
totalCount = res.count;
|
|
||||||
} else {
|
|
||||||
totalCount = res.messages.size();
|
|
||||||
}
|
|
||||||
putUsers(res.users, fromCache);
|
|
||||||
for (TLRPC.Chat chat : res.chats) {
|
|
||||||
putChat(chat, fromCache);
|
|
||||||
}
|
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.mediaDidLoaded, uid, totalCount, objects, fromCache, classGuid);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadMedia(final long uid, final int offset, final int count, final int max_id, final boolean fromCache, final int classGuid) {
|
|
||||||
int lower_part = (int)uid;
|
|
||||||
if (fromCache || lower_part == 0) {
|
|
||||||
MessagesStorage.getInstance().loadMedia(uid, offset, count, max_id, classGuid);
|
|
||||||
} else {
|
|
||||||
TLRPC.TL_messages_search req = new TLRPC.TL_messages_search();
|
|
||||||
req.offset = offset;
|
|
||||||
req.limit = count;
|
|
||||||
req.max_id = max_id;
|
|
||||||
req.filter = new TLRPC.TL_inputMessagesFilterPhotoVideo();
|
|
||||||
req.q = "";
|
|
||||||
if (uid < 0) {
|
|
||||||
req.peer = new TLRPC.TL_inputPeerChat();
|
|
||||||
req.peer.chat_id = -lower_part;
|
|
||||||
} else {
|
|
||||||
TLRPC.User user = getUser(lower_part);
|
|
||||||
if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) {
|
|
||||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
|
||||||
req.peer.access_hash = user.access_hash;
|
|
||||||
} else {
|
|
||||||
req.peer = new TLRPC.TL_inputPeerContact();
|
|
||||||
}
|
|
||||||
req.peer.user_id = lower_part;
|
|
||||||
}
|
|
||||||
long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
|
||||||
@Override
|
|
||||||
public void run(TLObject response, TLRPC.TL_error error) {
|
|
||||||
if (error == null) {
|
|
||||||
final TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
|
|
||||||
processLoadedMedia(res, uid, offset, count, max_id, false, classGuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void processLoadedMediaCount(final int count, final long uid, final int classGuid, final boolean fromCache) {
|
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
int lower_part = (int)uid;
|
|
||||||
if (fromCache && count == -1 && lower_part != 0) {
|
|
||||||
getMediaCount(uid, classGuid, false);
|
|
||||||
} else {
|
|
||||||
if (!fromCache) {
|
|
||||||
MessagesStorage.getInstance().putMediaCount(uid, count);
|
|
||||||
}
|
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.mediaCountDidLoaded, uid, (fromCache && count == -1 ? 0 : count), fromCache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getMediaCount(final long uid, final int classGuid, boolean fromCache) {
|
|
||||||
int lower_part = (int)uid;
|
|
||||||
if (fromCache || lower_part == 0) {
|
|
||||||
MessagesStorage.getInstance().getMediaCount(uid, classGuid);
|
|
||||||
} else {
|
|
||||||
TLRPC.TL_messages_search req = new TLRPC.TL_messages_search();
|
|
||||||
req.offset = 0;
|
|
||||||
req.limit = 1;
|
|
||||||
req.max_id = 0;
|
|
||||||
req.filter = new TLRPC.TL_inputMessagesFilterPhotoVideo();
|
|
||||||
req.q = "";
|
|
||||||
if (uid < 0) {
|
|
||||||
req.peer = new TLRPC.TL_inputPeerChat();
|
|
||||||
req.peer.chat_id = -lower_part;
|
|
||||||
} else {
|
|
||||||
TLRPC.User user = getUser(lower_part);
|
|
||||||
if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) {
|
|
||||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
|
||||||
req.peer.access_hash = user.access_hash;
|
|
||||||
} else {
|
|
||||||
req.peer = new TLRPC.TL_inputPeerContact();
|
|
||||||
}
|
|
||||||
req.peer.user_id = lower_part;
|
|
||||||
}
|
|
||||||
long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
|
||||||
@Override
|
|
||||||
public void run(TLObject response, TLRPC.TL_error error) {
|
|
||||||
if (error == null) {
|
|
||||||
final TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
|
|
||||||
MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true);
|
|
||||||
|
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
putUsers(res.users, false);
|
|
||||||
for (TLRPC.Chat chat : res.chats) {
|
|
||||||
putChat(chat, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (res instanceof TLRPC.TL_messages_messagesSlice) {
|
|
||||||
processLoadedMediaCount(res.count, uid, classGuid, false);
|
|
||||||
} else {
|
|
||||||
processLoadedMediaCount(res.messages.size(), uid, classGuid, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void uploadAndApplyUserAvatar(TLRPC.PhotoSize bigPhoto) {
|
public void uploadAndApplyUserAvatar(TLRPC.PhotoSize bigPhoto) {
|
||||||
if (bigPhoto != null) {
|
if (bigPhoto != null) {
|
||||||
uploadingAvatar = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + bigPhoto.location.volume_id + "_" + bigPhoto.location.local_id + ".jpg";
|
uploadingAvatar = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + bigPhoto.location.volume_id + "_" + bigPhoto.location.local_id + ".jpg";
|
||||||
@ -1470,6 +1326,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
public void run() {
|
public void run() {
|
||||||
int lower_id = (int)dialog_id;
|
int lower_id = (int)dialog_id;
|
||||||
int high_id = (int)(dialog_id >> 32);
|
int high_id = (int)(dialog_id >> 32);
|
||||||
|
if (!isCache) {
|
||||||
|
ImageLoader.saveMessagesThumbs(messagesRes.messages);
|
||||||
|
}
|
||||||
if (!isCache && allowCache) {
|
if (!isCache && allowCache) {
|
||||||
MessagesStorage.getInstance().putMessages(messagesRes, dialog_id);
|
MessagesStorage.getInstance().putMessages(messagesRes, dialog_id);
|
||||||
}
|
}
|
||||||
@ -1490,7 +1349,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
ArrayList<Integer> messagesToReload = null;
|
ArrayList<Integer> messagesToReload = null;
|
||||||
for (TLRPC.Message message : messagesRes.messages) {
|
for (TLRPC.Message message : messagesRes.messages) {
|
||||||
message.dialog_id = dialog_id;
|
message.dialog_id = dialog_id;
|
||||||
objects.add(new MessageObject(message, usersLocal, 2));
|
objects.add(new MessageObject(message, usersLocal, true));
|
||||||
if (isCache && message.media instanceof TLRPC.TL_messageMediaUnsupported) {
|
if (isCache && message.media instanceof TLRPC.TL_messageMediaUnsupported) {
|
||||||
if (message.media.bytes.length == 0 || message.media.bytes.length == 1 && message.media.bytes[0] < TLRPC.LAYER) {
|
if (message.media.bytes.length == 0 || message.media.bytes.length == 1 && message.media.bytes[0] < TLRPC.LAYER) {
|
||||||
if (messagesToReload == null) {
|
if (messagesToReload == null) {
|
||||||
@ -1553,7 +1412,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
dialog_id = -dialog.peer.chat_id;
|
dialog_id = -dialog.peer.chat_id;
|
||||||
}
|
}
|
||||||
if (dialog.notify_settings.mute_until != 0) {
|
if (dialog.notify_settings.mute_until != 0) {
|
||||||
editor.putInt("notify2_" + dialog_id, 2);
|
if (dialog.notify_settings.mute_until > ConnectionsManager.getInstance().getCurrentTime() + 60 * 60 * 24 * 365) {
|
||||||
|
editor.putInt("notify2_" + dialog_id, 2);
|
||||||
|
dialog.notify_settings.mute_until = Integer.MAX_VALUE;
|
||||||
|
} else {
|
||||||
|
editor.putInt("notify2_" + dialog_id, 3);
|
||||||
|
editor.putInt("notifyuntil_" + dialog_id, dialog.notify_settings.mute_until);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1592,7 +1457,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (TLRPC.Message m : dialogsRes.messages) {
|
for (TLRPC.Message m : dialogsRes.messages) {
|
||||||
new_dialogMessage.put(m.id, new MessageObject(m, usersLocal, 0));
|
new_dialogMessage.put(m.id, new MessageObject(m, usersLocal, false));
|
||||||
}
|
}
|
||||||
for (TLRPC.TL_dialog d : dialogsRes.dialogs) {
|
for (TLRPC.TL_dialog d : dialogsRes.dialogs) {
|
||||||
if (d.last_message_date == 0) {
|
if (d.last_message_date == 0) {
|
||||||
@ -1701,6 +1566,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
int new_totalDialogsCount;
|
int new_totalDialogsCount;
|
||||||
|
|
||||||
if (!isCache) {
|
if (!isCache) {
|
||||||
|
ImageLoader.saveMessagesThumbs(dialogsRes.messages);
|
||||||
MessagesStorage.getInstance().putDialogs(dialogsRes);
|
MessagesStorage.getInstance().putDialogs(dialogsRes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1716,7 +1582,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (TLRPC.Message m : dialogsRes.messages) {
|
for (TLRPC.Message m : dialogsRes.messages) {
|
||||||
new_dialogMessage.put(m.id, new MessageObject(m, usersLocal, 0));
|
new_dialogMessage.put(m.id, new MessageObject(m, usersLocal, false));
|
||||||
}
|
}
|
||||||
for (TLRPC.TL_dialog d : dialogsRes.dialogs) {
|
for (TLRPC.TL_dialog d : dialogsRes.dialogs) {
|
||||||
if (d.last_message_date == 0) {
|
if (d.last_message_date == 0) {
|
||||||
@ -1990,7 +1856,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
newMsg.date = ConnectionsManager.getInstance().getCurrentTime();
|
newMsg.date = ConnectionsManager.getInstance().getCurrentTime();
|
||||||
newMsg.random_id = 0;
|
newMsg.random_id = 0;
|
||||||
UserConfig.saveConfig(false);
|
UserConfig.saveConfig(false);
|
||||||
MessageObject newMsgObj = new MessageObject(newMsg, users);
|
MessageObject newMsgObj = new MessageObject(newMsg, users, true);
|
||||||
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
|
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
|
||||||
|
|
||||||
ArrayList<MessageObject> objArr = new ArrayList<>();
|
ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||||
@ -2034,7 +1900,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
putUsers(res.users, false);
|
putUsers(res.users, false);
|
||||||
putChats(res.chats, false);
|
putChats(res.chats, false);
|
||||||
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
||||||
messagesObj.add(new MessageObject(res.message, users));
|
messagesObj.add(new MessageObject(res.message, users, true));
|
||||||
TLRPC.Chat chat = res.chats.get(0);
|
TLRPC.Chat chat = res.chats.get(0);
|
||||||
updateInterfaceWithMessages(-chat.id, messagesObj);
|
updateInterfaceWithMessages(-chat.id, messagesObj);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id);
|
||||||
@ -2081,7 +1947,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
putUsers(res.users, false);
|
putUsers(res.users, false);
|
||||||
putChats(res.chats, false);
|
putChats(res.chats, false);
|
||||||
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
||||||
messagesObj.add(new MessageObject(res.message, users));
|
messagesObj.add(new MessageObject(res.message, users, true));
|
||||||
TLRPC.Chat chat = res.chats.get(0);
|
TLRPC.Chat chat = res.chats.get(0);
|
||||||
updateInterfaceWithMessages(-chat.id, messagesObj);
|
updateInterfaceWithMessages(-chat.id, messagesObj);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS);
|
||||||
@ -2163,7 +2029,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
putChats(res.chats, false);
|
putChats(res.chats, false);
|
||||||
if (user.id != UserConfig.getClientUserId()) {
|
if (user.id != UserConfig.getClientUserId()) {
|
||||||
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
||||||
messagesObj.add(new MessageObject(res.message, users));
|
messagesObj.add(new MessageObject(res.message, users, true));
|
||||||
TLRPC.Chat chat = res.chats.get(0);
|
TLRPC.Chat chat = res.chats.get(0);
|
||||||
updateInterfaceWithMessages(-chat.id, messagesObj);
|
updateInterfaceWithMessages(-chat.id, messagesObj);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS);
|
||||||
@ -2247,7 +2113,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
putUsers(res.users, false);
|
putUsers(res.users, false);
|
||||||
putChats(res.chats, false);
|
putChats(res.chats, false);
|
||||||
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
||||||
messagesObj.add(new MessageObject(res.message, users));
|
messagesObj.add(new MessageObject(res.message, users, true));
|
||||||
TLRPC.Chat chat = res.chats.get(0);
|
TLRPC.Chat chat = res.chats.get(0);
|
||||||
updateInterfaceWithMessages(-chat.id, messagesObj);
|
updateInterfaceWithMessages(-chat.id, messagesObj);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
|
||||||
@ -2291,13 +2157,17 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response;
|
final TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response;
|
||||||
MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true);
|
MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true);
|
||||||
|
|
||||||
|
final ArrayList<TLRPC.Message> messages = new ArrayList<>();
|
||||||
|
messages.add(res.message);
|
||||||
|
ImageLoader.saveMessagesThumbs(messages);
|
||||||
|
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
putUsers(res.users, false);
|
putUsers(res.users, false);
|
||||||
putChats(res.chats, false);
|
putChats(res.chats, false);
|
||||||
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
final ArrayList<MessageObject> messagesObj = new ArrayList<>();
|
||||||
messagesObj.add(new MessageObject(res.message, users));
|
messagesObj.add(new MessageObject(res.message, users, true));
|
||||||
TLRPC.Chat chat = res.chats.get(0);
|
TLRPC.Chat chat = res.chats.get(0);
|
||||||
updateInterfaceWithMessages(-chat.id, messagesObj);
|
updateInterfaceWithMessages(-chat.id, messagesObj);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
|
||||||
@ -2305,8 +2175,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
final ArrayList<TLRPC.Message> messages = new ArrayList<>();
|
|
||||||
messages.add(res.message);
|
|
||||||
MessagesStorage.getInstance().putMessages(messages, true, true, false, 0);
|
MessagesStorage.getInstance().putMessages(messages, true, true, false, 0);
|
||||||
processNewDifferenceParams(res.seq, res.pts, -1);
|
processNewDifferenceParams(res.seq, res.pts, -1);
|
||||||
}
|
}
|
||||||
@ -2616,9 +2484,11 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImageLoader.saveMessagesThumbs(res.new_messages);
|
||||||
|
|
||||||
final ArrayList<MessageObject> pushMessages = new ArrayList<>();
|
final ArrayList<MessageObject> pushMessages = new ArrayList<>();
|
||||||
for (TLRPC.Message message : res.new_messages) {
|
for (TLRPC.Message message : res.new_messages) {
|
||||||
MessageObject obj = new MessageObject(message, usersDict, 2);
|
MessageObject obj = new MessageObject(message, usersDict, true);
|
||||||
|
|
||||||
long dialog_id = obj.messageOwner.dialog_id;
|
long dialog_id = obj.messageOwner.dialog_id;
|
||||||
if (dialog_id == 0) {
|
if (dialog_id == 0) {
|
||||||
@ -2763,7 +2633,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
message.media = new TLRPC.TL_messageMediaEmpty();
|
message.media = new TLRPC.TL_messageMediaEmpty();
|
||||||
MessagesStorage.lastSeqValue = updates.seq;
|
MessagesStorage.lastSeqValue = updates.seq;
|
||||||
MessagesStorage.lastPtsValue = updates.pts;
|
MessagesStorage.lastPtsValue = updates.pts;
|
||||||
final MessageObject obj = new MessageObject(message, null);
|
final MessageObject obj = new MessageObject(message, null, true);
|
||||||
final ArrayList<MessageObject> objArr = new ArrayList<>();
|
final ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||||
objArr.add(obj);
|
objArr.add(obj);
|
||||||
ArrayList<TLRPC.Message> arr = new ArrayList<>();
|
ArrayList<TLRPC.Message> arr = new ArrayList<>();
|
||||||
@ -2834,7 +2704,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
MessagesStorage.lastSeqValue = updates.seq;
|
MessagesStorage.lastSeqValue = updates.seq;
|
||||||
MessagesStorage.lastPtsValue = updates.pts;
|
MessagesStorage.lastPtsValue = updates.pts;
|
||||||
MessagesStorage.lastDateValue = updates.date;
|
MessagesStorage.lastDateValue = updates.date;
|
||||||
final MessageObject obj = new MessageObject(message, null);
|
final MessageObject obj = new MessageObject(message, null, true);
|
||||||
final ArrayList<MessageObject> objArr = new ArrayList<>();
|
final ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||||
objArr.add(obj);
|
objArr.add(obj);
|
||||||
ArrayList<TLRPC.Message> arr = new ArrayList<>();
|
ArrayList<TLRPC.Message> arr = new ArrayList<>();
|
||||||
@ -2976,6 +2846,29 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue);
|
MessagesStorage.getInstance().saveDiffParams(MessagesStorage.lastSeqValue, MessagesStorage.lastPtsValue, MessagesStorage.lastDateValue, MessagesStorage.lastQtsValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isNotifySettingsMuted(TLRPC.PeerNotifySettings settings) {
|
||||||
|
return settings instanceof TLRPC.TL_peerNotifySettings && settings.mute_until > ConnectionsManager.getInstance().getCurrentTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDialogMuted(long dialog_id) {
|
||||||
|
TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id);
|
||||||
|
if (dialog != null) {
|
||||||
|
return isNotifySettingsMuted(dialog.notify_settings);
|
||||||
|
} else {
|
||||||
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
|
int mute_type = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (mute_type == 2) {
|
||||||
|
return true;
|
||||||
|
} else if (mute_type == 3) {
|
||||||
|
int mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
if (mute_until >= ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean processUpdateArray(ArrayList<TLRPC.Update> updates, final ArrayList<TLRPC.User> usersArr, final ArrayList<TLRPC.Chat> chatsArr) {
|
public boolean processUpdateArray(ArrayList<TLRPC.Update> updates, final ArrayList<TLRPC.User> usersArr, final ArrayList<TLRPC.Chat> chatsArr) {
|
||||||
if (updates.isEmpty()) {
|
if (updates.isEmpty()) {
|
||||||
return true;
|
return true;
|
||||||
@ -3043,7 +2936,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
messagesArr.add(upd.message);
|
messagesArr.add(upd.message);
|
||||||
MessageObject obj = new MessageObject(upd.message, usersDict, 2);
|
ImageLoader.saveMessageThumbs(upd.message);
|
||||||
|
MessageObject obj = new MessageObject(upd.message, usersDict, true);
|
||||||
if (obj.type == 11) {
|
if (obj.type == 11) {
|
||||||
interfaceUpdateMask |= UPDATE_MASK_CHAT_AVATAR;
|
interfaceUpdateMask |= UPDATE_MASK_CHAT_AVATAR;
|
||||||
} else if (obj.type == 10) {
|
} else if (obj.type == 10) {
|
||||||
@ -3134,7 +3028,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
newMessage.dialog_id = update.user_id;
|
newMessage.dialog_id = update.user_id;
|
||||||
|
|
||||||
messagesArr.add(newMessage);
|
messagesArr.add(newMessage);
|
||||||
MessageObject obj = new MessageObject(newMessage, usersDict);
|
MessageObject obj = new MessageObject(newMessage, usersDict, true);
|
||||||
ArrayList<MessageObject> arr = messages.get(newMessage.dialog_id);
|
ArrayList<MessageObject> arr = messages.get(newMessage.dialog_id);
|
||||||
if (arr == null) {
|
if (arr == null) {
|
||||||
arr = new ArrayList<>();
|
arr = new ArrayList<>();
|
||||||
@ -3178,7 +3072,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
newMessage.dialog_id = 777000;
|
newMessage.dialog_id = 777000;
|
||||||
|
|
||||||
messagesArr.add(newMessage);
|
messagesArr.add(newMessage);
|
||||||
MessageObject obj = new MessageObject(newMessage, usersDict);
|
MessageObject obj = new MessageObject(newMessage, usersDict, true);
|
||||||
ArrayList<MessageObject> arr = messages.get(newMessage.dialog_id);
|
ArrayList<MessageObject> arr = messages.get(newMessage.dialog_id);
|
||||||
if (arr == null) {
|
if (arr == null) {
|
||||||
arr = new ArrayList<>();
|
arr = new ArrayList<>();
|
||||||
@ -3200,8 +3094,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
messages.put(uid, arr);
|
messages.put(uid, arr);
|
||||||
}
|
}
|
||||||
for (TLRPC.Message message : decryptedMessages) {
|
for (TLRPC.Message message : decryptedMessages) {
|
||||||
|
ImageLoader.saveMessageThumbs(message);
|
||||||
messagesArr.add(message);
|
messagesArr.add(message);
|
||||||
MessageObject obj = new MessageObject(message, usersDict, 2);
|
MessageObject obj = new MessageObject(message, usersDict, true);
|
||||||
arr.add(obj);
|
arr.add(obj);
|
||||||
pushMessages.add(obj);
|
pushMessages.add(obj);
|
||||||
}
|
}
|
||||||
@ -3287,7 +3182,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
newMessage.message = ((TLRPC.TL_updateServiceNotification)update).message;
|
newMessage.message = ((TLRPC.TL_updateServiceNotification)update).message;
|
||||||
|
|
||||||
messagesArr.add(newMessage);
|
messagesArr.add(newMessage);
|
||||||
MessageObject obj = new MessageObject(newMessage, usersDict);
|
MessageObject obj = new MessageObject(newMessage, usersDict, true);
|
||||||
ArrayList<MessageObject> arr = messages.get(newMessage.dialog_id);
|
ArrayList<MessageObject> arr = messages.get(newMessage.dialog_id);
|
||||||
if (arr == null) {
|
if (arr == null) {
|
||||||
arr = new ArrayList<>();
|
arr = new ArrayList<>();
|
||||||
@ -3370,6 +3265,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
toDbUser.status = update.status;
|
toDbUser.status = update.status;
|
||||||
dbUsersStatus.add(toDbUser);
|
dbUsersStatus.add(toDbUser);
|
||||||
|
if (update.user_id == UserConfig.getClientUserId()) {
|
||||||
|
NotificationsController.getInstance().setLastOnlineFromOtherDevice(update.status.expires);
|
||||||
|
}
|
||||||
} else if (update instanceof TLRPC.TL_updateUserName) {
|
} else if (update instanceof TLRPC.TL_updateUserName) {
|
||||||
if (currentUser != null) {
|
if (currentUser != null) {
|
||||||
currentUser.first_name = update.first_name;
|
currentUser.first_name = update.first_name;
|
||||||
@ -3405,15 +3303,38 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
editor = preferences.edit();
|
editor = preferences.edit();
|
||||||
}
|
}
|
||||||
int dialog_id = update.peer.peer.user_id;
|
long dialog_id = update.peer.peer.user_id;
|
||||||
if (dialog_id == 0) {
|
if (dialog_id == 0) {
|
||||||
dialog_id = -update.peer.peer.chat_id;
|
dialog_id = -update.peer.peer.chat_id;
|
||||||
}
|
}
|
||||||
if (update.notify_settings.mute_until != 0) {
|
TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id);
|
||||||
editor.putInt("notify2_" + dialog_id, 2);
|
if (dialog != null) {
|
||||||
} else {
|
dialog.notify_settings = update.notify_settings;
|
||||||
editor.remove("notify2_" + dialog_id);
|
|
||||||
}
|
}
|
||||||
|
if (update.notify_settings.mute_until > ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
int until = 0;
|
||||||
|
if (update.notify_settings.mute_until > ConnectionsManager.getInstance().getCurrentTime() + 60 * 60 * 24 * 365) {
|
||||||
|
editor.putInt("notify2_" + dialog_id, 2);
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.notify_settings.mute_until = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
until = update.notify_settings.mute_until;
|
||||||
|
editor.putInt("notify2_" + dialog_id, 3);
|
||||||
|
editor.putInt("notifyuntil_" + dialog_id, update.notify_settings.mute_until);
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.notify_settings.mute_until = until;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, ((long)until << 32) | 1);
|
||||||
|
} else {
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.notify_settings.mute_until = 0;
|
||||||
|
}
|
||||||
|
editor.remove("notify2_" + dialog_id);
|
||||||
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
}/* else if (update.peer instanceof TLRPC.TL_notifyChats) { disable global settings sync
|
}/* else if (update.peer instanceof TLRPC.TL_notifyChats) { disable global settings sync
|
||||||
if (editor == null) {
|
if (editor == null) {
|
||||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
|
@ -17,6 +17,7 @@ import org.telegram.PhoneFormat.PhoneFormat;
|
|||||||
import org.telegram.SQLite.SQLiteCursor;
|
import org.telegram.SQLite.SQLiteCursor;
|
||||||
import org.telegram.SQLite.SQLiteDatabase;
|
import org.telegram.SQLite.SQLiteDatabase;
|
||||||
import org.telegram.SQLite.SQLitePreparedStatement;
|
import org.telegram.SQLite.SQLitePreparedStatement;
|
||||||
|
import org.telegram.android.query.SharedMediaQuery;
|
||||||
import org.telegram.messenger.BuffersStorage;
|
import org.telegram.messenger.BuffersStorage;
|
||||||
import org.telegram.messenger.ByteBufferDesc;
|
import org.telegram.messenger.ByteBufferDesc;
|
||||||
import org.telegram.messenger.ConnectionsManager;
|
import org.telegram.messenger.ConnectionsManager;
|
||||||
@ -109,8 +110,6 @@ public class MessagesStorage {
|
|||||||
database.executeFast("CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)").stepThis().dispose();
|
database.executeFast("CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)").stepThis().dispose();
|
database.executeFast("CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)").stepThis().dispose();
|
database.executeFast("CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)").stepThis().dispose();
|
|
||||||
database.executeFast("CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)").stepThis().dispose();
|
|
||||||
database.executeFast("CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)").stepThis().dispose();
|
database.executeFast("CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE randoms(random_id INTEGER, mid INTEGER, PRIMARY KEY (random_id, mid))").stepThis().dispose();
|
database.executeFast("CREATE TABLE randoms(random_id INTEGER, mid INTEGER, PRIMARY KEY (random_id, mid))").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE enc_tasks_v2(mid INTEGER PRIMARY KEY, date INTEGER)").stepThis().dispose();
|
database.executeFast("CREATE TABLE enc_tasks_v2(mid INTEGER PRIMARY KEY, date INTEGER)").stepThis().dispose();
|
||||||
@ -123,9 +122,6 @@ public class MessagesStorage {
|
|||||||
database.executeFast("CREATE TABLE messages_seq(mid INTEGER PRIMARY KEY, seq_in INTEGER, seq_out INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE messages_seq(mid INTEGER PRIMARY KEY, seq_in INTEGER, seq_out INTEGER);").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, PRIMARY KEY (id, type));").stepThis().dispose();
|
database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, PRIMARY KEY (id, type));").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE stickers(id INTEGER PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose();
|
database.executeFast("CREATE TABLE stickers(id INTEGER PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose();
|
||||||
//database.executeFast("CREATE TABLE secret_holes(uid INTEGER, seq_in INTEGER, seq_out INTEGER, data BLOB, PRIMARY KEY (uid, seq_in, seq_out));").stepThis().dispose();
|
|
||||||
|
|
||||||
//database.executeFast("CREATE TABLE attach_data(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose();
|
|
||||||
|
|
||||||
database.executeFast("CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)").stepThis().dispose();
|
database.executeFast("CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)").stepThis().dispose();
|
||||||
database.executeFast("CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))").stepThis().dispose();
|
database.executeFast("CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))").stepThis().dispose();
|
||||||
@ -134,6 +130,8 @@ public class MessagesStorage {
|
|||||||
|
|
||||||
//database.executeFast("CREATE TABLE messages_holes(uid INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, start));").stepThis().dispose();
|
//database.executeFast("CREATE TABLE messages_holes(uid INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, start));").stepThis().dispose();
|
||||||
//database.executeFast("CREATE INDEX IF NOT EXISTS type_uid_end_messages_holes ON messages_holes(uid, end);").stepThis().dispose();
|
//database.executeFast("CREATE INDEX IF NOT EXISTS type_uid_end_messages_holes ON messages_holes(uid, end);").stepThis().dispose();
|
||||||
|
//database.executeFast("CREATE TABLE secret_holes(uid INTEGER, seq_in INTEGER, seq_out INTEGER, data BLOB, PRIMARY KEY (uid, seq_in, seq_out));").stepThis().dispose();
|
||||||
|
//database.executeFast("CREATE TABLE attach_data(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose();
|
||||||
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS type_date_idx_download_queue ON download_queue(type, date);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS type_date_idx_download_queue ON download_queue(type, date);").stepThis().dispose();
|
||||||
|
|
||||||
@ -146,10 +144,6 @@ public class MessagesStorage {
|
|||||||
database.executeFast("CREATE INDEX IF NOT EXISTS last_mid_idx_dialogs ON dialogs(last_mid);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS last_mid_idx_dialogs ON dialogs(last_mid);").stepThis().dispose();
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_idx_dialogs ON dialogs(unread_count);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_idx_dialogs ON dialogs(unread_count);").stepThis().dispose();
|
||||||
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_idx_media ON media(uid, mid);").stepThis().dispose();
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_media ON media(mid);").stepThis().dispose();
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_media ON media(uid, date, mid);").stepThis().dispose();
|
|
||||||
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_idx_messages ON messages(uid, mid);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_idx_messages ON messages(uid, mid);").stepThis().dispose();
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages ON messages(uid, date, mid);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages ON messages(uid, date, mid);").stepThis().dispose();
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages ON messages(mid, out);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages ON messages(mid, out);").stepThis().dispose();
|
||||||
@ -158,7 +152,17 @@ public class MessagesStorage {
|
|||||||
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS seq_idx_messages_seq ON messages_seq(seq_in, seq_out);").stepThis().dispose();
|
database.executeFast("CREATE INDEX IF NOT EXISTS seq_idx_messages_seq ON messages_seq(seq_in, seq_out);").stepThis().dispose();
|
||||||
|
|
||||||
database.executeFast("PRAGMA user_version = 12").stepThis().dispose();
|
//shared media
|
||||||
|
database.executeFast("CREATE TABLE media_v2(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, type INTEGER, data BLOB)").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE TABLE media_counts_v2(uid INTEGER, type INTEGER, count INTEGER, PRIMARY KEY(uid, type))").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media ON media_v2(uid, mid, type, date);").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_media ON media_v2(mid);").stepThis().dispose();
|
||||||
|
|
||||||
|
//kev-value
|
||||||
|
database.executeFast("CREATE TABLE keyvalue(id TEXT PRIMARY KEY, value TEXT)").stepThis().dispose();
|
||||||
|
|
||||||
|
//version
|
||||||
|
database.executeFast("PRAGMA user_version = 13").stepThis().dispose();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
SQLiteCursor cursor = database.queryFinalized("SELECT seq, pts, date, qts, lsv, sg, pbytes FROM params WHERE id = 1");
|
SQLiteCursor cursor = database.queryFinalized("SELECT seq, pts, date, qts, lsv, sg, pbytes FROM params WHERE id = 1");
|
||||||
@ -189,7 +193,7 @@ public class MessagesStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
int version = database.executeInt("PRAGMA user_version");
|
int version = database.executeInt("PRAGMA user_version");
|
||||||
if (version < 12) {
|
if (version < 13) {
|
||||||
updateDbToLastVersion(version);
|
updateDbToLastVersion(version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,9 +212,6 @@ public class MessagesStorage {
|
|||||||
if (version < 4) {
|
if (version < 4) {
|
||||||
database.executeFast("CREATE TABLE IF NOT EXISTS user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose();
|
database.executeFast("CREATE TABLE IF NOT EXISTS user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose();
|
||||||
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_media ON media(mid);").stepThis().dispose();
|
|
||||||
database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_media ON media(uid, date, mid);").stepThis().dispose();
|
|
||||||
|
|
||||||
database.executeFast("DROP INDEX IF EXISTS read_state_out_idx_messages;").stepThis().dispose();
|
database.executeFast("DROP INDEX IF EXISTS read_state_out_idx_messages;").stepThis().dispose();
|
||||||
database.executeFast("DROP INDEX IF EXISTS ttl_idx_messages;").stepThis().dispose();
|
database.executeFast("DROP INDEX IF EXISTS ttl_idx_messages;").stepThis().dispose();
|
||||||
database.executeFast("DROP INDEX IF EXISTS date_idx_messages;").stepThis().dispose();
|
database.executeFast("DROP INDEX IF EXISTS date_idx_messages;").stepThis().dispose();
|
||||||
@ -350,6 +351,23 @@ public class MessagesStorage {
|
|||||||
database.executeFast("PRAGMA user_version = 12").stepThis().dispose();
|
database.executeFast("PRAGMA user_version = 12").stepThis().dispose();
|
||||||
version = 12;
|
version = 12;
|
||||||
}
|
}
|
||||||
|
if (version == 12 && version < 13) {
|
||||||
|
database.executeFast("DROP INDEX IF EXISTS uid_mid_idx_media;").stepThis().dispose();
|
||||||
|
database.executeFast("DROP INDEX IF EXISTS mid_idx_media;").stepThis().dispose();
|
||||||
|
database.executeFast("DROP INDEX IF EXISTS uid_date_mid_idx_media;").stepThis().dispose();
|
||||||
|
database.executeFast("DROP TABLE IF EXISTS media;").stepThis().dispose();
|
||||||
|
database.executeFast("DROP TABLE IF EXISTS media_counts;").stepThis().dispose();
|
||||||
|
|
||||||
|
database.executeFast("CREATE TABLE IF NOT EXISTS media_v2(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, type INTEGER, data BLOB)").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE TABLE IF NOT EXISTS media_counts_v2(uid INTEGER, type INTEGER, count INTEGER, PRIMARY KEY(uid, type))").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media ON media_v2(uid, mid, type, date);").stepThis().dispose();
|
||||||
|
database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_media ON media_v2(mid);").stepThis().dispose();
|
||||||
|
|
||||||
|
database.executeFast("CREATE TABLE IF NOT EXISTS keyvalue(id TEXT PRIMARY KEY, value TEXT)").stepThis().dispose();
|
||||||
|
|
||||||
|
database.executeFast("PRAGMA user_version = 13").stepThis().dispose();
|
||||||
|
version = 13;
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
@ -445,7 +463,7 @@ public class MessagesStorage {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDialogFlags(final long did, final int flags) {
|
public void setDialogFlags(final long did, final long flags) {
|
||||||
storageQueue.postRunnable(new Runnable() {
|
storageQueue.postRunnable(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -821,9 +839,9 @@ public class MessagesStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
database.executeFast("UPDATE dialogs SET unread_count = 0 WHERE did = " + did).stepThis().dispose();
|
database.executeFast("UPDATE dialogs SET unread_count = 0 WHERE did = " + did).stepThis().dispose();
|
||||||
database.executeFast("DELETE FROM media_counts WHERE uid = " + did).stepThis().dispose();
|
|
||||||
database.executeFast("DELETE FROM messages WHERE uid = " + did).stepThis().dispose();
|
database.executeFast("DELETE FROM messages WHERE uid = " + did).stepThis().dispose();
|
||||||
database.executeFast("DELETE FROM media WHERE uid = " + did).stepThis().dispose();
|
database.executeFast("DELETE FROM media_counts_v2 WHERE uid = " + did).stepThis().dispose();
|
||||||
|
database.executeFast("DELETE FROM media_v2 WHERE uid = " + did).stepThis().dispose();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
@ -1479,149 +1497,6 @@ public class MessagesStorage {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void putMediaCount(final long uid, final int count) {
|
|
||||||
storageQueue.postRunnable(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media_counts VALUES(?, ?)");
|
|
||||||
state2.requery();
|
|
||||||
state2.bindLong(1, uid);
|
|
||||||
state2.bindInteger(2, count);
|
|
||||||
state2.step();
|
|
||||||
state2.dispose();
|
|
||||||
} catch (Exception e) {
|
|
||||||
FileLog.e("tmessages", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getMediaCount(final long uid, final int classGuid) {
|
|
||||||
storageQueue.postRunnable(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
int count = -1;
|
|
||||||
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT count FROM media_counts WHERE uid = %d LIMIT 1", uid));
|
|
||||||
if (cursor.next()) {
|
|
||||||
count = cursor.intValue(0);
|
|
||||||
}
|
|
||||||
cursor.dispose();
|
|
||||||
int lower_part = (int)uid;
|
|
||||||
if (count == -1 && lower_part == 0) {
|
|
||||||
cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM media WHERE uid = %d LIMIT 1", uid));
|
|
||||||
if (cursor.next()) {
|
|
||||||
count = cursor.intValue(0);
|
|
||||||
}
|
|
||||||
cursor.dispose();
|
|
||||||
if (count != -1) {
|
|
||||||
putMediaCount(uid, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MessagesController.getInstance().processLoadedMediaCount(count, uid, classGuid, true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
FileLog.e("tmessages", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadMedia(final long uid, final int offset, final int count, final int max_id, final int classGuid) {
|
|
||||||
storageQueue.postRunnable(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
TLRPC.TL_messages_messages res = new TLRPC.TL_messages_messages();
|
|
||||||
try {
|
|
||||||
ArrayList<Integer> loadedUsers = new ArrayList<>();
|
|
||||||
ArrayList<Integer> fromUser = new ArrayList<>();
|
|
||||||
|
|
||||||
SQLiteCursor cursor;
|
|
||||||
|
|
||||||
if ((int)uid != 0) {
|
|
||||||
if (max_id != 0) {
|
|
||||||
cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid FROM media WHERE uid = %d AND mid < %d ORDER BY date DESC, mid DESC LIMIT %d", uid, max_id, count));
|
|
||||||
} else {
|
|
||||||
cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, mid FROM media WHERE uid = %d ORDER BY date DESC, mid DESC LIMIT %d,%d", uid, offset, count));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (max_id != 0) {
|
|
||||||
cursor = database.queryFinalized(String.format(Locale.US, "SELECT m.data, m.mid, r.random_id FROM media as m LEFT JOIN randoms as r ON r.mid = m.mid WHERE m.uid = %d AND m.mid > %d ORDER BY m.mid ASC LIMIT %d", uid, max_id, count));
|
|
||||||
} else {
|
|
||||||
cursor = database.queryFinalized(String.format(Locale.US, "SELECT m.data, m.mid, r.random_id FROM media as m LEFT JOIN randoms as r ON r.mid = m.mid WHERE m.uid = %d ORDER BY m.mid ASC LIMIT %d,%d", uid, offset, count));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (cursor.next()) {
|
|
||||||
ByteBufferDesc data = buffersStorage.getFreeBuffer(cursor.byteArrayLength(0));
|
|
||||||
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
|
||||||
TLRPC.Message message = (TLRPC.Message)TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
|
||||||
message.id = cursor.intValue(1);
|
|
||||||
message.dialog_id = uid;
|
|
||||||
if ((int)uid == 0) {
|
|
||||||
message.random_id = cursor.longValue(2);
|
|
||||||
}
|
|
||||||
res.messages.add(message);
|
|
||||||
fromUser.add(message.from_id);
|
|
||||||
}
|
|
||||||
buffersStorage.reuseFreeBuffer(data);
|
|
||||||
}
|
|
||||||
cursor.dispose();
|
|
||||||
|
|
||||||
StringBuilder usersToLoad = new StringBuilder();
|
|
||||||
for (int uid : fromUser) {
|
|
||||||
if (!loadedUsers.contains(uid)) {
|
|
||||||
if (usersToLoad.length() != 0) {
|
|
||||||
usersToLoad.append(",");
|
|
||||||
}
|
|
||||||
usersToLoad.append(uid);
|
|
||||||
loadedUsers.add(uid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (usersToLoad.length() != 0) {
|
|
||||||
getUsersInternal(usersToLoad.toString(), res.users);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
res.messages.clear();
|
|
||||||
res.chats.clear();
|
|
||||||
res.users.clear();
|
|
||||||
FileLog.e("tmessages", e);
|
|
||||||
} finally {
|
|
||||||
MessagesController.getInstance().processLoadedMedia(res, uid, offset, count, max_id, true, classGuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putMedia(final long uid, final ArrayList<TLRPC.Message> messages) {
|
|
||||||
storageQueue.postRunnable(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
database.beginTransaction();
|
|
||||||
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media VALUES(?, ?, ?, ?)");
|
|
||||||
for (TLRPC.Message message : messages) {
|
|
||||||
if (message.media instanceof TLRPC.TL_messageMediaVideo || message.media instanceof TLRPC.TL_messageMediaPhoto) {
|
|
||||||
state2.requery();
|
|
||||||
ByteBufferDesc data = buffersStorage.getFreeBuffer(message.getObjectSize());
|
|
||||||
message.serializeToStream(data);
|
|
||||||
state2.bindInteger(1, message.id);
|
|
||||||
state2.bindLong(2, uid);
|
|
||||||
state2.bindInteger(3, message.date);
|
|
||||||
state2.bindByteBuffer(4, data.buffer);
|
|
||||||
state2.step();
|
|
||||||
buffersStorage.reuseFreeBuffer(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state2.dispose();
|
|
||||||
database.commitTransaction();
|
|
||||||
} catch (Exception e) {
|
|
||||||
FileLog.e("tmessages", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getUnsentMessages(final int count) {
|
public void getUnsentMessages(final int count) {
|
||||||
storageQueue.postRunnable(new Runnable() {
|
storageQueue.postRunnable(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@ -2105,10 +1980,11 @@ public class MessagesStorage {
|
|||||||
storageQueue.postRunnable(new Runnable() {
|
storageQueue.postRunnable(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
SQLitePreparedStatement state = null;
|
||||||
try {
|
try {
|
||||||
String id = Utilities.MD5(path);
|
String id = Utilities.MD5(path);
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
SQLitePreparedStatement state = database.executeFast("REPLACE INTO sent_files_v2 VALUES(?, ?, ?)");
|
state = database.executeFast("REPLACE INTO sent_files_v2 VALUES(?, ?, ?)");
|
||||||
state.requery();
|
state.requery();
|
||||||
ByteBufferDesc data = buffersStorage.getFreeBuffer(file.getObjectSize());
|
ByteBufferDesc data = buffersStorage.getFreeBuffer(file.getObjectSize());
|
||||||
file.serializeToStream(data);
|
file.serializeToStream(data);
|
||||||
@ -2116,11 +1992,14 @@ public class MessagesStorage {
|
|||||||
state.bindInteger(2, type);
|
state.bindInteger(2, type);
|
||||||
state.bindByteBuffer(3, data.buffer);
|
state.bindByteBuffer(3, data.buffer);
|
||||||
state.step();
|
state.step();
|
||||||
state.dispose();
|
|
||||||
buffersStorage.reuseFreeBuffer(data);
|
buffersStorage.reuseFreeBuffer(data);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
|
} finally {
|
||||||
|
if (state != null) {
|
||||||
|
state.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2439,7 +2318,7 @@ public class MessagesStorage {
|
|||||||
state.dispose();
|
state.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getUsersInternal(String usersToLoad, ArrayList<TLRPC.User> result) throws Exception {
|
public void getUsersInternal(String usersToLoad, ArrayList<TLRPC.User> result) throws Exception {
|
||||||
if (usersToLoad == null || usersToLoad.length() == 0 || result == null) {
|
if (usersToLoad == null || usersToLoad.length() == 0 || result == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2464,7 +2343,7 @@ public class MessagesStorage {
|
|||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getChatsInternal(String chatsToLoad, ArrayList<TLRPC.Chat> result) throws Exception {
|
public void getChatsInternal(String chatsToLoad, ArrayList<TLRPC.Chat> result) throws Exception {
|
||||||
if (chatsToLoad == null || chatsToLoad.length() == 0 || result == null) {
|
if (chatsToLoad == null || chatsToLoad.length() == 0 || result == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2486,7 +2365,7 @@ public class MessagesStorage {
|
|||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getEncryptedChatsInternal(String chatsToLoad, ArrayList<TLRPC.EncryptedChat> result, ArrayList<Integer> usersToLoad) throws Exception {
|
public void getEncryptedChatsInternal(String chatsToLoad, ArrayList<TLRPC.EncryptedChat> result, ArrayList<Integer> usersToLoad) throws Exception {
|
||||||
if (chatsToLoad == null || chatsToLoad.length() == 0 || result == null) {
|
if (chatsToLoad == null || chatsToLoad.length() == 0 || result == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2633,15 +2512,6 @@ public class MessagesStorage {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean canAddMessageToMedia(TLRPC.Message message) {
|
|
||||||
if (message instanceof TLRPC.TL_message_secret && message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl != 0 && message.ttl <= 60) {
|
|
||||||
return false;
|
|
||||||
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getMessageMediaType(TLRPC.Message message) {
|
private int getMessageMediaType(TLRPC.Message message) {
|
||||||
if (message instanceof TLRPC.TL_message_secret && (
|
if (message instanceof TLRPC.TL_message_secret && (
|
||||||
message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl != 0 && message.ttl <= 60 ||
|
message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl != 0 && message.ttl <= 60 ||
|
||||||
@ -2661,13 +2531,14 @@ public class MessagesStorage {
|
|||||||
}
|
}
|
||||||
HashMap<Long, TLRPC.Message> messagesMap = new HashMap<>();
|
HashMap<Long, TLRPC.Message> messagesMap = new HashMap<>();
|
||||||
HashMap<Long, Integer> messagesCounts = new HashMap<>();
|
HashMap<Long, Integer> messagesCounts = new HashMap<>();
|
||||||
HashMap<Long, Integer> mediaCounts = new HashMap<>();
|
HashMap<Integer, HashMap<Long, Integer>> mediaCounts = new HashMap<>();
|
||||||
|
HashMap<Integer, Integer> mediaTypes = new HashMap<>();
|
||||||
HashMap<Integer, Long> messagesIdsMap = new HashMap<>();
|
HashMap<Integer, Long> messagesIdsMap = new HashMap<>();
|
||||||
HashMap<Integer, Long> messagesMediaIdsMap = new HashMap<>();
|
HashMap<Integer, Long> messagesMediaIdsMap = new HashMap<>();
|
||||||
StringBuilder messageIds = new StringBuilder();
|
StringBuilder messageIds = new StringBuilder();
|
||||||
StringBuilder messageMediaIds = new StringBuilder();
|
StringBuilder messageMediaIds = new StringBuilder();
|
||||||
SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media VALUES(?, ?, ?, ?)");
|
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media_v2 VALUES(?, ?, ?, ?, ?)");
|
||||||
SQLitePreparedStatement state3 = database.executeFast("REPLACE INTO randoms VALUES(?, ?)");
|
SQLitePreparedStatement state3 = database.executeFast("REPLACE INTO randoms VALUES(?, ?)");
|
||||||
SQLitePreparedStatement state4 = database.executeFast("REPLACE INTO download_queue VALUES(?, ?, ?, ?)");
|
SQLitePreparedStatement state4 = database.executeFast("REPLACE INTO download_queue VALUES(?, ?, ?, ?)");
|
||||||
|
|
||||||
@ -2689,12 +2560,39 @@ public class MessagesStorage {
|
|||||||
messagesIdsMap.put(message.id, dialog_id);
|
messagesIdsMap.put(message.id, dialog_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canAddMessageToMedia(message)) {
|
if (SharedMediaQuery.canAddMessageToMedia(message)) {
|
||||||
if (messageMediaIds.length() > 0) {
|
if (messageMediaIds.length() > 0) {
|
||||||
messageMediaIds.append(",");
|
messageMediaIds.append(",");
|
||||||
}
|
}
|
||||||
messageMediaIds.append(message.id);
|
messageMediaIds.append(message.id);
|
||||||
messagesMediaIdsMap.put(message.id, dialog_id);
|
messagesMediaIdsMap.put(message.id, dialog_id);
|
||||||
|
mediaTypes.put(message.id, SharedMediaQuery.getMediaType(message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messageMediaIds.length() > 0) {
|
||||||
|
SQLiteCursor cursor = database.queryFinalized("SELECT mid FROM media_v2 WHERE mid IN(" + messageMediaIds.toString() + ")");
|
||||||
|
while (cursor.next()) {
|
||||||
|
int mid = cursor.intValue(0);
|
||||||
|
messagesMediaIdsMap.remove(mid);
|
||||||
|
}
|
||||||
|
cursor.dispose();
|
||||||
|
for (HashMap.Entry<Integer, Long> entry : messagesMediaIdsMap.entrySet()) {
|
||||||
|
Integer type = mediaTypes.get(entry.getKey());
|
||||||
|
HashMap<Long, Integer> counts = mediaCounts.get(type);
|
||||||
|
Integer count;
|
||||||
|
if (counts == null) {
|
||||||
|
counts = new HashMap<>();
|
||||||
|
count = 0;
|
||||||
|
mediaCounts.put(type, counts);
|
||||||
|
} else {
|
||||||
|
count = counts.get(entry.getValue());
|
||||||
|
}
|
||||||
|
if (count == null) {
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
counts.put(entry.getValue(), count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2715,23 +2613,6 @@ public class MessagesStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (messageMediaIds.length() > 0) {
|
|
||||||
SQLiteCursor cursor = database.queryFinalized("SELECT mid FROM media WHERE mid IN(" + messageMediaIds.toString() + ")");
|
|
||||||
while (cursor.next()) {
|
|
||||||
int mid = cursor.intValue(0);
|
|
||||||
messagesMediaIdsMap.remove(mid);
|
|
||||||
}
|
|
||||||
cursor.dispose();
|
|
||||||
for (Long dialog_id : messagesMediaIdsMap.values()) {
|
|
||||||
Integer count = mediaCounts.get(dialog_id);
|
|
||||||
if (count == null) {
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
mediaCounts.put(dialog_id, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int downloadMediaMask = 0;
|
int downloadMediaMask = 0;
|
||||||
for (TLRPC.Message message : messages) {
|
for (TLRPC.Message message : messages) {
|
||||||
fixUnsupportedMedia(message);
|
fixUnsupportedMedia(message);
|
||||||
@ -2784,12 +2665,13 @@ public class MessagesStorage {
|
|||||||
state3.step();
|
state3.step();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canAddMessageToMedia(message)) {
|
if (SharedMediaQuery.canAddMessageToMedia(message)) {
|
||||||
state2.requery();
|
state2.requery();
|
||||||
state2.bindInteger(1, messageId);
|
state2.bindInteger(1, messageId);
|
||||||
state2.bindLong(2, dialog_id);
|
state2.bindLong(2, dialog_id);
|
||||||
state2.bindInteger(3, message.date);
|
state2.bindInteger(3, message.date);
|
||||||
state2.bindByteBuffer(4, data.buffer);
|
state2.bindInteger(4, SharedMediaQuery.getMediaType(message));
|
||||||
|
state2.bindByteBuffer(5, data.buffer);
|
||||||
state2.step();
|
state2.step();
|
||||||
}
|
}
|
||||||
buffersStorage.reuseFreeBuffer(data);
|
buffersStorage.reuseFreeBuffer(data);
|
||||||
@ -2883,33 +2765,37 @@ public class MessagesStorage {
|
|||||||
state.step();
|
state.step();
|
||||||
}
|
}
|
||||||
state.dispose();
|
state.dispose();
|
||||||
|
|
||||||
|
if (!mediaCounts.isEmpty()) {
|
||||||
|
state = database.executeFast("REPLACE INTO media_counts_v2 VALUES(?, ?, ?)");
|
||||||
|
for (HashMap.Entry<Integer, HashMap<Long, Integer>> counts : mediaCounts.entrySet()) {
|
||||||
|
Integer type = counts.getKey();
|
||||||
|
for (HashMap.Entry<Long, Integer> pair : counts.getValue().entrySet()) {
|
||||||
|
long uid = pair.getKey();
|
||||||
|
int lower_part = (int) uid;
|
||||||
|
int count = -1;
|
||||||
|
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT count FROM media_counts_v2 WHERE uid = %d AND type = %d LIMIT 1", uid, type));
|
||||||
|
if (cursor.next()) {
|
||||||
|
count = cursor.intValue(0);
|
||||||
|
}
|
||||||
|
cursor.dispose();
|
||||||
|
if (count != -1) {
|
||||||
|
state.requery();
|
||||||
|
count += pair.getValue();
|
||||||
|
state.bindLong(1, uid);
|
||||||
|
state.bindInteger(2, type);
|
||||||
|
state.bindInteger(3, count);
|
||||||
|
state.step();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.dispose();
|
||||||
|
}
|
||||||
if (withTransaction) {
|
if (withTransaction) {
|
||||||
database.commitTransaction();
|
database.commitTransaction();
|
||||||
}
|
}
|
||||||
MessagesController.getInstance().processDialogsUpdateRead(messagesCounts);
|
MessagesController.getInstance().processDialogsUpdateRead(messagesCounts);
|
||||||
|
|
||||||
if (!mediaCounts.isEmpty()) {
|
|
||||||
state = database.executeFast("REPLACE INTO media_counts VALUES(?, ?)");
|
|
||||||
for (HashMap.Entry<Long, Integer> pair : mediaCounts.entrySet()) {
|
|
||||||
long uid = pair.getKey();
|
|
||||||
int lower_part = (int)uid;
|
|
||||||
int count = -1;
|
|
||||||
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT count FROM media_counts WHERE uid = %d LIMIT 1", uid));
|
|
||||||
if (cursor.next()) {
|
|
||||||
count = cursor.intValue(0);
|
|
||||||
}
|
|
||||||
if (count != -1) {
|
|
||||||
state.requery();
|
|
||||||
count += pair.getValue();
|
|
||||||
state.bindLong(1, uid);
|
|
||||||
state.bindInteger(2, count);
|
|
||||||
state.step();
|
|
||||||
}
|
|
||||||
cursor.dispose();
|
|
||||||
}
|
|
||||||
state.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (downloadMediaMask != 0) {
|
if (downloadMediaMask != 0) {
|
||||||
final int downloadMediaMaskFinal = downloadMediaMask;
|
final int downloadMediaMaskFinal = downloadMediaMask;
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
@ -3078,6 +2964,12 @@ public class MessagesStorage {
|
|||||||
state.bindInteger(2, oldId);
|
state.bindInteger(2, oldId);
|
||||||
state.step();
|
state.step();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
database.executeFast(String.format(Locale.US, "DELETE FROM messages WHERE mid = %d", oldId)).stepThis().dispose();
|
||||||
|
database.executeFast(String.format(Locale.US, "DELETE FROM messages_seq WHERE mid = %d", oldId)).stepThis().dispose();
|
||||||
|
} catch (Exception e2) {
|
||||||
|
FileLog.e("tmessages", e2);
|
||||||
|
}
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
} finally {
|
} finally {
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
@ -3087,11 +2979,16 @@ public class MessagesStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
state = database.executeFast("UPDATE media SET mid = ? WHERE mid = ?");
|
state = database.executeFast("UPDATE media_v2 SET mid = ? WHERE mid = ?");
|
||||||
state.bindInteger(1, newId);
|
state.bindInteger(1, newId);
|
||||||
state.bindInteger(2, oldId);
|
state.bindInteger(2, oldId);
|
||||||
state.step();
|
state.step();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
database.executeFast(String.format(Locale.US, "DELETE FROM media_v2 WHERE mid = %d", oldId)).stepThis().dispose();
|
||||||
|
} catch (Exception e2) {
|
||||||
|
FileLog.e("tmessages", e2);
|
||||||
|
}
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
} finally {
|
} finally {
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
@ -3352,8 +3249,8 @@ public class MessagesStorage {
|
|||||||
FileLoader.getInstance().deleteFiles(filesToDelete);
|
FileLoader.getInstance().deleteFiles(filesToDelete);
|
||||||
database.executeFast(String.format(Locale.US, "DELETE FROM messages WHERE mid IN(%s)", ids)).stepThis().dispose();
|
database.executeFast(String.format(Locale.US, "DELETE FROM messages WHERE mid IN(%s)", ids)).stepThis().dispose();
|
||||||
database.executeFast(String.format(Locale.US, "DELETE FROM messages_seq WHERE mid IN(%s)", ids)).stepThis().dispose();
|
database.executeFast(String.format(Locale.US, "DELETE FROM messages_seq WHERE mid IN(%s)", ids)).stepThis().dispose();
|
||||||
database.executeFast(String.format(Locale.US, "DELETE FROM media WHERE mid IN(%s)", ids)).stepThis().dispose();
|
database.executeFast(String.format(Locale.US, "DELETE FROM media_v2 WHERE mid IN(%s)", ids)).stepThis().dispose();
|
||||||
database.executeFast("DELETE FROM media_counts WHERE 1").stepThis().dispose();
|
database.executeFast("DELETE FROM media_counts_v2 WHERE 1").stepThis().dispose();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
@ -3521,7 +3418,7 @@ public class MessagesStorage {
|
|||||||
database.beginTransaction();
|
database.beginTransaction();
|
||||||
if (!messages.messages.isEmpty()) {
|
if (!messages.messages.isEmpty()) {
|
||||||
SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media VALUES(?, ?, ?, ?)");
|
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO media_v2 VALUES(?, ?, ?, ?, ?)");
|
||||||
for (TLRPC.Message message : messages.messages) {
|
for (TLRPC.Message message : messages.messages) {
|
||||||
fixUnsupportedMedia(message);
|
fixUnsupportedMedia(message);
|
||||||
state.requery();
|
state.requery();
|
||||||
@ -3538,12 +3435,13 @@ public class MessagesStorage {
|
|||||||
state.bindInteger(9, 0);
|
state.bindInteger(9, 0);
|
||||||
state.step();
|
state.step();
|
||||||
|
|
||||||
if (message.media instanceof TLRPC.TL_messageMediaVideo || message.media instanceof TLRPC.TL_messageMediaPhoto) {
|
if (SharedMediaQuery.canAddMessageToMedia(message)) {
|
||||||
state2.requery();
|
state2.requery();
|
||||||
state2.bindInteger(1, message.id);
|
state2.bindInteger(1, message.id);
|
||||||
state2.bindLong(2, dialog_id);
|
state2.bindLong(2, dialog_id);
|
||||||
state2.bindInteger(3, message.date);
|
state2.bindInteger(3, message.date);
|
||||||
state2.bindByteBuffer(4, data.buffer);
|
state2.bindInteger(4, SharedMediaQuery.getMediaType(message));
|
||||||
|
state2.bindByteBuffer(5, data.buffer);
|
||||||
state2.step();
|
state2.step();
|
||||||
}
|
}
|
||||||
buffersStorage.reuseFreeBuffer(data);
|
buffersStorage.reuseFreeBuffer(data);
|
||||||
@ -3573,13 +3471,22 @@ public class MessagesStorage {
|
|||||||
usersToLoad.add(UserConfig.getClientUserId());
|
usersToLoad.add(UserConfig.getClientUserId());
|
||||||
ArrayList<Integer> chatsToLoad = new ArrayList<>();
|
ArrayList<Integer> chatsToLoad = new ArrayList<>();
|
||||||
ArrayList<Integer> encryptedToLoad = new ArrayList<>();
|
ArrayList<Integer> encryptedToLoad = new ArrayList<>();
|
||||||
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid ORDER BY d.date DESC LIMIT %d,%d", offset, count));
|
SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid LEFT JOIN dialog_settings as s ON d.did = s.did ORDER BY d.date DESC LIMIT %d,%d", offset, count));
|
||||||
while (cursor.next()) {
|
while (cursor.next()) {
|
||||||
TLRPC.TL_dialog dialog = new TLRPC.TL_dialog();
|
TLRPC.TL_dialog dialog = new TLRPC.TL_dialog();
|
||||||
dialog.id = cursor.longValue(0);
|
dialog.id = cursor.longValue(0);
|
||||||
dialog.top_message = cursor.intValue(1);
|
dialog.top_message = cursor.intValue(1);
|
||||||
dialog.unread_count = cursor.intValue(2);
|
dialog.unread_count = cursor.intValue(2);
|
||||||
dialog.last_message_date = cursor.intValue(3);
|
dialog.last_message_date = cursor.intValue(3);
|
||||||
|
long flags = cursor.longValue(8);
|
||||||
|
int low_flags = (int)flags;
|
||||||
|
dialog.notify_settings = new TLRPC.TL_peerNotifySettings();
|
||||||
|
if ((low_flags & 1) != 0) {
|
||||||
|
dialog.notify_settings.mute_until = (int)(flags >> 32);
|
||||||
|
if (dialog.notify_settings.mute_until == 0) {
|
||||||
|
dialog.notify_settings.mute_until = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
dialogs.dialogs.add(dialog);
|
dialogs.dialogs.add(dialog);
|
||||||
|
|
||||||
ByteBufferDesc data = buffersStorage.getFreeBuffer(cursor.byteArrayLength(4));
|
ByteBufferDesc data = buffersStorage.getFreeBuffer(cursor.byteArrayLength(4));
|
||||||
@ -3680,7 +3587,7 @@ public class MessagesStorage {
|
|||||||
if (!dialogs.dialogs.isEmpty()) {
|
if (!dialogs.dialogs.isEmpty()) {
|
||||||
SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
SQLitePreparedStatement state = database.executeFast("REPLACE INTO messages VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO dialogs(did, date, unread_count, last_mid) VALUES(?, ?, ?, ?)");
|
SQLitePreparedStatement state2 = database.executeFast("REPLACE INTO dialogs(did, date, unread_count, last_mid) VALUES(?, ?, ?, ?)");
|
||||||
SQLitePreparedStatement state3 = database.executeFast("REPLACE INTO media VALUES(?, ?, ?, ?)");
|
SQLitePreparedStatement state3 = database.executeFast("REPLACE INTO media_v2 VALUES(?, ?, ?, ?, ?)");
|
||||||
SQLitePreparedStatement state4 = database.executeFast("REPLACE INTO dialog_settings VALUES(?, ?)");
|
SQLitePreparedStatement state4 = database.executeFast("REPLACE INTO dialog_settings VALUES(?, ?)");
|
||||||
|
|
||||||
for (TLRPC.TL_dialog dialog : dialogs.dialogs) {
|
for (TLRPC.TL_dialog dialog : dialogs.dialogs) {
|
||||||
@ -3717,12 +3624,13 @@ public class MessagesStorage {
|
|||||||
state4.bindInteger(2, dialog.notify_settings.mute_until != 0 ? 1 : 0);
|
state4.bindInteger(2, dialog.notify_settings.mute_until != 0 ? 1 : 0);
|
||||||
state4.step();
|
state4.step();
|
||||||
|
|
||||||
if (message.media instanceof TLRPC.TL_messageMediaVideo || message.media instanceof TLRPC.TL_messageMediaPhoto) {
|
if (SharedMediaQuery.canAddMessageToMedia(message)) {
|
||||||
state3.requery();
|
state3.requery();
|
||||||
state3.bindLong(1, message.id);
|
state3.bindLong(1, message.id);
|
||||||
state3.bindInteger(2, uid);
|
state3.bindInteger(2, uid);
|
||||||
state3.bindInteger(3, message.date);
|
state3.bindInteger(3, message.date);
|
||||||
state3.bindByteBuffer(4, data.buffer);
|
state3.bindInteger(4, SharedMediaQuery.getMediaType(message));
|
||||||
|
state3.bindByteBuffer(5, data.buffer);
|
||||||
state3.step();
|
state3.step();
|
||||||
}
|
}
|
||||||
buffersStorage.reuseFreeBuffer(data);
|
buffersStorage.reuseFreeBuffer(data);
|
||||||
|
@ -52,6 +52,8 @@ public class NotificationCenter {
|
|||||||
public static final int httpFileDidLoaded = totalEvents++;
|
public static final int httpFileDidLoaded = totalEvents++;
|
||||||
public static final int httpFileDidFailedLoad = totalEvents++;
|
public static final int httpFileDidFailedLoad = totalEvents++;
|
||||||
|
|
||||||
|
public static final int messageThumbGenerated = totalEvents++;
|
||||||
|
|
||||||
public static final int wallpapersDidLoaded = totalEvents++;
|
public static final int wallpapersDidLoaded = totalEvents++;
|
||||||
public static final int closeOtherAppActivities = totalEvents++;
|
public static final int closeOtherAppActivities = totalEvents++;
|
||||||
public static final int didUpdatedConnectionState = totalEvents++;
|
public static final int didUpdatedConnectionState = totalEvents++;
|
||||||
@ -70,16 +72,16 @@ public class NotificationCenter {
|
|||||||
public static final int FileNewChunkAvailable = totalEvents++;
|
public static final int FileNewChunkAvailable = totalEvents++;
|
||||||
public static final int FilePreparingFailed = totalEvents++;
|
public static final int FilePreparingFailed = totalEvents++;
|
||||||
|
|
||||||
public final static int audioProgressDidChanged = totalEvents++;
|
public static final int audioProgressDidChanged = totalEvents++;
|
||||||
public final static int audioDidReset = totalEvents++;
|
public static final int audioDidReset = totalEvents++;
|
||||||
public final static int recordProgressChanged = totalEvents++;
|
public static final int recordProgressChanged = totalEvents++;
|
||||||
public final static int recordStarted = totalEvents++;
|
public static final int recordStarted = totalEvents++;
|
||||||
public final static int recordStartError = totalEvents++;
|
public static final int recordStartError = totalEvents++;
|
||||||
public final static int recordStopped = totalEvents++;
|
public static final int recordStopped = totalEvents++;
|
||||||
public final static int screenshotTook = totalEvents++;
|
public static final int screenshotTook = totalEvents++;
|
||||||
public final static int albumsDidLoaded = totalEvents++;
|
public static final int albumsDidLoaded = totalEvents++;
|
||||||
public final static int audioDidSent = totalEvents++;
|
public static final int audioDidSent = totalEvents++;
|
||||||
public final static int audioDidStarted = totalEvents++;
|
public static final int audioDidStarted = totalEvents++;
|
||||||
public static final int audioRouteChanged = totalEvents++;
|
public static final int audioRouteChanged = totalEvents++;
|
||||||
|
|
||||||
final private HashMap<Integer, ArrayList<Object>> observers = new HashMap<>();
|
final private HashMap<Integer, ArrayList<Object>> observers = new HashMap<>();
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* This is the source code of Telegram for Android v. 2.0.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.android;
|
||||||
|
|
||||||
|
import android.app.IntentService;
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
public class NotificationDelay extends IntentService {
|
||||||
|
|
||||||
|
public NotificationDelay() {
|
||||||
|
super("NotificationDelay");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onHandleIntent(Intent intent) {
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
NotificationsController.getInstance().notificationDelayReached();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -31,6 +31,8 @@ import org.json.JSONObject;
|
|||||||
import org.telegram.messenger.ConnectionsManager;
|
import org.telegram.messenger.ConnectionsManager;
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
|
import org.telegram.messenger.RPCRequest;
|
||||||
|
import org.telegram.messenger.TLObject;
|
||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
import org.telegram.messenger.UserConfig;
|
import org.telegram.messenger.UserConfig;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
@ -57,6 +59,7 @@ public class NotificationsController {
|
|||||||
private int total_unread_count = 0;
|
private int total_unread_count = 0;
|
||||||
private int personal_count = 0;
|
private int personal_count = 0;
|
||||||
private boolean notifyCheck = false;
|
private boolean notifyCheck = false;
|
||||||
|
private int lastOnlineFromOtherDevice = 0;
|
||||||
|
|
||||||
private static volatile NotificationsController Instance = null;
|
private static volatile NotificationsController Instance = null;
|
||||||
public static NotificationsController getInstance() {
|
public static NotificationsController getInstance() {
|
||||||
@ -256,6 +259,27 @@ public class NotificationsController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void scheduleNotificationDelay(boolean onlineReason) {
|
||||||
|
try {
|
||||||
|
FileLog.e("tmessages", "delay notification start");
|
||||||
|
AlarmManager alarm = (AlarmManager) ApplicationLoader.applicationContext.getSystemService(Context.ALARM_SERVICE);
|
||||||
|
PendingIntent pintent = PendingIntent.getService(ApplicationLoader.applicationContext, 0, new Intent(ApplicationLoader.applicationContext, NotificationDelay.class), 0);
|
||||||
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
|
if (onlineReason) {
|
||||||
|
alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3 * 1000, pintent);
|
||||||
|
} else {
|
||||||
|
alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 500, pintent);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e("tmessages", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void notificationDelayReached() {
|
||||||
|
FileLog.e("tmessages", "delay reached");
|
||||||
|
showOrUpdateNotification(true);
|
||||||
|
}
|
||||||
|
|
||||||
protected void repeatNotificationMaybe() {
|
protected void repeatNotificationMaybe() {
|
||||||
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
|
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
|
||||||
if (hour >= 11 && hour <= 22) {
|
if (hour >= 11 && hour <= 22) {
|
||||||
@ -266,6 +290,15 @@ public class NotificationsController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLastOnlineFromOtherDevice(final int time) {
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
lastOnlineFromOtherDevice = time;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void showOrUpdateNotification(boolean notifyAboutLast) {
|
private void showOrUpdateNotification(boolean notifyAboutLast) {
|
||||||
if (!UserConfig.isClientActivated() || pushMessages.isEmpty()) {
|
if (!UserConfig.isClientActivated() || pushMessages.isEmpty()) {
|
||||||
dismissNotification();
|
dismissNotification();
|
||||||
@ -307,6 +340,12 @@ public class NotificationsController {
|
|||||||
|
|
||||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE);
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE);
|
||||||
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (notify_override == 3) {
|
||||||
|
int mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
if (mute_until >= ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
notify_override = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!notifyAboutLast || notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || chat_id != 0 && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0) {
|
if (!notifyAboutLast || notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || chat_id != 0 && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0) {
|
||||||
notifyDisabled = true;
|
notifyDisabled = true;
|
||||||
}
|
}
|
||||||
@ -490,7 +529,7 @@ public class NotificationsController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (photoPath != null) {
|
if (photoPath != null) {
|
||||||
BitmapDrawable img = ImageLoader.getInstance().getImageFromMemory(photoPath, null, "50_50", null);
|
BitmapDrawable img = ImageLoader.getInstance().getImageFromMemory(photoPath, null, "50_50");
|
||||||
if (img != null) {
|
if (img != null) {
|
||||||
mBuilder.setLargeIcon(img.getBitmap());
|
mBuilder.setLargeIcon(img.getBitmap());
|
||||||
}
|
}
|
||||||
@ -773,6 +812,12 @@ public class NotificationsController {
|
|||||||
popup = (int)dialog_id == 0 ? 0 : preferences.getInt(isChat ? "popupGroup" : "popupAll", 0);
|
popup = (int)dialog_id == 0 ? 0 : preferences.getInt(isChat ? "popupGroup" : "popupAll", 0);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (notify_override == 3) {
|
||||||
|
int mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
if (mute_until >= ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
notify_override = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || isChat && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
||||||
settingsCache.put(dialog_id, value);
|
settingsCache.put(dialog_id, value);
|
||||||
}
|
}
|
||||||
@ -808,6 +853,12 @@ public class NotificationsController {
|
|||||||
long dialog_id = entry.getKey();
|
long dialog_id = entry.getKey();
|
||||||
|
|
||||||
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (notify_override == 3) {
|
||||||
|
int mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
if (mute_until >= ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
notify_override = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
boolean canAddValue = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || ((int)dialog_id < 0) && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
boolean canAddValue = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || ((int)dialog_id < 0) && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
||||||
|
|
||||||
Integer currentCount = pushDialogs.get(dialog_id);
|
Integer currentCount = pushDialogs.get(dialog_id);
|
||||||
@ -842,6 +893,14 @@ public class NotificationsController {
|
|||||||
pushDialogs.put(dialog_id, newCount);
|
pushDialogs.put(dialog_id, newCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*if (old_unread_count != total_unread_count) { TODO
|
||||||
|
if (lastOnlineFromOtherDevice > ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
showOrUpdateNotification(false);
|
||||||
|
scheduleNotificationDelay(true);
|
||||||
|
} else {
|
||||||
|
showOrUpdateNotification(notifyCheck);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
if (old_unread_count != total_unread_count) {
|
if (old_unread_count != total_unread_count) {
|
||||||
showOrUpdateNotification(notifyCheck);
|
showOrUpdateNotification(notifyCheck);
|
||||||
}
|
}
|
||||||
@ -869,6 +928,12 @@ public class NotificationsController {
|
|||||||
Boolean value = settingsCache.get(dialog_id);
|
Boolean value = settingsCache.get(dialog_id);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (notify_override == 3) {
|
||||||
|
int mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
if (mute_until >= ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
notify_override = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || ((int) dialog_id < 0) && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || ((int) dialog_id < 0) && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
||||||
settingsCache.put(dialog_id, value);
|
settingsCache.put(dialog_id, value);
|
||||||
}
|
}
|
||||||
@ -884,7 +949,7 @@ public class NotificationsController {
|
|||||||
if (pushMessagesDict.containsKey(message.id)) {
|
if (pushMessagesDict.containsKey(message.id)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
MessageObject messageObject = new MessageObject(message, null, 0);
|
MessageObject messageObject = new MessageObject(message, null, false);
|
||||||
if (isPersonalMessage(messageObject)) {
|
if (isPersonalMessage(messageObject)) {
|
||||||
personal_count++;
|
personal_count++;
|
||||||
}
|
}
|
||||||
@ -892,6 +957,12 @@ public class NotificationsController {
|
|||||||
Boolean value = settingsCache.get(dialog_id);
|
Boolean value = settingsCache.get(dialog_id);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
int notify_override = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (notify_override == 3) {
|
||||||
|
int mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
if (mute_until >= ConnectionsManager.getInstance().getCurrentTime()) {
|
||||||
|
notify_override = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || ((int) dialog_id < 0) && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
value = !(notify_override == 2 || (!preferences.getBoolean("EnableAll", true) || ((int) dialog_id < 0) && !preferences.getBoolean("EnableGroup", true)) && notify_override == 0);
|
||||||
settingsCache.put(dialog_id, value);
|
settingsCache.put(dialog_id, value);
|
||||||
}
|
}
|
||||||
@ -957,4 +1028,49 @@ public class NotificationsController {
|
|||||||
return messageObject.messageOwner.to_id != null && messageObject.messageOwner.to_id.chat_id == 0
|
return messageObject.messageOwner.to_id != null && messageObject.messageOwner.to_id.chat_id == 0
|
||||||
&& (messageObject.messageOwner.action == null || messageObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty);
|
&& (messageObject.messageOwner.action == null || messageObject.messageOwner.action instanceof TLRPC.TL_messageActionEmpty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void updateServerNotificationsSettings(long dialog_id) {
|
||||||
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.notificationsSettingsUpdated);
|
||||||
|
if ((int)dialog_id == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
|
TLRPC.TL_account_updateNotifySettings req = new TLRPC.TL_account_updateNotifySettings();
|
||||||
|
req.settings = new TLRPC.TL_inputPeerNotifySettings();
|
||||||
|
req.settings.sound = "default";
|
||||||
|
req.settings.events_mask = 0;
|
||||||
|
int mute_type = preferences.getInt("notify2_" + dialog_id, 0);
|
||||||
|
if (mute_type == 3) {
|
||||||
|
req.settings.mute_until = preferences.getInt("notifyuntil_" + dialog_id, 0);
|
||||||
|
} else {
|
||||||
|
req.settings.mute_until = mute_type != 2 ? 0 : Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
req.settings.show_previews = preferences.getBoolean("preview_" + dialog_id, true);
|
||||||
|
|
||||||
|
req.peer = new TLRPC.TL_inputNotifyPeer();
|
||||||
|
|
||||||
|
if ((int)dialog_id < 0) {
|
||||||
|
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerChat();
|
||||||
|
((TLRPC.TL_inputNotifyPeer)req.peer).peer.chat_id = -(int)dialog_id;
|
||||||
|
} else {
|
||||||
|
TLRPC.User user = MessagesController.getInstance().getUser((int)dialog_id);
|
||||||
|
if (user == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) {
|
||||||
|
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerForeign();
|
||||||
|
((TLRPC.TL_inputNotifyPeer)req.peer).peer.access_hash = user.access_hash;
|
||||||
|
} else {
|
||||||
|
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerContact();
|
||||||
|
}
|
||||||
|
((TLRPC.TL_inputNotifyPeer)req.peer).peer.user_id = (int)dialog_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
||||||
|
@Override
|
||||||
|
public void run(TLObject response, TLRPC.TL_error error) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* This is the source code of Telegram for Android v. 1.3.2.
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.telegram.android;
|
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
|
|
||||||
import org.telegram.messenger.FileLog;
|
|
||||||
import org.telegram.messenger.TLRPC;
|
|
||||||
import org.telegram.messenger.Utilities;
|
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public class PhotoObject {
|
|
||||||
|
|
||||||
public TLRPC.PhotoSize photoOwner;
|
|
||||||
public Bitmap image;
|
|
||||||
|
|
||||||
public PhotoObject(TLRPC.PhotoSize photo, int preview, boolean secret) {
|
|
||||||
photoOwner = photo;
|
|
||||||
|
|
||||||
if (preview != 0 && photo instanceof TLRPC.TL_photoCachedSize) {
|
|
||||||
BitmapFactory.Options opts = new BitmapFactory.Options();
|
|
||||||
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
|
|
||||||
opts.inDither = false;
|
|
||||||
opts.outWidth = photo.w;
|
|
||||||
opts.outHeight = photo.h;
|
|
||||||
try {
|
|
||||||
if (photo.location.ext != null) {
|
|
||||||
ByteBuffer buffer = ByteBuffer.allocateDirect(photo.bytes.length);
|
|
||||||
buffer.put(photo.bytes);
|
|
||||||
image = Utilities.loadWebpImage(buffer, buffer.limit(), null);
|
|
||||||
} else {
|
|
||||||
image = BitmapFactory.decodeByteArray(photoOwner.bytes, 0, photoOwner.bytes.length, opts);
|
|
||||||
}
|
|
||||||
if (image != null) {
|
|
||||||
if (preview == 2) {
|
|
||||||
if (secret) {
|
|
||||||
Utilities.blurBitmap(image, 7);
|
|
||||||
Utilities.blurBitmap(image, 7);
|
|
||||||
Utilities.blurBitmap(image, 7);
|
|
||||||
} else {
|
|
||||||
if (photo.location.ext != null) {
|
|
||||||
Utilities.blurBitmap(image, 1);
|
|
||||||
} else {
|
|
||||||
Utilities.blurBitmap(image, 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ImageLoader.getInstance().runtimeHack != null) {
|
|
||||||
ImageLoader.getInstance().runtimeHack.trackFree(image.getRowBytes() * image.getHeight());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Throwable throwable) {
|
|
||||||
FileLog.e("tmessages", throwable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PhotoObject getClosestImageWithSize(ArrayList<PhotoObject> arr, int side) {
|
|
||||||
if (arr == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lastSide = 0;
|
|
||||||
PhotoObject closestObject = null;
|
|
||||||
for (PhotoObject obj : arr) {
|
|
||||||
if (obj == null || obj.photoOwner == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int currentSide = obj.photoOwner.w >= obj.photoOwner.h ? obj.photoOwner.w : obj.photoOwner.h;
|
|
||||||
if (closestObject == null || closestObject.photoOwner instanceof TLRPC.TL_photoCachedSize || currentSide <= side && lastSide < currentSide) {
|
|
||||||
closestObject = obj;
|
|
||||||
lastSide = currentSide;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return closestObject;
|
|
||||||
}
|
|
||||||
}
|
|
@ -478,7 +478,7 @@ public class SecretChatHelper {
|
|||||||
reqSend.action.ttl_seconds = encryptedChat.ttl;
|
reqSend.action.ttl_seconds = encryptedChat.ttl;
|
||||||
message = createServiceSecretMessage(encryptedChat, reqSend.action);
|
message = createServiceSecretMessage(encryptedChat, reqSend.action);
|
||||||
|
|
||||||
MessageObject newMsgObj = new MessageObject(message, null);
|
MessageObject newMsgObj = new MessageObject(message, null, false);
|
||||||
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
|
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
|
||||||
ArrayList<MessageObject> objArr = new ArrayList<>();
|
ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||||
objArr.add(newMsgObj);
|
objArr.add(newMsgObj);
|
||||||
@ -514,7 +514,7 @@ public class SecretChatHelper {
|
|||||||
reqSend.action.random_ids = random_ids;
|
reqSend.action.random_ids = random_ids;
|
||||||
message = createServiceSecretMessage(encryptedChat, reqSend.action);
|
message = createServiceSecretMessage(encryptedChat, reqSend.action);
|
||||||
|
|
||||||
MessageObject newMsgObj = new MessageObject(message, null);
|
MessageObject newMsgObj = new MessageObject(message, null, false);
|
||||||
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
|
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
|
||||||
ArrayList<MessageObject> objArr = new ArrayList<>();
|
ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||||
objArr.add(newMsgObj);
|
objArr.add(newMsgObj);
|
||||||
@ -547,7 +547,7 @@ public class SecretChatHelper {
|
|||||||
arr.add(newMsg);
|
arr.add(newMsg);
|
||||||
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
|
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
|
||||||
|
|
||||||
MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.photo, 3);
|
//MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.photo, 3);
|
||||||
} else if (newMsg.media instanceof TLRPC.TL_messageMediaVideo && newMsg.media.video != null) {
|
} else if (newMsg.media instanceof TLRPC.TL_messageMediaVideo && newMsg.media.video != null) {
|
||||||
TLRPC.Video video = newMsg.media.video;
|
TLRPC.Video video = newMsg.media.video;
|
||||||
newMsg.media.video = new TLRPC.TL_videoEncrypted();
|
newMsg.media.video = new TLRPC.TL_videoEncrypted();
|
||||||
@ -578,7 +578,7 @@ public class SecretChatHelper {
|
|||||||
arr.add(newMsg);
|
arr.add(newMsg);
|
||||||
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
|
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
|
||||||
|
|
||||||
MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.video, 5);
|
//MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.video, 5);
|
||||||
} else if (newMsg.media instanceof TLRPC.TL_messageMediaDocument && newMsg.media.document != null) {
|
} else if (newMsg.media instanceof TLRPC.TL_messageMediaDocument && newMsg.media.document != null) {
|
||||||
TLRPC.Document document = newMsg.media.document;
|
TLRPC.Document document = newMsg.media.document;
|
||||||
newMsg.media.document = new TLRPC.TL_documentEncrypted();
|
newMsg.media.document = new TLRPC.TL_documentEncrypted();
|
||||||
@ -605,7 +605,7 @@ public class SecretChatHelper {
|
|||||||
arr.add(newMsg);
|
arr.add(newMsg);
|
||||||
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
|
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
|
||||||
|
|
||||||
MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.document, 4);
|
//MessagesStorage.getInstance().putSentFile(originalPath, newMsg.media.document, 4);
|
||||||
} else if (newMsg.media instanceof TLRPC.TL_messageMediaAudio && newMsg.media.audio != null) {
|
} else if (newMsg.media instanceof TLRPC.TL_messageMediaAudio && newMsg.media.audio != null) {
|
||||||
TLRPC.Audio audio = newMsg.media.audio;
|
TLRPC.Audio audio = newMsg.media.audio;
|
||||||
newMsg.media.audio = new TLRPC.TL_audioEncrypted();
|
newMsg.media.audio = new TLRPC.TL_audioEncrypted();
|
||||||
@ -656,7 +656,8 @@ public class SecretChatHelper {
|
|||||||
TLObject toEncryptObject = null;
|
TLObject toEncryptObject = null;
|
||||||
if (AndroidUtilities.getPeerLayerVersion(chat.layer) >= 17) {
|
if (AndroidUtilities.getPeerLayerVersion(chat.layer) >= 17) {
|
||||||
TLRPC.TL_decryptedMessageLayer layer = new TLRPC.TL_decryptedMessageLayer();
|
TLRPC.TL_decryptedMessageLayer layer = new TLRPC.TL_decryptedMessageLayer();
|
||||||
layer.layer = Math.min(17, AndroidUtilities.getPeerLayerVersion(chat.layer));
|
int myLayer = Math.max(17, AndroidUtilities.getMyLayerVersion(chat.layer));
|
||||||
|
layer.layer = Math.min(myLayer, AndroidUtilities.getPeerLayerVersion(chat.layer));
|
||||||
layer.message = req;
|
layer.message = req;
|
||||||
layer.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))];
|
layer.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))];
|
||||||
Utilities.random.nextBytes(layer.random_bytes);
|
Utilities.random.nextBytes(layer.random_bytes);
|
||||||
@ -698,6 +699,7 @@ public class SecretChatHelper {
|
|||||||
toEncryptObject = req;
|
toEncryptObject = req;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int len = toEncryptObject.getObjectSize();
|
int len = toEncryptObject.getObjectSize();
|
||||||
ByteBufferDesc toEncrypt = BuffersStorage.getInstance().getFreeBuffer(4 + len);
|
ByteBufferDesc toEncrypt = BuffersStorage.getInstance().getFreeBuffer(4 + len);
|
||||||
toEncrypt.writeInt32(len);
|
toEncrypt.writeInt32(len);
|
||||||
|
@ -301,7 +301,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
public void run() {
|
public void run() {
|
||||||
if (message.documentLocation.thumb.location instanceof TLRPC.TL_fileLocationUnavailable) {
|
if (message.documentLocation.thumb.location instanceof TLRPC.TL_fileLocationUnavailable) {
|
||||||
try {
|
try {
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(cacheFile.getAbsolutePath(), null, 90, 90);
|
Bitmap bitmap = ImageLoader.loadBitmap(cacheFile.getAbsolutePath(), null, 90, 90, true);
|
||||||
if (bitmap != null) {
|
if (bitmap != null) {
|
||||||
message.documentLocation.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, message.sendEncryptedRequest != null);
|
message.documentLocation.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, message.sendEncryptedRequest != null);
|
||||||
}
|
}
|
||||||
@ -753,7 +753,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageObject newMsgObj = new MessageObject(newMsg, null, 2);
|
MessageObject newMsgObj = new MessageObject(newMsg, null, true);
|
||||||
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
|
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
|
||||||
|
|
||||||
ArrayList<MessageObject> objArr = new ArrayList<>();
|
ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||||
@ -1302,7 +1302,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
if (isBroadcast) {
|
if (isBroadcast) {
|
||||||
for (TLRPC.Message message : sentMessages) {
|
for (TLRPC.Message message : sentMessages) {
|
||||||
ArrayList<MessageObject> arr = new ArrayList<>();
|
ArrayList<MessageObject> arr = new ArrayList<>();
|
||||||
MessageObject messageObject = new MessageObject(message, null, 0);
|
MessageObject messageObject = new MessageObject(message, null, false);
|
||||||
arr.add(messageObject);
|
arr.add(messageObject);
|
||||||
MessagesController.getInstance().updateInterfaceWithMessages(messageObject.getDialogId(), arr, isBroadcast);
|
MessagesController.getInstance().updateInterfaceWithMessages(messageObject.getDialogId(), arr, isBroadcast);
|
||||||
}
|
}
|
||||||
@ -1369,7 +1369,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName + ".jpg");
|
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName + ".jpg");
|
||||||
File cacheFile2 = null;
|
File cacheFile2 = null;
|
||||||
if (sentMessage.media.photo.sizes.size() == 1 || size.w > 80 || size.h > 80) {
|
if (sentMessage.media.photo.sizes.size() == 1 || size.w > 90 || size.h > 90) {
|
||||||
cacheFile2 = FileLoader.getPathToAttach(size);
|
cacheFile2 = FileLoader.getPathToAttach(size);
|
||||||
} else {
|
} else {
|
||||||
cacheFile2 = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName2 + ".jpg");
|
cacheFile2 = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName2 + ".jpg");
|
||||||
@ -1431,6 +1431,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
ImageLoader.getInstance().replaceImageInCache(fileName, fileName2);
|
ImageLoader.getInstance().replaceImageInCache(fileName, fileName2);
|
||||||
size2.location = size.location;
|
size2.location = size.location;
|
||||||
}
|
}
|
||||||
|
} else if (MessageObject.isStickerMessage(sentMessage) && size2.location != null) {
|
||||||
|
size.location = size2.location;
|
||||||
}
|
}
|
||||||
|
|
||||||
newMsg.media.document.dc_id = sentMessage.media.document.dc_id;
|
newMsg.media.document.dc_id = sentMessage.media.document.dc_id;
|
||||||
@ -1501,7 +1503,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
MessagesController.getInstance().putChats(chats, true);
|
MessagesController.getInstance().putChats(chats, true);
|
||||||
MessagesController.getInstance().putEncryptedChats(encryptedChats, true);
|
MessagesController.getInstance().putEncryptedChats(encryptedChats, true);
|
||||||
for (TLRPC.Message message : messages) {
|
for (TLRPC.Message message : messages) {
|
||||||
MessageObject messageObject = new MessageObject(message, null, 0);
|
MessageObject messageObject = new MessageObject(message, null, false);
|
||||||
retrySendMessage(messageObject, true);
|
retrySendMessage(messageObject, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1509,9 +1511,9 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TLRPC.TL_photo generatePhotoSizes(String path, Uri imageUri) {
|
public TLRPC.TL_photo generatePhotoSizes(String path, Uri imageUri) {
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(path, imageUri, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize());
|
Bitmap bitmap = ImageLoader.loadBitmap(path, imageUri, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), true);
|
||||||
if (bitmap == null && AndroidUtilities.getPhotoSize() != 800) {
|
if (bitmap == null && AndroidUtilities.getPhotoSize() != 800) {
|
||||||
bitmap = ImageLoader.loadBitmap(path, imageUri, 800, 800);
|
bitmap = ImageLoader.loadBitmap(path, imageUri, 800, 800, true);
|
||||||
}
|
}
|
||||||
ArrayList<TLRPC.PhotoSize> sizes = new ArrayList<>();
|
ArrayList<TLRPC.PhotoSize> sizes = new ArrayList<>();
|
||||||
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, true);
|
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, true);
|
||||||
@ -1578,9 +1580,12 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
originalPath += "" + f.length();
|
originalPath += "" + f.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
TLRPC.TL_document document = (TLRPC.TL_document)MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 1 : 4);
|
TLRPC.TL_document document = null;
|
||||||
if (document == null && !path.equals(originalPath)) {
|
if (!isEncrypted) {
|
||||||
document = (TLRPC.TL_document)MessagesStorage.getInstance().getSentFile(path + f.length(), !isEncrypted ? 1 : 4);
|
document = (TLRPC.TL_document) MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 1 : 4);
|
||||||
|
if (document == null && !path.equals(originalPath) && !isEncrypted) {
|
||||||
|
document = (TLRPC.TL_document) MessagesStorage.getInstance().getSentFile(path + f.length(), !isEncrypted ? 1 : 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (document == null) {
|
if (document == null) {
|
||||||
document = new TLRPC.TL_document();
|
document = new TLRPC.TL_document();
|
||||||
@ -1603,7 +1608,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
if (document.mime_type.equals("image/gif")) {
|
if (document.mime_type.equals("image/gif")) {
|
||||||
try {
|
try {
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(f.getAbsolutePath(), null, 90, 90);
|
Bitmap bitmap = ImageLoader.loadBitmap(f.getAbsolutePath(), null, 90, 90, true);
|
||||||
if (bitmap != null) {
|
if (bitmap != null) {
|
||||||
document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted);
|
document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted);
|
||||||
}
|
}
|
||||||
@ -1727,7 +1732,10 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
boolean isEncrypted = (int)dialog_id == 0;
|
boolean isEncrypted = (int)dialog_id == 0;
|
||||||
for (final MediaController.SearchImage searchImage : photos) {
|
for (final MediaController.SearchImage searchImage : photos) {
|
||||||
if (searchImage.type == 1) {
|
if (searchImage.type == 1) {
|
||||||
TLRPC.TL_document document = (TLRPC.TL_document)MessagesStorage.getInstance().getSentFile(searchImage.imageUrl, !isEncrypted ? 1 : 4);
|
TLRPC.TL_document document = null;
|
||||||
|
if (!isEncrypted) {
|
||||||
|
document = (TLRPC.TL_document) MessagesStorage.getInstance().getSentFile(searchImage.imageUrl, !isEncrypted ? 1 : 4);
|
||||||
|
}
|
||||||
String md5 = Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
|
String md5 = Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
|
||||||
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
|
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
|
||||||
if (document == null) {
|
if (document == null) {
|
||||||
@ -1753,7 +1761,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
}
|
}
|
||||||
if (thumbFile != null) {
|
if (thumbFile != null) {
|
||||||
try {
|
try {
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(thumbFile.getAbsolutePath(), null, 90, 90);
|
Bitmap bitmap = ImageLoader.loadBitmap(thumbFile.getAbsolutePath(), null, 90, 90, true);
|
||||||
if (bitmap != null) {
|
if (bitmap != null) {
|
||||||
document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted);
|
document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted);
|
||||||
}
|
}
|
||||||
@ -1781,7 +1789,10 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
boolean needDownloadHttp = true;
|
boolean needDownloadHttp = true;
|
||||||
TLRPC.TL_photo photo = (TLRPC.TL_photo) MessagesStorage.getInstance().getSentFile(searchImage.imageUrl, !isEncrypted ? 0 : 3);
|
TLRPC.TL_photo photo = null;
|
||||||
|
if (!isEncrypted) {
|
||||||
|
photo = (TLRPC.TL_photo) MessagesStorage.getInstance().getSentFile(searchImage.imageUrl, !isEncrypted ? 0 : 3);
|
||||||
|
}
|
||||||
if (photo == null) {
|
if (photo == null) {
|
||||||
String md5 = Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
|
String md5 = Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
|
||||||
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
|
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
|
||||||
@ -1891,9 +1902,12 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
} else {
|
} else {
|
||||||
originalPath = null;
|
originalPath = null;
|
||||||
}
|
}
|
||||||
TLRPC.TL_photo photo = (TLRPC.TL_photo)MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 0 : 3);
|
TLRPC.TL_photo photo = null;
|
||||||
if (photo == null && uri != null) {
|
if (!isEncrypted) {
|
||||||
photo = (TLRPC.TL_photo)MessagesStorage.getInstance().getSentFile(Utilities.getPath(uri), !isEncrypted ? 0 : 3);
|
photo = (TLRPC.TL_photo) MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 0 : 3);
|
||||||
|
if (photo == null && uri != null) {
|
||||||
|
photo = (TLRPC.TL_photo) MessagesStorage.getInstance().getSentFile(Utilities.getPath(uri), !isEncrypted ? 0 : 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (photo == null) {
|
if (photo == null) {
|
||||||
photo = SendMessagesHelper.getInstance().generatePhotoSizes(path, uri);
|
photo = SendMessagesHelper.getInstance().generatePhotoSizes(path, uri);
|
||||||
@ -1935,7 +1949,10 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||||||
if (videoEditedInfo != null) {
|
if (videoEditedInfo != null) {
|
||||||
originalPath += duration + "_" + videoEditedInfo.startTime + "_" + videoEditedInfo.endTime;
|
originalPath += duration + "_" + videoEditedInfo.startTime + "_" + videoEditedInfo.endTime;
|
||||||
}
|
}
|
||||||
TLRPC.TL_video video = (TLRPC.TL_video)MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 2 : 5);
|
TLRPC.TL_video video = null;
|
||||||
|
if (!isEncrypted) {
|
||||||
|
video = (TLRPC.TL_video) MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 2 : 5);
|
||||||
|
}
|
||||||
if (video == null) {
|
if (video == null) {
|
||||||
Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MINI_KIND);
|
Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MINI_KIND);
|
||||||
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(thumb, 90, 90, 55, isEncrypted);
|
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(thumb, 90, 90, 55, isEncrypted);
|
||||||
|
@ -0,0 +1,398 @@
|
|||||||
|
/*
|
||||||
|
* This is the source code of Telegram for Android v. 2.0.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.android.query;
|
||||||
|
|
||||||
|
import org.telegram.SQLite.SQLiteCursor;
|
||||||
|
import org.telegram.SQLite.SQLitePreparedStatement;
|
||||||
|
import org.telegram.android.AndroidUtilities;
|
||||||
|
import org.telegram.android.ImageLoader;
|
||||||
|
import org.telegram.android.MessageObject;
|
||||||
|
import org.telegram.android.MessagesController;
|
||||||
|
import org.telegram.android.MessagesStorage;
|
||||||
|
import org.telegram.android.NotificationCenter;
|
||||||
|
import org.telegram.messenger.ByteBufferDesc;
|
||||||
|
import org.telegram.messenger.ConnectionsManager;
|
||||||
|
import org.telegram.messenger.FileLog;
|
||||||
|
import org.telegram.messenger.RPCRequest;
|
||||||
|
import org.telegram.messenger.TLClassStore;
|
||||||
|
import org.telegram.messenger.TLObject;
|
||||||
|
import org.telegram.messenger.TLRPC;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class SharedMediaQuery {
|
||||||
|
|
||||||
|
public final static int MEDIA_PHOTOVIDEO = 0;
|
||||||
|
public final static int MEDIA_FILE = 1;
|
||||||
|
public final static int MEDIA_AUDIO = 2;
|
||||||
|
|
||||||
|
public static void loadMedia(final long uid, final int offset, final int count, final int max_id, final int type, final boolean fromCache, final int classGuid) {
|
||||||
|
int lower_part = (int)uid;
|
||||||
|
if (fromCache || lower_part == 0) {
|
||||||
|
loadMediaDatabase(uid, offset, count, max_id, type, classGuid);
|
||||||
|
} else {
|
||||||
|
TLRPC.TL_messages_search req = new TLRPC.TL_messages_search();
|
||||||
|
req.offset = offset;
|
||||||
|
req.limit = count;
|
||||||
|
req.max_id = max_id;
|
||||||
|
if (type == MEDIA_PHOTOVIDEO) {
|
||||||
|
req.filter = new TLRPC.TL_inputMessagesFilterPhotoVideo();
|
||||||
|
} else if (type == MEDIA_FILE) {
|
||||||
|
req.filter = new TLRPC.TL_inputMessagesFilterDocument();
|
||||||
|
} else if (type == MEDIA_AUDIO) {
|
||||||
|
req.filter = new TLRPC.TL_inputMessagesFilterAudio();
|
||||||
|
}
|
||||||
|
req.q = "";
|
||||||
|
if (uid < 0) {
|
||||||
|
req.peer = new TLRPC.TL_inputPeerChat();
|
||||||
|
req.peer.chat_id = -lower_part;
|
||||||
|
} else {
|
||||||
|
TLRPC.User user = MessagesController.getInstance().getUser(lower_part);
|
||||||
|
if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) {
|
||||||
|
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||||
|
req.peer.access_hash = user.access_hash;
|
||||||
|
} else {
|
||||||
|
req.peer = new TLRPC.TL_inputPeerContact();
|
||||||
|
}
|
||||||
|
req.peer.user_id = lower_part;
|
||||||
|
}
|
||||||
|
long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
||||||
|
@Override
|
||||||
|
public void run(TLObject response, TLRPC.TL_error error) {
|
||||||
|
if (error == null) {
|
||||||
|
final TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
|
||||||
|
processLoadedMedia(res, uid, offset, count, max_id, type, false, classGuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void getMediaCount(final long uid, final int type, final int classGuid, boolean fromCache) {
|
||||||
|
int lower_part = (int)uid;
|
||||||
|
if (fromCache || lower_part == 0) {
|
||||||
|
getMediaCountDatabase(uid, type, classGuid);
|
||||||
|
} else {
|
||||||
|
TLRPC.TL_messages_search req = new TLRPC.TL_messages_search();
|
||||||
|
req.offset = 0;
|
||||||
|
req.limit = 1;
|
||||||
|
req.max_id = 0;
|
||||||
|
if (type == MEDIA_PHOTOVIDEO) {
|
||||||
|
req.filter = new TLRPC.TL_inputMessagesFilterPhotoVideo();
|
||||||
|
} else if (type == MEDIA_FILE) {
|
||||||
|
req.filter = new TLRPC.TL_inputMessagesFilterDocument();
|
||||||
|
} else if (type == MEDIA_AUDIO) {
|
||||||
|
req.filter = new TLRPC.TL_inputMessagesFilterAudio();
|
||||||
|
}
|
||||||
|
req.q = "";
|
||||||
|
if (uid < 0) {
|
||||||
|
req.peer = new TLRPC.TL_inputPeerChat();
|
||||||
|
req.peer.chat_id = -lower_part;
|
||||||
|
} else {
|
||||||
|
TLRPC.User user = MessagesController.getInstance().getUser(lower_part);
|
||||||
|
if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) {
|
||||||
|
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||||
|
req.peer.access_hash = user.access_hash;
|
||||||
|
} else {
|
||||||
|
req.peer = new TLRPC.TL_inputPeerContact();
|
||||||
|
}
|
||||||
|
req.peer.user_id = lower_part;
|
||||||
|
}
|
||||||
|
long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
||||||
|
@Override
|
||||||
|
public void run(TLObject response, TLRPC.TL_error error) {
|
||||||
|
if (error == null) {
|
||||||
|
final TLRPC.messages_Messages res = (TLRPC.messages_Messages) response;
|
||||||
|
MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true);
|
||||||
|
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
MessagesController.getInstance().putUsers(res.users, false);
|
||||||
|
MessagesController.getInstance().putChats(res.chats, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (res instanceof TLRPC.TL_messages_messagesSlice) {
|
||||||
|
processLoadedMediaCount(res.count, uid, type, classGuid, false);
|
||||||
|
} else {
|
||||||
|
processLoadedMediaCount(res.messages.size(), uid, type, classGuid, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMediaType(TLRPC.Message message) {
|
||||||
|
if (message == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo) {
|
||||||
|
return SharedMediaQuery.MEDIA_PHOTOVIDEO;
|
||||||
|
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
|
||||||
|
if (MessageObject.isStickerMessage(message)) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return SharedMediaQuery.MEDIA_FILE;
|
||||||
|
}
|
||||||
|
} else if (message.media instanceof TLRPC.TL_messageMediaAudio) {
|
||||||
|
return SharedMediaQuery.MEDIA_AUDIO;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean canAddMessageToMedia(TLRPC.Message message) {
|
||||||
|
if (message instanceof TLRPC.TL_message_secret && message.media instanceof TLRPC.TL_messageMediaPhoto && message.ttl != 0 && message.ttl <= 60) {
|
||||||
|
return false;
|
||||||
|
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo || message.media instanceof TLRPC.TL_messageMediaDocument || message.media instanceof TLRPC.TL_messageMediaAudio) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void processLoadedMedia(final TLRPC.messages_Messages res, final long uid, int offset, int count, int max_id, final int type, final boolean fromCache, final int classGuid) {
|
||||||
|
int lower_part = (int)uid;
|
||||||
|
if (fromCache && res.messages.isEmpty() && lower_part != 0) {
|
||||||
|
loadMedia(uid, offset, count, max_id, type, false, classGuid);
|
||||||
|
} else {
|
||||||
|
if (!fromCache) {
|
||||||
|
ImageLoader.saveMessagesThumbs(res.messages);
|
||||||
|
MessagesStorage.getInstance().putUsersAndChats(res.users, res.chats, true, true);
|
||||||
|
putMediaDatabase(uid, type, res.messages);
|
||||||
|
}
|
||||||
|
|
||||||
|
final HashMap<Integer, TLRPC.User> usersLocal = new HashMap<>();
|
||||||
|
for (TLRPC.User u : res.users) {
|
||||||
|
usersLocal.put(u.id, u);
|
||||||
|
}
|
||||||
|
final ArrayList<MessageObject> objects = new ArrayList<>();
|
||||||
|
for (TLRPC.Message message : res.messages) {
|
||||||
|
objects.add(new MessageObject(message, usersLocal, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int totalCount;
|
||||||
|
if (res instanceof TLRPC.TL_messages_messagesSlice) {
|
||||||
|
totalCount = res.count;
|
||||||
|
} else {
|
||||||
|
totalCount = res.messages.size();
|
||||||
|
}
|
||||||
|
MessagesController.getInstance().putUsers(res.users, fromCache);
|
||||||
|
MessagesController.getInstance().putChats(res.chats, fromCache);
|
||||||
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.mediaDidLoaded, uid, totalCount, objects, fromCache, classGuid, type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void processLoadedMediaCount(final int count, final long uid, final int type, final int classGuid, final boolean fromCache) {
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int lower_part = (int)uid;
|
||||||
|
if (fromCache && count == -1 && lower_part != 0) {
|
||||||
|
getMediaCount(uid, type, classGuid, false);
|
||||||
|
} else {
|
||||||
|
if (!fromCache) {
|
||||||
|
putMediaCountDatabase(uid, type, count);
|
||||||
|
}
|
||||||
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.mediaCountDidLoaded, uid, (fromCache && count == -1 ? 0 : count), fromCache, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void putMediaCountDatabase(final long uid, final int type, final int count) {
|
||||||
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
SQLitePreparedStatement state2 = MessagesStorage.getInstance().getDatabase().executeFast("REPLACE INTO media_counts_v2 VALUES(?, ?, ?)");
|
||||||
|
state2.requery();
|
||||||
|
state2.bindLong(1, uid);
|
||||||
|
state2.bindInteger(2, type);
|
||||||
|
state2.bindInteger(3, count);
|
||||||
|
state2.step();
|
||||||
|
state2.dispose();
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e("tmessages", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void getMediaCountDatabase(final long uid, final int type, final int classGuid) {
|
||||||
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
int count = -1;
|
||||||
|
SQLiteCursor cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT count FROM media_counts_v2 WHERE uid = %d AND type = %d LIMIT 1", uid, type));
|
||||||
|
if (cursor.next()) {
|
||||||
|
count = cursor.intValue(0);
|
||||||
|
}
|
||||||
|
cursor.dispose();
|
||||||
|
int lower_part = (int)uid;
|
||||||
|
if (count == -1 && lower_part == 0) {
|
||||||
|
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM media_v2 WHERE uid = %d AND type = %d LIMIT 1", uid, type));
|
||||||
|
if (cursor.next()) {
|
||||||
|
count = cursor.intValue(0);
|
||||||
|
}
|
||||||
|
cursor.dispose();
|
||||||
|
|
||||||
|
/*cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, send_state, date FROM messages WHERE uid = %d ORDER BY mid ASC LIMIT %d", uid, 1000));
|
||||||
|
ArrayList<TLRPC.Message> photos = new ArrayList<>();
|
||||||
|
ArrayList<TLRPC.Message> docs = new ArrayList<>();
|
||||||
|
while (cursor.next()) {
|
||||||
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(1));
|
||||||
|
if (data != null && cursor.byteBufferValue(1, data.buffer) != 0) {
|
||||||
|
TLRPC.Message message = (TLRPC.Message) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
||||||
|
MessageObject.setIsUnread(message, cursor.intValue(0) != 1);
|
||||||
|
message.date = cursor.intValue(2);
|
||||||
|
message.send_state = cursor.intValue(1);
|
||||||
|
message.dialog_id = uid;
|
||||||
|
if (message.ttl > 60 && message.media instanceof TLRPC.TL_messageMediaPhoto || message.media instanceof TLRPC.TL_messageMediaVideo) {
|
||||||
|
photos.add(message);
|
||||||
|
} else if (message.media instanceof TLRPC.TL_messageMediaDocument) {
|
||||||
|
docs.add(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
|
}
|
||||||
|
cursor.dispose();
|
||||||
|
if (!photos.isEmpty() || !docs.isEmpty()) {
|
||||||
|
MessagesStorage.getInstance().getDatabase().beginTransaction();
|
||||||
|
if (!photos.isEmpty()) {
|
||||||
|
putMediaDatabaseInternal(uid, MEDIA_PHOTOVIDEO, photos);
|
||||||
|
}
|
||||||
|
if (docs.isEmpty()) {
|
||||||
|
putMediaDatabaseInternal(uid, MEDIA_FILE, docs);
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().getDatabase().commitTransaction();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (count != -1) {
|
||||||
|
putMediaCountDatabase(uid, type, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
processLoadedMediaCount(count, uid, type, classGuid, true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e("tmessages", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void loadMediaDatabase(final long uid, final int offset, final int count, final int max_id, final int type, final int classGuid) {
|
||||||
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
TLRPC.TL_messages_messages res = new TLRPC.TL_messages_messages();
|
||||||
|
try {
|
||||||
|
ArrayList<Integer> loadedUsers = new ArrayList<>();
|
||||||
|
ArrayList<Integer> fromUser = new ArrayList<>();
|
||||||
|
|
||||||
|
SQLiteCursor cursor;
|
||||||
|
|
||||||
|
if ((int)uid != 0) {
|
||||||
|
if (max_id != 0) {
|
||||||
|
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, mid FROM media_v2 WHERE uid = %d AND mid < %d AND type = %d ORDER BY date DESC, mid DESC LIMIT %d", uid, max_id, type, count));
|
||||||
|
} else {
|
||||||
|
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, mid FROM media_v2 WHERE uid = %d AND type = %d ORDER BY date DESC, mid DESC LIMIT %d,%d", uid, type, offset, count));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (max_id != 0) {
|
||||||
|
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT m.data, m.mid, r.random_id FROM media_v2 as m LEFT JOIN randoms as r ON r.mid = m.mid WHERE m.uid = %d AND m.mid > %d AND type = %d ORDER BY m.mid ASC LIMIT %d", uid, max_id, type, count));
|
||||||
|
} else {
|
||||||
|
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT m.data, m.mid, r.random_id FROM media_v2 as m LEFT JOIN randoms as r ON r.mid = m.mid WHERE m.uid = %d AND type = %d ORDER BY m.mid ASC LIMIT %d,%d", uid, type, offset, count));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (cursor.next()) {
|
||||||
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
||||||
|
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
||||||
|
TLRPC.Message message = (TLRPC.Message) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
||||||
|
message.id = cursor.intValue(1);
|
||||||
|
message.dialog_id = uid;
|
||||||
|
if ((int)uid == 0) {
|
||||||
|
message.random_id = cursor.longValue(2);
|
||||||
|
}
|
||||||
|
res.messages.add(message);
|
||||||
|
fromUser.add(message.from_id);
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
|
}
|
||||||
|
cursor.dispose();
|
||||||
|
|
||||||
|
StringBuilder usersToLoad = new StringBuilder();
|
||||||
|
for (int uid : fromUser) {
|
||||||
|
if (!loadedUsers.contains(uid)) {
|
||||||
|
if (usersToLoad.length() != 0) {
|
||||||
|
usersToLoad.append(",");
|
||||||
|
}
|
||||||
|
usersToLoad.append(uid);
|
||||||
|
loadedUsers.add(uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (usersToLoad.length() != 0) {
|
||||||
|
MessagesStorage.getInstance().getUsersInternal(usersToLoad.toString(), res.users);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
res.messages.clear();
|
||||||
|
res.chats.clear();
|
||||||
|
res.users.clear();
|
||||||
|
FileLog.e("tmessages", e);
|
||||||
|
} finally {
|
||||||
|
processLoadedMedia(res, uid, offset, count, max_id, type, true, classGuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void putMediaDatabaseInternal(final long uid, final int type, final ArrayList<TLRPC.Message> messages) {
|
||||||
|
try {
|
||||||
|
MessagesStorage.getInstance().getDatabase().beginTransaction();
|
||||||
|
SQLitePreparedStatement state2 = MessagesStorage.getInstance().getDatabase().executeFast("REPLACE INTO media_v2 VALUES(?, ?, ?, ?, ?)");
|
||||||
|
for (TLRPC.Message message : messages) {
|
||||||
|
if (canAddMessageToMedia(message)) {
|
||||||
|
state2.requery();
|
||||||
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(message.getObjectSize());
|
||||||
|
message.serializeToStream(data);
|
||||||
|
state2.bindInteger(1, message.id);
|
||||||
|
state2.bindLong(2, uid);
|
||||||
|
state2.bindInteger(3, message.date);
|
||||||
|
state2.bindInteger(4, type);
|
||||||
|
state2.bindByteBuffer(5, data.buffer);
|
||||||
|
state2.step();
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state2.dispose();
|
||||||
|
MessagesStorage.getInstance().getDatabase().commitTransaction();
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e("tmessages", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void putMediaDatabase(final long uid, final int type, final ArrayList<TLRPC.Message> messages) {
|
||||||
|
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
putMediaDatabaseInternal(uid, type, messages);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,7 @@ import android.content.pm.PackageInfo;
|
|||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.os.PowerManager;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
|
||||||
import org.telegram.android.AndroidUtilities;
|
import org.telegram.android.AndroidUtilities;
|
||||||
@ -81,6 +82,8 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
|
|
||||||
private volatile long nextCallToken = 1;
|
private volatile long nextCallToken = 1;
|
||||||
|
|
||||||
|
private PowerManager.WakeLock wakeLock = null;
|
||||||
|
|
||||||
private static volatile ConnectionsManager Instance = null;
|
private static volatile ConnectionsManager Instance = null;
|
||||||
public static ConnectionsManager getInstance() {
|
public static ConnectionsManager getInstance() {
|
||||||
ConnectionsManager localInstance = Instance;
|
ConnectionsManager localInstance = Instance;
|
||||||
@ -213,6 +216,14 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
}
|
}
|
||||||
|
|
||||||
Utilities.stageQueue.postRunnable(stageRunnable, 1000);
|
Utilities.stageQueue.postRunnable(stageRunnable, 1000);
|
||||||
|
|
||||||
|
try {
|
||||||
|
PowerManager pm = (PowerManager)ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE);
|
||||||
|
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "lock");
|
||||||
|
wakeLock.setReferenceCounted(false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e("tmessages", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getConnectionState() {
|
public int getConnectionState() {
|
||||||
@ -456,7 +467,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
} else {
|
} else {
|
||||||
Datacenter datacenter = new Datacenter();
|
Datacenter datacenter = new Datacenter();
|
||||||
datacenter.datacenterId = 1;
|
datacenter.datacenterId = 1;
|
||||||
datacenter.addAddressAndPort("173.240.5.253", 443);
|
datacenter.addAddressAndPort("149.154.175.10", 443);
|
||||||
datacenters.put(datacenter.datacenterId, datacenter);
|
datacenters.put(datacenter.datacenterId, datacenter);
|
||||||
|
|
||||||
datacenter = new Datacenter();
|
datacenter = new Datacenter();
|
||||||
@ -566,25 +577,33 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
Utilities.stageQueue.postRunnable(new Runnable() {
|
Utilities.stageQueue.postRunnable(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
while (requestQueue.size() != 0) {
|
for (int a = 0; a < requestQueue.size(); a++) {
|
||||||
RPCRequest request = requestQueue.get(0);
|
RPCRequest request = requestQueue.get(a);
|
||||||
requestQueue.remove(0);
|
if ((request.flags & RPCRequest.RPCRequestClassWithoutLogin) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
requestQueue.remove(a);
|
||||||
if (request.completionBlock != null) {
|
if (request.completionBlock != null) {
|
||||||
TLRPC.TL_error implicitError = new TLRPC.TL_error();
|
TLRPC.TL_error implicitError = new TLRPC.TL_error();
|
||||||
implicitError.code = -1000;
|
implicitError.code = -1000;
|
||||||
implicitError.text = "";
|
implicitError.text = "";
|
||||||
request.completionBlock.run(null, implicitError);
|
request.completionBlock.run(null, implicitError);
|
||||||
}
|
}
|
||||||
|
a--;
|
||||||
}
|
}
|
||||||
while (runningRequests.size() != 0) {
|
for (int a = 0; a < runningRequests.size(); a++) {
|
||||||
RPCRequest request = runningRequests.get(0);
|
RPCRequest request = runningRequests.get(a);
|
||||||
runningRequests.remove(0);
|
if ((request.flags & RPCRequest.RPCRequestClassWithoutLogin) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
runningRequests.remove(a);
|
||||||
if (request.completionBlock != null) {
|
if (request.completionBlock != null) {
|
||||||
TLRPC.TL_error implicitError = new TLRPC.TL_error();
|
TLRPC.TL_error implicitError = new TLRPC.TL_error();
|
||||||
implicitError.code = -1000;
|
implicitError.code = -1000;
|
||||||
implicitError.text = "";
|
implicitError.text = "";
|
||||||
request.completionBlock.run(null, implicitError);
|
request.completionBlock.run(null, implicitError);
|
||||||
}
|
}
|
||||||
|
a--;
|
||||||
}
|
}
|
||||||
pingIdToDate.clear();
|
pingIdToDate.clear();
|
||||||
quickAckIdToRequestIds.clear();
|
quickAckIdToRequestIds.clear();
|
||||||
@ -2140,6 +2159,15 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
} else {
|
} else {
|
||||||
if (resultContainer.result instanceof TLRPC.updates_Difference) {
|
if (resultContainer.result instanceof TLRPC.updates_Difference) {
|
||||||
pushMessagesReceived = true;
|
pushMessagesReceived = true;
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (wakeLock.isHeld()) {
|
||||||
|
FileLog.e("tmessages", "release wakelock");
|
||||||
|
wakeLock.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (request.rawRequest instanceof TLRPC.TL_auth_checkPassword) {
|
if (request.rawRequest instanceof TLRPC.TL_auth_checkPassword) {
|
||||||
UserConfig.setWaitingForPasswordEnter(false);
|
UserConfig.setWaitingForPasswordEnter(false);
|
||||||
@ -2337,9 +2365,25 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
if (paused) {
|
if (paused) {
|
||||||
pushMessagesReceived = false;
|
pushMessagesReceived = false;
|
||||||
}
|
}
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
FileLog.e("tmessages", "acquire wakelock");
|
||||||
|
wakeLock.acquire(20000);
|
||||||
|
}
|
||||||
|
});
|
||||||
resumeNetworkInternal();
|
resumeNetworkInternal();
|
||||||
} else {
|
} else {
|
||||||
pushMessagesReceived = true;
|
pushMessagesReceived = true;
|
||||||
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (wakeLock.isHeld()) {
|
||||||
|
FileLog.e("tmessages", "release wakelock");
|
||||||
|
wakeLock.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
MessagesController.getInstance().processUpdates((TLRPC.Updates) message, false);
|
MessagesController.getInstance().processUpdates((TLRPC.Updates) message, false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -2444,7 +2488,25 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if ((connection.transportRequestClass & RPCRequest.RPCRequestClassPush) != 0) {
|
} else if ((connection.transportRequestClass & RPCRequest.RPCRequestClassPush) != 0) {
|
||||||
FileLog.e("tmessages", "call connection closed");
|
FileLog.e("tmessages", "push connection closed");
|
||||||
|
if (BuildVars.DEBUG_VERSION) {
|
||||||
|
try {
|
||||||
|
ConnectivityManager cm = (ConnectivityManager)ApplicationLoader.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
NetworkInfo[] networkInfos = cm.getAllNetworkInfo();
|
||||||
|
for (int a = 0; a < 2; a++) {
|
||||||
|
if (a >= networkInfos.length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
NetworkInfo info = networkInfos[a];
|
||||||
|
FileLog.e("tmessages", "Network: " + info.getTypeName() + " status: " + info.getState() + " info: " + info.getExtraInfo() + " object: " + info.getDetailedState() + " other: " + info);
|
||||||
|
}
|
||||||
|
if (networkInfos.length == 0) {
|
||||||
|
FileLog.e("tmessages", "no network available");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e("tmessages", "NETWORK STATE GET ERROR", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
sendingPushPing = false;
|
sendingPushPing = false;
|
||||||
lastPushPingTime = System.currentTimeMillis() - 60000 * 3 + 4000;
|
lastPushPingTime = System.currentTimeMillis() - 60000 * 3 + 4000;
|
||||||
}
|
}
|
||||||
@ -2456,7 +2518,10 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
if (datacenter.authKey != null) {
|
if (datacenter.authKey != null) {
|
||||||
if ((connection.transportRequestClass & RPCRequest.RPCRequestClassPush) != 0) {
|
if ((connection.transportRequestClass & RPCRequest.RPCRequestClassPush) != 0) {
|
||||||
sendingPushPing = false;
|
sendingPushPing = false;
|
||||||
lastPushPingTime = System.currentTimeMillis() - 60000 * 3 + 4000;
|
//lastPushPingTime = System.currentTimeMillis() - 60000 * 3 + 4000; //TODO check this
|
||||||
|
//FileLog.e("tmessages", "schedule push ping in 4 seconds");
|
||||||
|
lastPushPingTime = System.currentTimeMillis();
|
||||||
|
generatePing(datacenter, true);
|
||||||
} else {
|
} else {
|
||||||
if (paused && lastPauseTime != 0) {
|
if (paused && lastPauseTime != 0) {
|
||||||
lastPauseTime = System.currentTimeMillis();
|
lastPauseTime = System.currentTimeMillis();
|
||||||
@ -2541,6 +2606,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
} else {
|
} else {
|
||||||
if (datacenter.authKeyId == 0 || keyId != datacenter.authKeyId) {
|
if (datacenter.authKeyId == 0 || keyId != datacenter.authKeyId) {
|
||||||
FileLog.e("tmessages", "Error: invalid auth key id " + connection);
|
FileLog.e("tmessages", "Error: invalid auth key id " + connection);
|
||||||
|
datacenter.switchTo443Port();
|
||||||
connection.suspendConnection(true);
|
connection.suspendConnection(true);
|
||||||
connection.connect();
|
connection.connect();
|
||||||
return;
|
return;
|
||||||
@ -2581,6 +2647,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection.
|
|||||||
|
|
||||||
if (!Utilities.arraysEquals(messageKey, 0, realMessageKeyFull, realMessageKeyFull.length - 16)) {
|
if (!Utilities.arraysEquals(messageKey, 0, realMessageKeyFull, realMessageKeyFull.length - 16)) {
|
||||||
FileLog.e("tmessages", "***** Error: invalid message key");
|
FileLog.e("tmessages", "***** Error: invalid message key");
|
||||||
|
datacenter.switchTo443Port();
|
||||||
connection.suspendConnection(true);
|
connection.suspendConnection(true);
|
||||||
connection.connect();
|
connection.connect();
|
||||||
return;
|
return;
|
||||||
|
@ -115,6 +115,16 @@ public class Datacenter {
|
|||||||
readCurrentAddressAndPortNum();
|
readCurrentAddressAndPortNum();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void switchTo443Port() {
|
||||||
|
for (int a = 0; a < addresses.size(); a++) {
|
||||||
|
if (ports.get(addresses.get(a)) == 443) {
|
||||||
|
currentAddressNum = a;
|
||||||
|
currentPortNum = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public String getCurrentAddress() {
|
public String getCurrentAddress() {
|
||||||
if (addresses.isEmpty()) {
|
if (addresses.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -55,7 +55,7 @@ public class FileLoadOperation {
|
|||||||
private boolean isForceRequest = false;
|
private boolean isForceRequest = false;
|
||||||
|
|
||||||
public static interface FileLoadOperationDelegate {
|
public static interface FileLoadOperationDelegate {
|
||||||
public abstract void didFinishLoadingFile(FileLoadOperation operation, File finalFile, File tempFile);
|
public abstract void didFinishLoadingFile(FileLoadOperation operation, File finalFile);
|
||||||
public abstract void didFailedLoadingFile(FileLoadOperation operation, int state);
|
public abstract void didFailedLoadingFile(FileLoadOperation operation, int state);
|
||||||
public abstract void didChangedLoadProgress(FileLoadOperation operation, float progress);
|
public abstract void didChangedLoadProgress(FileLoadOperation operation, float progress);
|
||||||
}
|
}
|
||||||
@ -341,9 +341,11 @@ public class FileLoadOperation {
|
|||||||
cacheIvTemp.delete();
|
cacheIvTemp.delete();
|
||||||
}
|
}
|
||||||
if (cacheFileTemp != null) {
|
if (cacheFileTemp != null) {
|
||||||
cacheFileTemp.renameTo(cacheFileFinal);
|
if (!cacheFileTemp.renameTo(cacheFileFinal)) {
|
||||||
|
cacheFileFinal = cacheFileTemp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delegate.didFinishLoadingFile(FileLoadOperation.this, cacheFileFinal, cacheFileTemp);
|
delegate.didFinishLoadingFile(FileLoadOperation.this, cacheFileFinal);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processRequestResult(RequestInfo requestInfo, TLRPC.TL_error error) {
|
private void processRequestResult(RequestInfo requestInfo, TLRPC.TL_error error) {
|
||||||
@ -373,7 +375,8 @@ public class FileLoadOperation {
|
|||||||
fiv.seek(0);
|
fiv.seek(0);
|
||||||
fiv.write(iv);
|
fiv.write(iv);
|
||||||
}
|
}
|
||||||
downloadedBytes += requestInfo.response.bytes.limit();
|
int currentBytesSize = requestInfo.response.bytes.limit();
|
||||||
|
downloadedBytes += currentBytesSize;
|
||||||
if (totalBytesCount > 0 && state == stateDownloading) {
|
if (totalBytesCount > 0 && state == stateDownloading) {
|
||||||
delegate.didChangedLoadProgress(FileLoadOperation.this, Math.min(1.0f, (float)downloadedBytes / (float)totalBytesCount));
|
delegate.didChangedLoadProgress(FileLoadOperation.this, Math.min(1.0f, (float)downloadedBytes / (float)totalBytesCount));
|
||||||
}
|
}
|
||||||
@ -390,10 +393,14 @@ public class FileLoadOperation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (totalBytesCount != downloadedBytes && downloadedBytes % downloadChunkSize == 0 || totalBytesCount > 0 && totalBytesCount > downloadedBytes) {
|
if (currentBytesSize != downloadChunkSize) {
|
||||||
startDownloadRequest();
|
|
||||||
} else {
|
|
||||||
onFinishLoadingFile();
|
onFinishLoadingFile();
|
||||||
|
} else {
|
||||||
|
if (totalBytesCount != downloadedBytes && downloadedBytes % downloadChunkSize == 0 || totalBytesCount > 0 && totalBytesCount > downloadedBytes) {
|
||||||
|
startDownloadRequest();
|
||||||
|
} else {
|
||||||
|
onFinishLoadingFile();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
cleanup();
|
cleanup();
|
||||||
|
@ -23,7 +23,7 @@ public class FileLoader {
|
|||||||
public abstract void fileUploadProgressChanged(String location, float progress, boolean isEncrypted);
|
public abstract void fileUploadProgressChanged(String location, float progress, boolean isEncrypted);
|
||||||
public abstract void fileDidUploaded(String location, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile);
|
public abstract void fileDidUploaded(String location, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile);
|
||||||
public abstract void fileDidFailedUpload(String location, boolean isEncrypted);
|
public abstract void fileDidFailedUpload(String location, boolean isEncrypted);
|
||||||
public abstract void fileDidLoaded(String location, File finalFile, File tempFile);
|
public abstract void fileDidLoaded(String location, File finalFile, int type);
|
||||||
public abstract void fileDidFailedLoad(String location, int state);
|
public abstract void fileDidFailedLoad(String location, int state);
|
||||||
public abstract void fileLoadProgressChanged(String location, float progress);
|
public abstract void fileLoadProgressChanged(String location, float progress);
|
||||||
}
|
}
|
||||||
@ -395,53 +395,50 @@ public class FileLoader {
|
|||||||
|
|
||||||
File tempDir = getDirectory(MEDIA_DIR_CACHE);
|
File tempDir = getDirectory(MEDIA_DIR_CACHE);
|
||||||
File storeDir = tempDir;
|
File storeDir = tempDir;
|
||||||
|
int type = MEDIA_DIR_CACHE;
|
||||||
|
|
||||||
if (video != null) {
|
if (video != null) {
|
||||||
operation = new FileLoadOperation(video);
|
operation = new FileLoadOperation(video);
|
||||||
if (!cacheOnly) {
|
type = MEDIA_DIR_VIDEO;
|
||||||
storeDir = getDirectory(MEDIA_DIR_VIDEO);
|
|
||||||
}
|
|
||||||
} else if (location != null) {
|
} else if (location != null) {
|
||||||
operation = new FileLoadOperation(location, locationSize);
|
operation = new FileLoadOperation(location, locationSize);
|
||||||
if (!cacheOnly) {
|
type = MEDIA_DIR_IMAGE;
|
||||||
storeDir = getDirectory(MEDIA_DIR_IMAGE);
|
|
||||||
}
|
|
||||||
} else if (document != null) {
|
} else if (document != null) {
|
||||||
operation = new FileLoadOperation(document);
|
operation = new FileLoadOperation(document);
|
||||||
if (!cacheOnly) {
|
type = MEDIA_DIR_DOCUMENT;
|
||||||
storeDir = getDirectory(MEDIA_DIR_DOCUMENT);
|
|
||||||
}
|
|
||||||
} else if (audio != null) {
|
} else if (audio != null) {
|
||||||
operation = new FileLoadOperation(audio);
|
operation = new FileLoadOperation(audio);
|
||||||
if (!cacheOnly) {
|
type = MEDIA_DIR_AUDIO;
|
||||||
storeDir = getDirectory(MEDIA_DIR_AUDIO);
|
}
|
||||||
}
|
if (!cacheOnly) {
|
||||||
|
storeDir = getDirectory(type);
|
||||||
}
|
}
|
||||||
operation.setPaths(storeDir, tempDir);
|
operation.setPaths(storeDir, tempDir);
|
||||||
|
|
||||||
final String arg1 = fileName;
|
final String finalFileName = fileName;
|
||||||
|
final int finalType = type;
|
||||||
loadOperationPaths.put(fileName, operation);
|
loadOperationPaths.put(fileName, operation);
|
||||||
operation.setDelegate(new FileLoadOperation.FileLoadOperationDelegate() {
|
operation.setDelegate(new FileLoadOperation.FileLoadOperationDelegate() {
|
||||||
@Override
|
@Override
|
||||||
public void didFinishLoadingFile(FileLoadOperation operation, File finalFile, File tempFile) {
|
public void didFinishLoadingFile(FileLoadOperation operation, File finalFile) {
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
delegate.fileDidLoaded(arg1, finalFile, tempFile);
|
delegate.fileDidLoaded(finalFileName, finalFile, finalType);
|
||||||
}
|
}
|
||||||
checkDownloadQueue(audio, location, arg1);
|
checkDownloadQueue(audio, location, finalFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void didFailedLoadingFile(FileLoadOperation operation, int canceled) {
|
public void didFailedLoadingFile(FileLoadOperation operation, int canceled) {
|
||||||
checkDownloadQueue(audio, location, arg1);
|
checkDownloadQueue(audio, location, finalFileName);
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
delegate.fileDidFailedLoad(arg1, canceled);
|
delegate.fileDidFailedLoad(finalFileName, canceled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void didChangedLoadProgress(FileLoadOperation operation, float progress) {
|
public void didChangedLoadProgress(FileLoadOperation operation, float progress) {
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
delegate.fileLoadProgressChanged(arg1, progress);
|
delegate.fileLoadProgressChanged(finalFileName, progress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -641,7 +638,7 @@ public class FileLoader {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int currentSide = obj.w >= obj.h ? obj.w : obj.h;
|
int currentSide = obj.w >= obj.h ? obj.w : obj.h;
|
||||||
if (closestObject == null || closestObject instanceof TLRPC.TL_photoCachedSize || currentSide <= side && lastSide < currentSide) {
|
if (closestObject == null || obj instanceof TLRPC.TL_photoCachedSize || currentSide <= side && lastSide < currentSide) {
|
||||||
closestObject = obj;
|
closestObject = obj;
|
||||||
lastSide = currentSide;
|
lastSide = currentSide;
|
||||||
}
|
}
|
||||||
|
@ -160,6 +160,26 @@ public class FileLog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void w(final String tag, final String message) {
|
||||||
|
if (!BuildVars.DEBUG_VERSION) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.w(tag, message);
|
||||||
|
if (getInstance().streamWriter != null) {
|
||||||
|
getInstance().logQueue.postRunnable(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
getInstance().streamWriter.write(getInstance().dateFormat.format(System.currentTimeMillis()) + " W/" + tag + ": " + message + "\n");
|
||||||
|
getInstance().streamWriter.flush();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void cleanupLogs() {
|
public static void cleanupLogs() {
|
||||||
ArrayList<Uri> uris = new ArrayList<Uri>();
|
ArrayList<Uri> uris = new ArrayList<Uri>();
|
||||||
File sdCard = ApplicationLoader.applicationContext.getExternalFilesDir(null);
|
File sdCard = ApplicationLoader.applicationContext.getExternalFilesDir(null);
|
||||||
|
@ -299,6 +299,9 @@ public class TcpConnection extends ConnectionContext {
|
|||||||
if (canReuse) {
|
if (canReuse) {
|
||||||
BuffersStorage.getInstance().reuseFreeBuffer(buff);
|
BuffersStorage.getInstance().reuseFreeBuffer(buff);
|
||||||
}
|
}
|
||||||
|
if (BuildConfig.DEBUG) {
|
||||||
|
FileLog.e("tmessages", TcpConnection.this + " disconnected, don't send data");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ public class ActionBar extends FrameLayout {
|
|||||||
private boolean allowOverlayTitle;
|
private boolean allowOverlayTitle;
|
||||||
private CharSequence lastTitle;
|
private CharSequence lastTitle;
|
||||||
private boolean showingOverlayTitle;
|
private boolean showingOverlayTitle;
|
||||||
|
private boolean castShadows = true;
|
||||||
|
|
||||||
protected boolean isSearchFieldVisible;
|
protected boolean isSearchFieldVisible;
|
||||||
protected int itemsBackgroundResourceId;
|
protected int itemsBackgroundResourceId;
|
||||||
@ -485,6 +486,14 @@ public class ActionBar extends FrameLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setCastShadows(boolean value) {
|
||||||
|
castShadows = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getCastShadows() {
|
||||||
|
return castShadows;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
super.onTouchEvent(event);
|
super.onTouchEvent(event);
|
||||||
|
@ -68,8 +68,10 @@ public class ActionBarLayout extends FrameLayout {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (view instanceof ActionBar && view.getVisibility() == VISIBLE) {
|
if (view instanceof ActionBar && view.getVisibility() == VISIBLE) {
|
||||||
actionBarHeight = view.getMeasuredHeight();
|
if (((ActionBar) view).getCastShadows()) {
|
||||||
wasActionBar = true;
|
actionBarHeight = view.getMeasuredHeight();
|
||||||
|
wasActionBar = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -597,7 +599,7 @@ public class ActionBarLayout extends FrameLayout {
|
|||||||
if (useAlphaAnimations && fragmentsStack.size() == 1) {
|
if (useAlphaAnimations && fragmentsStack.size() == 1) {
|
||||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||||
|
|
||||||
ArrayList<Object> animators = new ArrayList<Object>();
|
ArrayList<Object> animators = new ArrayList<>();
|
||||||
animators.add(ObjectAnimatorProxy.ofFloat(this, "alpha", 0.0f, 1.0f));
|
animators.add(ObjectAnimatorProxy.ofFloat(this, "alpha", 0.0f, 1.0f));
|
||||||
if (backgroundView != null) {
|
if (backgroundView != null) {
|
||||||
backgroundView.setVisibility(VISIBLE);
|
backgroundView.setVisibility(VISIBLE);
|
||||||
@ -783,7 +785,7 @@ public class ActionBarLayout extends FrameLayout {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ArrayList<Object> animators = new ArrayList<Object>();
|
ArrayList<Object> animators = new ArrayList<>();
|
||||||
animators.add(ObjectAnimatorProxy.ofFloat(this, "alpha", 1.0f, 0.0f));
|
animators.add(ObjectAnimatorProxy.ofFloat(this, "alpha", 1.0f, 0.0f));
|
||||||
if (backgroundView != null) {
|
if (backgroundView != null) {
|
||||||
animators.add(ObjectAnimatorProxy.ofFloat(backgroundView, "alpha", 1.0f, 0.0f));
|
animators.add(ObjectAnimatorProxy.ofFloat(backgroundView, "alpha", 1.0f, 0.0f));
|
||||||
|
@ -14,7 +14,6 @@ import android.util.AttributeSet;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
import org.telegram.android.AndroidUtilities;
|
import org.telegram.android.AndroidUtilities;
|
||||||
@ -78,11 +77,10 @@ public class ActionBarMenu extends LinearLayout {
|
|||||||
public ActionBarMenuItem addItem(int id, int icon, int backgroundResource, Drawable drawable, int width) {
|
public ActionBarMenuItem addItem(int id, int icon, int backgroundResource, Drawable drawable, int width) {
|
||||||
ActionBarMenuItem menuItem = new ActionBarMenuItem(getContext(), this, backgroundResource);
|
ActionBarMenuItem menuItem = new ActionBarMenuItem(getContext(), this, backgroundResource);
|
||||||
menuItem.setTag(id);
|
menuItem.setTag(id);
|
||||||
menuItem.setScaleType(ImageView.ScaleType.CENTER);
|
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
menuItem.setImageDrawable(drawable);
|
menuItem.iconView.setImageDrawable(drawable);
|
||||||
} else {
|
} else {
|
||||||
menuItem.setImageResource(icon);
|
menuItem.iconView.setImageResource(icon);
|
||||||
}
|
}
|
||||||
addView(menuItem);
|
addView(menuItem);
|
||||||
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)menuItem.getLayoutParams();
|
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)menuItem.getLayoutParams();
|
||||||
|
@ -34,10 +34,11 @@ import org.telegram.android.AndroidUtilities;
|
|||||||
import org.telegram.android.LocaleController;
|
import org.telegram.android.LocaleController;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.ui.AnimationCompat.ViewProxy;
|
import org.telegram.ui.AnimationCompat.ViewProxy;
|
||||||
|
import org.telegram.ui.Components.FrameLayoutFixed;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
public class ActionBarMenuItem extends ImageView {
|
public class ActionBarMenuItem extends FrameLayoutFixed {
|
||||||
|
|
||||||
public static class ActionBarMenuItemSearchListener {
|
public static class ActionBarMenuItemSearchListener {
|
||||||
public void onSearchExpand() { }
|
public void onSearchExpand() { }
|
||||||
@ -51,6 +52,7 @@ public class ActionBarMenuItem extends ImageView {
|
|||||||
private ActionBarPopupWindow popupWindow;
|
private ActionBarPopupWindow popupWindow;
|
||||||
private EditText searchField;
|
private EditText searchField;
|
||||||
private ImageView clearButton;
|
private ImageView clearButton;
|
||||||
|
protected ImageView iconView;
|
||||||
private FrameLayout searchContainer;
|
private FrameLayout searchContainer;
|
||||||
private boolean isSearchField = false;
|
private boolean isSearchField = false;
|
||||||
private ActionBarMenuItemSearchListener listener;
|
private ActionBarMenuItemSearchListener listener;
|
||||||
@ -61,11 +63,20 @@ public class ActionBarMenuItem extends ImageView {
|
|||||||
private boolean showFromBottom;
|
private boolean showFromBottom;
|
||||||
private int menuHeight = AndroidUtilities.dp(16);
|
private int menuHeight = AndroidUtilities.dp(16);
|
||||||
private boolean needOffset = Build.VERSION.SDK_INT >= 21;
|
private boolean needOffset = Build.VERSION.SDK_INT >= 21;
|
||||||
|
private int subMenuOpenSide = 0;
|
||||||
|
|
||||||
public ActionBarMenuItem(Context context, ActionBarMenu menu, int background) {
|
public ActionBarMenuItem(Context context, ActionBarMenu menu, int background) {
|
||||||
super(context);
|
super(context);
|
||||||
setBackgroundResource(background);
|
setBackgroundResource(background);
|
||||||
parentMenu = menu;
|
parentMenu = menu;
|
||||||
|
|
||||||
|
iconView = new ImageView(context);
|
||||||
|
iconView.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
|
addView(iconView);
|
||||||
|
LayoutParams layoutParams = (LayoutParams) iconView.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.height = LayoutParams.MATCH_PARENT;
|
||||||
|
iconView.setLayoutParams(layoutParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -145,6 +156,10 @@ public class ActionBarMenuItem extends ImageView {
|
|||||||
needOffset = Build.VERSION.SDK_INT >= 21 && value;
|
needOffset = Build.VERSION.SDK_INT >= 21 && value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSubMenuOpenSide(int side) {
|
||||||
|
subMenuOpenSide = side;
|
||||||
|
}
|
||||||
|
|
||||||
public TextView addSubItem(int id, String text, int icon) {
|
public TextView addSubItem(int id, String text, int icon) {
|
||||||
if (popupLayout == null) {
|
if (popupLayout == null) {
|
||||||
rect = new Rect();
|
rect = new Rect();
|
||||||
@ -256,18 +271,27 @@ public class ActionBarMenuItem extends ImageView {
|
|||||||
}
|
}
|
||||||
popupWindow.setFocusable(true);
|
popupWindow.setFocusable(true);
|
||||||
if (popupLayout.getMeasuredWidth() == 0) {
|
if (popupLayout.getMeasuredWidth() == 0) {
|
||||||
if (showFromBottom) {
|
if (subMenuOpenSide == 0) {
|
||||||
popupWindow.showAsDropDown(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY());
|
if (showFromBottom) {
|
||||||
popupWindow.update(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY(), -1, -1);
|
popupWindow.showAsDropDown(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY());
|
||||||
|
popupWindow.update(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY(), -1, -1);
|
||||||
|
} else {
|
||||||
|
popupWindow.showAsDropDown(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY());
|
||||||
|
popupWindow.update(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY(), -1, -1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
popupWindow.showAsDropDown(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY());
|
popupWindow.showAsDropDown(this, -AndroidUtilities.dp(8), getOffsetY());
|
||||||
popupWindow.update(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY(), -1, -1);
|
popupWindow.update(this, -AndroidUtilities.dp(8), getOffsetY(), -1, -1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (showFromBottom) {
|
if (subMenuOpenSide == 0) {
|
||||||
popupWindow.showAsDropDown(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY());
|
if (showFromBottom) {
|
||||||
|
popupWindow.showAsDropDown(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY());
|
||||||
|
} else {
|
||||||
|
popupWindow.showAsDropDown(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
popupWindow.showAsDropDown(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY());
|
popupWindow.showAsDropDown(this, -AndroidUtilities.dp(8), getOffsetY());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -427,7 +451,7 @@ public class ActionBarMenuItem extends ImageView {
|
|||||||
|
|
||||||
clearButton = new ImageView(getContext());
|
clearButton = new ImageView(getContext());
|
||||||
clearButton.setImageResource(R.drawable.ic_close_white);
|
clearButton.setImageResource(R.drawable.ic_close_white);
|
||||||
clearButton.setScaleType(ScaleType.CENTER);
|
clearButton.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
clearButton.setOnClickListener(new OnClickListener() {
|
clearButton.setOnClickListener(new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@ -459,10 +483,14 @@ public class ActionBarMenuItem extends ImageView {
|
|||||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||||
super.onLayout(changed, left, top, right, bottom);
|
super.onLayout(changed, left, top, right, bottom);
|
||||||
if (popupWindow != null && popupWindow.isShowing()) {
|
if (popupWindow != null && popupWindow.isShowing()) {
|
||||||
if (showFromBottom) {
|
if (subMenuOpenSide == 0) {
|
||||||
popupWindow.update(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY(), -1, -1);
|
if (showFromBottom) {
|
||||||
|
popupWindow.update(this, -popupLayout.getMeasuredWidth() + getMeasuredWidth(), getOffsetY(), -1, -1);
|
||||||
|
} else {
|
||||||
|
popupWindow.update(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY(), -1, -1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
popupWindow.update(this, parentMenu.parentActionBar.getMeasuredWidth() - popupLayout.getMeasuredWidth() - getLeft() - parentMenu.getLeft(), getOffsetY(), -1, -1);
|
popupWindow.update(this, -AndroidUtilities.dp(8), getOffsetY(), -1, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,12 +99,21 @@ public class ContactsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
Utilities.searchQueue.postRunnable(new Runnable() {
|
Utilities.searchQueue.postRunnable(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
String q = query.trim().toLowerCase();
|
String search1 = query.trim().toLowerCase();
|
||||||
if (q.length() == 0) {
|
if (search1.length() == 0) {
|
||||||
updateSearchResults(new ArrayList<TLRPC.User>(), new ArrayList<CharSequence>());
|
updateSearchResults(new ArrayList<TLRPC.User>(), new ArrayList<CharSequence>());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
long time = System.currentTimeMillis();
|
String search2 = LocaleController.getInstance().getTranslitString(search1);
|
||||||
|
if (search1.equals(search2) || search2.length() == 0) {
|
||||||
|
search2 = null;
|
||||||
|
}
|
||||||
|
String search[] = new String[1 + (search2 != null ? 1 : 0)];
|
||||||
|
search[0] = search1;
|
||||||
|
if (search2 != null) {
|
||||||
|
search[1] = search2;
|
||||||
|
}
|
||||||
|
|
||||||
ArrayList<TLRPC.User> resultArray = new ArrayList<>();
|
ArrayList<TLRPC.User> resultArray = new ArrayList<>();
|
||||||
ArrayList<CharSequence> resultArrayNames = new ArrayList<>();
|
ArrayList<CharSequence> resultArrayNames = new ArrayList<>();
|
||||||
|
|
||||||
@ -117,19 +126,22 @@ public class ContactsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
String name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase();
|
String name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase();
|
||||||
|
|
||||||
int found = 0;
|
int found = 0;
|
||||||
if (name.startsWith(q) || name.contains(" " + q)) {
|
for (String q : search) {
|
||||||
found = 1;
|
if (name.startsWith(q) || name.contains(" " + q)) {
|
||||||
} else if (user.username != null && user.username.startsWith(q)) {
|
found = 1;
|
||||||
found = 2;
|
} else if (user.username != null && user.username.startsWith(q)) {
|
||||||
}
|
found = 2;
|
||||||
|
}
|
||||||
if (found != 0) {
|
|
||||||
if (found == 1) {
|
if (found != 0) {
|
||||||
resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q));
|
if (found == 1) {
|
||||||
} else {
|
resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q));
|
||||||
resultArrayNames.add(Utilities.generateSearchName("@" + user.username, null, "@" + q));
|
} else {
|
||||||
|
resultArrayNames.add(Utilities.generateSearchName("@" + user.username, null, "@" + q));
|
||||||
|
}
|
||||||
|
resultArray.add(user);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
resultArray.add(user);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ public class DialogsAdapter extends BaseFragmentAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
MessageObject message = MessagesController.getInstance().dialogMessage.get(dialog.top_message);
|
MessageObject message = MessagesController.getInstance().dialogMessage.get(dialog.top_message);
|
||||||
((DialogCell) view).setDialog(dialog.id, message, true, dialog.last_message_date, dialog.unread_count);
|
((DialogCell) view).setDialog(dialog.id, message, true, dialog.last_message_date, dialog.unread_count, MessagesController.getInstance().isDialogMuted(dialog.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
|
@ -134,7 +134,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
searchResultMessages.clear();
|
searchResultMessages.clear();
|
||||||
}
|
}
|
||||||
for (TLRPC.Message message : res.messages) {
|
for (TLRPC.Message message : res.messages) {
|
||||||
searchResultMessages.add(new MessageObject(message, null, 0));
|
searchResultMessages.add(new MessageObject(message, null, false));
|
||||||
}
|
}
|
||||||
messagesSearchEndReached = res.messages.size() != 20;
|
messagesSearchEndReached = res.messages.size() != 20;
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
@ -155,12 +155,21 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
String q = query.trim().toLowerCase();
|
String search1 = query.trim().toLowerCase();
|
||||||
if (q.length() == 0) {
|
if (search1.length() == 0) {
|
||||||
lastSearchId = -1;
|
lastSearchId = -1;
|
||||||
updateSearchResults(new ArrayList<TLObject>(), new ArrayList<CharSequence>(), new ArrayList<TLRPC.User>(), lastSearchId);
|
updateSearchResults(new ArrayList<TLObject>(), new ArrayList<CharSequence>(), new ArrayList<TLRPC.User>(), lastSearchId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
String search2 = LocaleController.getInstance().getTranslitString(search1);
|
||||||
|
if (search1.equals(search2) || search2.length() == 0) {
|
||||||
|
search2 = null;
|
||||||
|
}
|
||||||
|
String search[] = new String[1 + (search2 != null ? 1 : 0)];
|
||||||
|
search[0] = search1;
|
||||||
|
if (search2 != null) {
|
||||||
|
search[1] = search2;
|
||||||
|
}
|
||||||
|
|
||||||
ArrayList<Integer> usersToLoad = new ArrayList<>();
|
ArrayList<Integer> usersToLoad = new ArrayList<>();
|
||||||
ArrayList<Integer> chatsToLoad = new ArrayList<>();
|
ArrayList<Integer> chatsToLoad = new ArrayList<>();
|
||||||
@ -212,30 +221,33 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
username = name.substring(usernamePos + 3);
|
username = name.substring(usernamePos + 3);
|
||||||
}
|
}
|
||||||
int found = 0;
|
int found = 0;
|
||||||
if (name.startsWith(q) || name.contains(" " + q)) {
|
for (String q : search) {
|
||||||
found = 1;
|
if (name.startsWith(q) || name.contains(" " + q)) {
|
||||||
} else if (username != null && username.startsWith(q)) {
|
found = 1;
|
||||||
found = 2;
|
} else if (username != null && username.startsWith(q)) {
|
||||||
}
|
found = 2;
|
||||||
if (found != 0) {
|
}
|
||||||
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
if (found != 0) {
|
||||||
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
||||||
TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
||||||
if (user.id != UserConfig.getClientUserId()) {
|
TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
||||||
DialogSearchResult dialogSearchResult = dialogsResult.get((long)user.id);
|
if (user.id != UserConfig.getClientUserId()) {
|
||||||
if (user.status != null) {
|
DialogSearchResult dialogSearchResult = dialogsResult.get((long) user.id);
|
||||||
user.status.expires = cursor.intValue(1);
|
if (user.status != null) {
|
||||||
}
|
user.status.expires = cursor.intValue(1);
|
||||||
if (found == 1) {
|
}
|
||||||
dialogSearchResult.name = Utilities.generateSearchName(user.first_name, user.last_name, q);
|
if (found == 1) {
|
||||||
} else {
|
dialogSearchResult.name = Utilities.generateSearchName(user.first_name, user.last_name, q);
|
||||||
dialogSearchResult.name = Utilities.generateSearchName("@" + user.username, null, "@" + q);
|
} else {
|
||||||
}
|
dialogSearchResult.name = Utilities.generateSearchName("@" + user.username, null, "@" + q);
|
||||||
dialogSearchResult.object = user;
|
}
|
||||||
resultCount++;
|
dialogSearchResult.object = user;
|
||||||
}
|
resultCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
@ -245,23 +257,25 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, name FROM chats WHERE uid IN(%s)", TextUtils.join(",", chatsToLoad)));
|
cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, name FROM chats WHERE uid IN(%s)", TextUtils.join(",", chatsToLoad)));
|
||||||
while (cursor.next()) {
|
while (cursor.next()) {
|
||||||
String name = cursor.stringValue(1);
|
String name = cursor.stringValue(1);
|
||||||
String[] args = name.split(" ");
|
for (String q : search) {
|
||||||
if (name.startsWith(q) || name.contains(" " + q)) {
|
if (name.startsWith(q) || name.contains(" " + q)) {
|
||||||
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
||||||
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
||||||
TLRPC.Chat chat = (TLRPC.Chat) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
TLRPC.Chat chat = (TLRPC.Chat) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
||||||
long dialog_id;
|
long dialog_id;
|
||||||
if (chat.id > 0) {
|
if (chat.id > 0) {
|
||||||
dialog_id = -chat.id;
|
dialog_id = -chat.id;
|
||||||
} else {
|
} else {
|
||||||
dialog_id = AndroidUtilities.makeBroadcastId(chat.id);
|
dialog_id = AndroidUtilities.makeBroadcastId(chat.id);
|
||||||
|
}
|
||||||
|
DialogSearchResult dialogSearchResult = dialogsResult.get(dialog_id);
|
||||||
|
dialogSearchResult.name = Utilities.generateSearchName(chat.title, null, q);
|
||||||
|
dialogSearchResult.object = chat;
|
||||||
|
resultCount++;
|
||||||
}
|
}
|
||||||
DialogSearchResult dialogSearchResult = dialogsResult.get(dialog_id);
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
dialogSearchResult.name = Utilities.generateSearchName(chat.title, null, q);
|
break;
|
||||||
dialogSearchResult.object = chat;
|
|
||||||
resultCount++;
|
|
||||||
}
|
}
|
||||||
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
@ -278,50 +292,53 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
username = name.substring(usernamePos + 2);
|
username = name.substring(usernamePos + 2);
|
||||||
}
|
}
|
||||||
int found = 0;
|
int found = 0;
|
||||||
if (name.startsWith(q) || name.contains(" " + q)) {
|
for (String q : search) {
|
||||||
found = 1;
|
if (name.startsWith(q) || name.contains(" " + q)) {
|
||||||
} else if (username != null && username.startsWith(q)) {
|
found = 1;
|
||||||
found = 2;
|
} else if (username != null && username.startsWith(q)) {
|
||||||
}
|
found = 2;
|
||||||
|
}
|
||||||
if (found != 0) {
|
|
||||||
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
if (found != 0) {
|
||||||
ByteBufferDesc data2 = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(6));
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
||||||
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0 && cursor.byteBufferValue(6, data2.buffer) != 0) {
|
ByteBufferDesc data2 = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(6));
|
||||||
TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0 && cursor.byteBufferValue(6, data2.buffer) != 0) {
|
||||||
DialogSearchResult dialogSearchResult = dialogsResult.get((long)chat.id << 32);
|
TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
||||||
|
DialogSearchResult dialogSearchResult = dialogsResult.get((long) chat.id << 32);
|
||||||
chat.user_id = cursor.intValue(2);
|
|
||||||
chat.a_or_b = cursor.byteArrayValue(3);
|
chat.user_id = cursor.intValue(2);
|
||||||
chat.auth_key = cursor.byteArrayValue(4);
|
chat.a_or_b = cursor.byteArrayValue(3);
|
||||||
chat.ttl = cursor.intValue(5);
|
chat.auth_key = cursor.byteArrayValue(4);
|
||||||
chat.layer = cursor.intValue(8);
|
chat.ttl = cursor.intValue(5);
|
||||||
chat.seq_in = cursor.intValue(9);
|
chat.layer = cursor.intValue(8);
|
||||||
chat.seq_out = cursor.intValue(10);
|
chat.seq_in = cursor.intValue(9);
|
||||||
int use_count = cursor.intValue(11);
|
chat.seq_out = cursor.intValue(10);
|
||||||
chat.key_use_count_in = (short)(use_count >> 16);
|
int use_count = cursor.intValue(11);
|
||||||
chat.key_use_count_out = (short)(use_count);
|
chat.key_use_count_in = (short) (use_count >> 16);
|
||||||
chat.exchange_id = cursor.longValue(12);
|
chat.key_use_count_out = (short) (use_count);
|
||||||
chat.key_create_date = cursor.intValue(13);
|
chat.exchange_id = cursor.longValue(12);
|
||||||
chat.future_key_fingerprint = cursor.longValue(14);
|
chat.key_create_date = cursor.intValue(13);
|
||||||
chat.future_auth_key = cursor.byteArrayValue(15);
|
chat.future_key_fingerprint = cursor.longValue(14);
|
||||||
chat.key_hash = cursor.byteArrayValue(16);
|
chat.future_auth_key = cursor.byteArrayValue(15);
|
||||||
|
chat.key_hash = cursor.byteArrayValue(16);
|
||||||
TLRPC.User user = (TLRPC.User)TLClassStore.Instance().TLdeserialize(data2, data2.readInt32());
|
|
||||||
if (user.status != null) {
|
TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data2, data2.readInt32());
|
||||||
user.status.expires = cursor.intValue(7);
|
if (user.status != null) {
|
||||||
}
|
user.status.expires = cursor.intValue(7);
|
||||||
if (found == 1) {
|
}
|
||||||
dialogSearchResult.name = Html.fromHtml("<font color=\"#00a60e\">" + ContactsController.formatName(user.first_name, user.last_name) + "</font>");
|
if (found == 1) {
|
||||||
} else {
|
dialogSearchResult.name = Html.fromHtml("<font color=\"#00a60e\">" + ContactsController.formatName(user.first_name, user.last_name) + "</font>");
|
||||||
dialogSearchResult.name = Utilities.generateSearchName("@" + user.username, null, "@" + q);
|
} else {
|
||||||
}
|
dialogSearchResult.name = Utilities.generateSearchName("@" + user.username, null, "@" + q);
|
||||||
dialogSearchResult.object = chat;
|
}
|
||||||
encUsers.add(user);
|
dialogSearchResult.object = chat;
|
||||||
resultCount++;
|
encUsers.add(user);
|
||||||
|
resultCount++;
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data2);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
|
||||||
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
@ -367,28 +384,31 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
username = name.substring(usernamePos + 3);
|
username = name.substring(usernamePos + 3);
|
||||||
}
|
}
|
||||||
int found = 0;
|
int found = 0;
|
||||||
if (name.startsWith(q) || name.contains(" " + q)) {
|
for (String q : search) {
|
||||||
found = 1;
|
if (name.startsWith(q) || name.contains(" " + q)) {
|
||||||
} else if (username != null && username.startsWith(q)) {
|
found = 1;
|
||||||
found = 2;
|
} else if (username != null && username.startsWith(q)) {
|
||||||
}
|
found = 2;
|
||||||
if (found != 0) {
|
}
|
||||||
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
if (found != 0) {
|
||||||
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0));
|
||||||
TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) {
|
||||||
if (user.id != UserConfig.getClientUserId()) {
|
TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32());
|
||||||
if (user.status != null) {
|
if (user.id != UserConfig.getClientUserId()) {
|
||||||
user.status.expires = cursor.intValue(1);
|
if (user.status != null) {
|
||||||
}
|
user.status.expires = cursor.intValue(1);
|
||||||
if (found == 1) {
|
}
|
||||||
resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q));
|
if (found == 1) {
|
||||||
} else {
|
resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q));
|
||||||
resultArrayNames.add(Utilities.generateSearchName("@" + user.username, null, "@" + q));
|
} else {
|
||||||
}
|
resultArrayNames.add(Utilities.generateSearchName("@" + user.username, null, "@" + q));
|
||||||
resultArray.add(user);
|
}
|
||||||
}
|
resultArray.add(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
@ -598,7 +618,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter {
|
|||||||
}
|
}
|
||||||
((DialogCell) view).useSeparator = (i != getCount() - 1);
|
((DialogCell) view).useSeparator = (i != getCount() - 1);
|
||||||
MessageObject messageObject = (MessageObject)getItem(i);
|
MessageObject messageObject = (MessageObject)getItem(i);
|
||||||
((DialogCell) view).setDialog(messageObject.getDialogId(), messageObject, false, messageObject.messageOwner.date, 0);
|
((DialogCell) view).setDialog(messageObject.getDialogId(), messageObject, false, messageObject.messageOwner.date, 0, false);
|
||||||
} else if (type == 3) {
|
} else if (type == 3) {
|
||||||
if (view == null) {
|
if (view == null) {
|
||||||
view = new LoadingCell(mContext);
|
view = new LoadingCell(mContext);
|
||||||
|
@ -25,7 +25,7 @@ import org.telegram.android.AndroidUtilities;
|
|||||||
import org.telegram.android.ImageReceiver;
|
import org.telegram.android.ImageReceiver;
|
||||||
import org.telegram.android.MessageObject;
|
import org.telegram.android.MessageObject;
|
||||||
import org.telegram.android.MessagesController;
|
import org.telegram.android.MessagesController;
|
||||||
import org.telegram.android.PhotoObject;
|
import org.telegram.messenger.FileLoader;
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
@ -105,13 +105,9 @@ public class ChatActionCell extends BaseCell {
|
|||||||
if (currentMessageObject.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
|
if (currentMessageObject.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
|
||||||
imageReceiver.setImage(currentMessageObject.messageOwner.action.newUserPhoto.photo_small, "50_50", avatarDrawable, false);
|
imageReceiver.setImage(currentMessageObject.messageOwner.action.newUserPhoto.photo_small, "50_50", avatarDrawable, false);
|
||||||
} else {
|
} else {
|
||||||
PhotoObject photo = PhotoObject.getClosestImageWithSize(currentMessageObject.photoThumbs, AndroidUtilities.dp(64));
|
TLRPC.PhotoSize photo = FileLoader.getClosestPhotoSizeWithSize(currentMessageObject.photoThumbs, AndroidUtilities.dp(64));
|
||||||
if (photo != null) {
|
if (photo != null) {
|
||||||
if (photo.image != null) {
|
imageReceiver.setImage(photo.location, "50_50", avatarDrawable, false);
|
||||||
imageReceiver.setImageBitmap(photo.image);
|
|
||||||
} else {
|
|
||||||
imageReceiver.setImage(photo.photoOwner.location, "50_50", avatarDrawable, false);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
imageReceiver.setImageBitmap(avatarDrawable);
|
imageReceiver.setImageBitmap(avatarDrawable);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,6 @@ import org.telegram.messenger.R;
|
|||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
import org.telegram.android.MessageObject;
|
import org.telegram.android.MessageObject;
|
||||||
import org.telegram.android.PhotoObject;
|
|
||||||
import org.telegram.ui.Components.RadialProgress;
|
import org.telegram.ui.Components.RadialProgress;
|
||||||
import org.telegram.ui.PhotoViewer;
|
import org.telegram.ui.PhotoViewer;
|
||||||
import org.telegram.ui.Components.GifDrawable;
|
import org.telegram.ui.Components.GifDrawable;
|
||||||
@ -67,8 +66,8 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
|
|
||||||
private int photoWidth;
|
private int photoWidth;
|
||||||
private int photoHeight;
|
private int photoHeight;
|
||||||
private PhotoObject currentPhotoObject;
|
private TLRPC.PhotoSize currentPhotoObject;
|
||||||
private PhotoObject currentPhotoObjectThumb;
|
private TLRPC.PhotoSize currentPhotoObjectThumb;
|
||||||
private String currentUrl;
|
private String currentUrl;
|
||||||
private String currentPhotoFilter;
|
private String currentPhotoFilter;
|
||||||
private ImageReceiver photoImage;
|
private ImageReceiver photoImage;
|
||||||
@ -339,11 +338,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
cancelLoading = false;
|
cancelLoading = false;
|
||||||
radialProgress.setProgress(0, false);
|
radialProgress.setProgress(0, false);
|
||||||
if (currentMessageObject.type == 1) {
|
if (currentMessageObject.type == 1) {
|
||||||
if (currentMessageObject.imagePreview != null) {
|
photoImage.setImage(currentPhotoObject.location, currentPhotoFilter, currentPhotoObjectThumb != null ? currentPhotoObjectThumb.location : null, currentPhotoFilter, currentPhotoObject.size, false);
|
||||||
photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, new BitmapDrawable(currentMessageObject.imagePreview), currentPhotoObject.photoOwner.size, false);
|
|
||||||
} else {
|
|
||||||
photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, null, currentPhotoObject.photoOwner.size, false);
|
|
||||||
}
|
|
||||||
} else if (currentMessageObject.type == 8 || currentMessageObject.type == 9) {
|
} else if (currentMessageObject.type == 8 || currentMessageObject.type == 9) {
|
||||||
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
|
FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.document, true, false);
|
||||||
lastDownloadedGifMessage = currentMessageObject;
|
lastDownloadedGifMessage = currentMessageObject;
|
||||||
@ -361,7 +356,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
} else {
|
} else {
|
||||||
cancelLoading = true;
|
cancelLoading = true;
|
||||||
if (currentMessageObject.type == 1) {
|
if (currentMessageObject.type == 1) {
|
||||||
ImageLoader.getInstance().cancelLoadingForImageView(photoImage);
|
photoImage.cancelLoadImage();
|
||||||
} else if (currentMessageObject.type == 8 || currentMessageObject.type == 9) {
|
} else if (currentMessageObject.type == 8 || currentMessageObject.type == 9) {
|
||||||
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.document);
|
FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.document);
|
||||||
if (lastDownloadedGifMessage != null && lastDownloadedGifMessage.messageOwner.id == currentMessageObject.messageOwner.id) {
|
if (lastDownloadedGifMessage != null && lastDownloadedGifMessage.messageOwner.id == currentMessageObject.messageOwner.id) {
|
||||||
@ -402,7 +397,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
if (!url.equals(currentUrl)) {
|
if (!url.equals(currentUrl)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (currentPhotoObject == null || currentPhotoObject.photoOwner.location instanceof TLRPC.TL_fileLocationUnavailable) {
|
} else if (currentPhotoObject == null || currentPhotoObject.location instanceof TLRPC.TL_fileLocationUnavailable) {
|
||||||
return true;
|
return true;
|
||||||
} else if (currentMessageObject != null && photoNotSet) {
|
} else if (currentMessageObject != null && photoNotSet) {
|
||||||
File cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
File cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
||||||
@ -429,6 +424,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
photoNotSet = false;
|
photoNotSet = false;
|
||||||
drawBackground = true;
|
drawBackground = true;
|
||||||
|
|
||||||
|
photoImage.setForcePreview(messageObject.isSecretPhoto());
|
||||||
if (messageObject.type == 9) {
|
if (messageObject.type == 9) {
|
||||||
String name = messageObject.getDocumentName();
|
String name = messageObject.getDocumentName();
|
||||||
if (name == null || name.length() == 0) {
|
if (name == null || name.length() == 0) {
|
||||||
@ -499,23 +495,21 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
nameLayout = null;
|
nameLayout = null;
|
||||||
updateSecretTimeText();
|
updateSecretTimeText();
|
||||||
}
|
}
|
||||||
|
if (messageObject.type == 9) { //doc
|
||||||
if (messageObject.type == 9) {
|
|
||||||
photoWidth = AndroidUtilities.dp(86);
|
photoWidth = AndroidUtilities.dp(86);
|
||||||
photoHeight = AndroidUtilities.dp(86);
|
photoHeight = AndroidUtilities.dp(86);
|
||||||
backgroundWidth = photoWidth + Math.max(nameWidth, infoWidth) + AndroidUtilities.dp(68);
|
backgroundWidth = photoWidth + Math.max(nameWidth, infoWidth) + AndroidUtilities.dp(68);
|
||||||
currentPhotoObject = PhotoObject.getClosestImageWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
|
photoImage.setNeedsQualityThumb(true);
|
||||||
|
photoImage.setShouldGenerateQualityThumb(true);
|
||||||
|
photoImage.setParentMessageObject(messageObject);
|
||||||
if (currentPhotoObject != null) {
|
if (currentPhotoObject != null) {
|
||||||
if (currentPhotoObject.image != null) {
|
currentPhotoFilter = String.format(Locale.US, "%d_%d_b", photoWidth, photoHeight);
|
||||||
photoImage.setImageBitmap(currentPhotoObject.image);
|
photoImage.setImage(null, null, null, null, currentPhotoObject.location, currentPhotoFilter, 0, true);
|
||||||
} else {
|
|
||||||
currentPhotoFilter = String.format(Locale.US, "%d_%d_b", photoWidth, photoHeight);
|
|
||||||
photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, null, 0, false);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
photoImage.setImageBitmap((BitmapDrawable)null);
|
photoImage.setImageBitmap((BitmapDrawable) null);
|
||||||
}
|
}
|
||||||
} else if (messageObject.type == 4) {
|
} else if (messageObject.type == 4) { //geo
|
||||||
photoWidth = AndroidUtilities.dp(100);
|
photoWidth = AndroidUtilities.dp(100);
|
||||||
photoHeight = AndroidUtilities.dp(100);
|
photoHeight = AndroidUtilities.dp(100);
|
||||||
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
|
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
|
||||||
@ -523,8 +517,11 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
double lat = messageObject.messageOwner.media.geo.lat;
|
double lat = messageObject.messageOwner.media.geo.lat;
|
||||||
double lon = messageObject.messageOwner.media.geo._long;
|
double lon = messageObject.messageOwner.media.geo._long;
|
||||||
currentUrl = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=13&size=100x100&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int)Math.ceil(AndroidUtilities.density)), lat, lon);
|
currentUrl = String.format(Locale.US, "https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&zoom=13&size=100x100&maptype=roadmap&scale=%d&markers=color:red|size:big|%f,%f&sensor=false", lat, lon, Math.min(2, (int)Math.ceil(AndroidUtilities.density)), lat, lon);
|
||||||
|
photoImage.setNeedsQualityThumb(false);
|
||||||
|
photoImage.setShouldGenerateQualityThumb(false);
|
||||||
|
photoImage.setParentMessageObject(null);
|
||||||
photoImage.setImage(currentUrl, null, null, 0);
|
photoImage.setImage(currentUrl, null, null, 0);
|
||||||
} else if (messageObject.type == 13) {
|
} else if (messageObject.type == 13) { //webp
|
||||||
drawBackground = false;
|
drawBackground = false;
|
||||||
for (TLRPC.DocumentAttribute attribute : messageObject.messageOwner.media.document.attributes) {
|
for (TLRPC.DocumentAttribute attribute : messageObject.messageOwner.media.document.attributes) {
|
||||||
if (attribute instanceof TLRPC.TL_documentAttributeImageSize) {
|
if (attribute instanceof TLRPC.TL_documentAttributeImageSize) {
|
||||||
@ -548,20 +545,26 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
photoWidth = (int)maxWidth;
|
photoWidth = (int)maxWidth;
|
||||||
}
|
}
|
||||||
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
|
backgroundWidth = photoWidth + AndroidUtilities.dp(12);
|
||||||
|
currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80);
|
||||||
|
photoImage.setNeedsQualityThumb(false);
|
||||||
|
photoImage.setShouldGenerateQualityThumb(false);
|
||||||
|
photoImage.setParentMessageObject(null);
|
||||||
if (currentMessageObject.messageOwner.attachPath != null && currentMessageObject.messageOwner.attachPath.length() > 0) {
|
if (currentMessageObject.messageOwner.attachPath != null && currentMessageObject.messageOwner.attachPath.length() > 0) {
|
||||||
File f = new File(currentMessageObject.messageOwner.attachPath);
|
File f = new File(currentMessageObject.messageOwner.attachPath);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
photoImage.setImage(null, currentMessageObject.messageOwner.attachPath,
|
photoImage.setImage(null, currentMessageObject.messageOwner.attachPath,
|
||||||
String.format(Locale.US, "%d_%d", photoWidth, photoHeight),
|
String.format(Locale.US, "%d_%d", photoWidth, photoHeight),
|
||||||
messageObject.imagePreview != null ? new BitmapDrawable(messageObject.imagePreview) : null,
|
|
||||||
null,
|
null,
|
||||||
|
currentPhotoObjectThumb != null ? currentPhotoObjectThumb.location : null,
|
||||||
|
"b1",
|
||||||
currentMessageObject.messageOwner.media.document.size, true);
|
currentMessageObject.messageOwner.media.document.size, true);
|
||||||
}
|
}
|
||||||
} else if (currentMessageObject.messageOwner.media.document.id != 0) {
|
} else if (currentMessageObject.messageOwner.media.document.id != 0) {
|
||||||
photoImage.setImage(currentMessageObject.messageOwner.media.document, null,
|
photoImage.setImage(currentMessageObject.messageOwner.media.document, null,
|
||||||
String.format(Locale.US, "%d_%d", photoWidth, photoHeight),
|
String.format(Locale.US, "%d_%d", photoWidth, photoHeight),
|
||||||
messageObject.imagePreview != null ? new BitmapDrawable(messageObject.imagePreview) : null,
|
null,
|
||||||
messageObject.messageOwner.media.document.thumb.location,
|
currentPhotoObjectThumb != null ? currentPhotoObjectThumb.location : null,
|
||||||
|
"b1",
|
||||||
currentMessageObject.messageOwner.media.document.size, true);
|
currentMessageObject.messageOwner.media.document.size, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -579,23 +582,38 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
photoHeight = AndroidUtilities.getPhotoSize();
|
photoHeight = AndroidUtilities.getPhotoSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPhotoObject = PhotoObject.getClosestImageWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
|
||||||
if (messageObject.type == 1) {
|
if (messageObject.type == 1) {
|
||||||
currentPhotoObjectThumb = PhotoObject.getClosestImageWithSize(messageObject.photoThumbs, 80);
|
photoImage.setNeedsQualityThumb(false);
|
||||||
|
photoImage.setShouldGenerateQualityThumb(false);
|
||||||
|
photoImage.setParentMessageObject(null);
|
||||||
|
currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80);
|
||||||
|
} else if (messageObject.type == 3) {
|
||||||
|
photoImage.setNeedsQualityThumb(true);
|
||||||
|
photoImage.setShouldGenerateQualityThumb(true);
|
||||||
|
photoImage.setParentMessageObject(messageObject);
|
||||||
|
} else if (messageObject.type == 8) {
|
||||||
|
photoImage.setNeedsQualityThumb(true);
|
||||||
|
photoImage.setShouldGenerateQualityThumb(true);
|
||||||
|
photoImage.setParentMessageObject(messageObject);
|
||||||
}
|
}
|
||||||
|
//8 - gif, 1 - photo, 3 - video
|
||||||
|
|
||||||
|
|
||||||
|
currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
|
|
||||||
if (currentPhotoObject != null) {
|
if (currentPhotoObject != null) {
|
||||||
boolean noSize = false;
|
boolean noSize = false;
|
||||||
if (currentMessageObject.type == 3 || currentMessageObject.type == 8) {
|
if (currentMessageObject.type == 3 || currentMessageObject.type == 8) {
|
||||||
noSize = true;
|
noSize = true;
|
||||||
}
|
}
|
||||||
float scale = (float) currentPhotoObject.photoOwner.w / (float) photoWidth;
|
float scale = (float) currentPhotoObject.w / (float) photoWidth;
|
||||||
|
|
||||||
if (!noSize && currentPhotoObject.photoOwner.size == 0) {
|
if (!noSize && currentPhotoObject.size == 0) {
|
||||||
currentPhotoObject.photoOwner.size = -1;
|
currentPhotoObject.size = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int w = (int) (currentPhotoObject.photoOwner.w / scale);
|
int w = (int) (currentPhotoObject.w / scale);
|
||||||
int h = (int) (currentPhotoObject.photoOwner.h / scale);
|
int h = (int) (currentPhotoObject.h / scale);
|
||||||
if (w == 0) {
|
if (w == 0) {
|
||||||
if (messageObject.type == 3) {
|
if (messageObject.type == 3) {
|
||||||
w = infoWidth + infoOffset + AndroidUtilities.dp(16);
|
w = infoWidth + infoOffset + AndroidUtilities.dp(16);
|
||||||
@ -613,9 +631,9 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
w = (int) (w / scale2);
|
w = (int) (w / scale2);
|
||||||
} else if (h < AndroidUtilities.dp(120)) {
|
} else if (h < AndroidUtilities.dp(120)) {
|
||||||
h = AndroidUtilities.dp(120);
|
h = AndroidUtilities.dp(120);
|
||||||
float hScale = (float) currentPhotoObject.photoOwner.h / h;
|
float hScale = (float) currentPhotoObject.h / h;
|
||||||
if (currentPhotoObject.photoOwner.w / hScale < photoWidth) {
|
if (currentPhotoObject.w / hScale < photoWidth) {
|
||||||
w = (int) (currentPhotoObject.photoOwner.w / hScale);
|
w = (int) (currentPhotoObject.w / hScale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int timeWidthTotal = timeWidth + AndroidUtilities.dp(14 + (currentMessageObject.isOut() ? 20 : 0));
|
int timeWidthTotal = timeWidth + AndroidUtilities.dp(14 + (currentMessageObject.isOut() ? 20 : 0));
|
||||||
@ -634,49 +652,50 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
photoWidth = w;
|
photoWidth = w;
|
||||||
photoHeight = h;
|
photoHeight = h;
|
||||||
backgroundWidth = w + AndroidUtilities.dp(12);
|
backgroundWidth = w + AndroidUtilities.dp(12);
|
||||||
|
|
||||||
currentPhotoFilter = String.format(Locale.US, "%d_%d", (int) (w / AndroidUtilities.density), (int) (h / AndroidUtilities.density));
|
currentPhotoFilter = String.format(Locale.US, "%d_%d", (int) (w / AndroidUtilities.density), (int) (h / AndroidUtilities.density));
|
||||||
if (messageObject.photoThumbs.size() > 1 || messageObject.type == 3 || messageObject.type == 8) {
|
if (messageObject.photoThumbs.size() > 1 || messageObject.type == 3 || messageObject.type == 8) {
|
||||||
currentPhotoFilter += "_b";
|
if (messageObject.isSecretPhoto()) {
|
||||||
|
currentPhotoFilter += "_b2";
|
||||||
|
} else {
|
||||||
|
currentPhotoFilter += "_b";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentPhotoObject.image != null) {
|
String fileName = FileLoader.getAttachFileName(currentPhotoObject);
|
||||||
photoImage.setImageBitmap(currentPhotoObject.image);
|
if (messageObject.type == 1) {
|
||||||
} else {
|
|
||||||
boolean photoExist = true;
|
boolean photoExist = true;
|
||||||
String fileName = FileLoader.getAttachFileName(currentPhotoObject.photoOwner);
|
File cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
||||||
if (messageObject.type == 1) {
|
if (!cacheFile.exists()) {
|
||||||
File cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
photoExist = false;
|
||||||
if (!cacheFile.exists()) {
|
} else {
|
||||||
photoExist = false;
|
MediaController.getInstance().removeLoadingFileObserver(this);
|
||||||
} else {
|
|
||||||
MediaController.getInstance().removeLoadingFileObserver(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (photoExist || MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_PHOTO) || FileLoader.getInstance().isLoadingFile(fileName)) {
|
if (photoExist || MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_PHOTO) || FileLoader.getInstance().isLoadingFile(fileName)) {
|
||||||
if (allowedToSetPhoto || ImageLoader.getInstance().getImageFromMemory(currentPhotoObject.photoOwner.location, null, currentPhotoFilter, null) != null) {
|
if (allowedToSetPhoto || ImageLoader.getInstance().getImageFromMemory(currentPhotoObject.location, null, currentPhotoFilter) != null) {
|
||||||
allowedToSetPhoto = true;
|
allowedToSetPhoto = true;
|
||||||
if (messageObject.imagePreview != null) {
|
photoImage.setImage(currentPhotoObject.location, currentPhotoFilter, currentPhotoObjectThumb != null ? currentPhotoObjectThumb.location : null, currentPhotoFilter, noSize ? 0 : currentPhotoObject.size, false);
|
||||||
photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, new BitmapDrawable(messageObject.imagePreview), noSize ? 0 : currentPhotoObject.photoOwner.size, false);
|
} else if (currentPhotoObjectThumb != null) {
|
||||||
} else {
|
photoImage.setImage(null, null, currentPhotoObjectThumb.location, currentPhotoFilter, 0, false);
|
||||||
photoImage.setImage(currentPhotoObject.photoOwner.location, currentPhotoFilter, null, noSize ? 0 : currentPhotoObject.photoOwner.size, false);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
photoImage.setImageBitmap(messageObject.imagePreview);
|
photoImage.setImageBitmap((Drawable) null);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
photoNotSet = true;
|
photoNotSet = true;
|
||||||
if (messageObject.imagePreview != null) {
|
if (currentPhotoObjectThumb != null) {
|
||||||
photoImage.setImageBitmap(messageObject.imagePreview);
|
photoImage.setImage(null, null, currentPhotoObjectThumb.location, currentPhotoFilter, 0, false);
|
||||||
} else if (currentPhotoObjectThumb != null) {
|
} else {
|
||||||
photoImage.setImage(currentPhotoObjectThumb.photoOwner.location, currentPhotoFilter, null, 0, true);
|
photoImage.setImageBitmap((Drawable) null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
photoImage.setImage(null, null, currentPhotoObject.location, currentPhotoFilter, 0, false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
photoImage.setImageBitmap((Bitmap)null);
|
photoImage.setImageBitmap((Bitmap)null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
photoImage.setForcePreview(messageObject.isSecretPhoto());
|
|
||||||
|
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
@ -694,7 +713,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD
|
|||||||
if (currentPhotoObject == null) {
|
if (currentPhotoObject == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fileName = FileLoader.getAttachFileName(currentPhotoObject.photoOwner);
|
fileName = FileLoader.getAttachFileName(currentPhotoObject);
|
||||||
cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner);
|
||||||
} else if (currentMessageObject.type == 8 || currentMessageObject.type == 3 || currentMessageObject.type == 9) {
|
} else if (currentMessageObject.type == 8 || currentMessageObject.type == 3 || currentMessageObject.type == 9) {
|
||||||
if (currentMessageObject.messageOwner.attachPath != null && currentMessageObject.messageOwner.attachPath.length() != 0) {
|
if (currentMessageObject.messageOwner.attachPath != null && currentMessageObject.messageOwner.attachPath.length() != 0) {
|
||||||
|
@ -50,6 +50,7 @@ public class DialogCell extends BaseCell {
|
|||||||
private static Drawable countDrawable;
|
private static Drawable countDrawable;
|
||||||
private static Drawable groupDrawable;
|
private static Drawable groupDrawable;
|
||||||
private static Drawable broadcastDrawable;
|
private static Drawable broadcastDrawable;
|
||||||
|
private static Drawable muteDrawable;
|
||||||
|
|
||||||
private static Paint linePaint;
|
private static Paint linePaint;
|
||||||
|
|
||||||
@ -58,6 +59,7 @@ public class DialogCell extends BaseCell {
|
|||||||
private int lastMessageDate;
|
private int lastMessageDate;
|
||||||
private int unreadCount;
|
private int unreadCount;
|
||||||
private boolean lastUnreadState;
|
private boolean lastUnreadState;
|
||||||
|
private boolean dialogMuted;
|
||||||
private MessageObject message;
|
private MessageObject message;
|
||||||
|
|
||||||
private ImageReceiver avatarImage;
|
private ImageReceiver avatarImage;
|
||||||
@ -76,6 +78,7 @@ public class DialogCell extends BaseCell {
|
|||||||
private boolean drawNameLock;
|
private boolean drawNameLock;
|
||||||
private boolean drawNameGroup;
|
private boolean drawNameGroup;
|
||||||
private boolean drawNameBroadcast;
|
private boolean drawNameBroadcast;
|
||||||
|
private int nameMuteLeft;
|
||||||
private int nameLockLeft;
|
private int nameLockLeft;
|
||||||
private int nameLockTop;
|
private int nameLockTop;
|
||||||
|
|
||||||
@ -151,6 +154,7 @@ public class DialogCell extends BaseCell {
|
|||||||
countDrawable = getResources().getDrawable(R.drawable.dialogs_badge);
|
countDrawable = getResources().getDrawable(R.drawable.dialogs_badge);
|
||||||
groupDrawable = getResources().getDrawable(R.drawable.list_group);
|
groupDrawable = getResources().getDrawable(R.drawable.list_group);
|
||||||
broadcastDrawable = getResources().getDrawable(R.drawable.list_broadcast);
|
broadcastDrawable = getResources().getDrawable(R.drawable.list_broadcast);
|
||||||
|
muteDrawable = getResources().getDrawable(R.drawable.mute_grey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,12 +166,13 @@ public class DialogCell extends BaseCell {
|
|||||||
avatarDrawable = new AvatarDrawable();
|
avatarDrawable = new AvatarDrawable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDialog(long dialog_id, MessageObject messageObject, boolean usePrintStrings, int date, int unread) {
|
public void setDialog(long dialog_id, MessageObject messageObject, boolean usePrintStrings, int date, int unread, boolean muted) {
|
||||||
currentDialogId = dialog_id;
|
currentDialogId = dialog_id;
|
||||||
message = messageObject;
|
message = messageObject;
|
||||||
allowPrintStrings = usePrintStrings;
|
allowPrintStrings = usePrintStrings;
|
||||||
lastMessageDate = date;
|
lastMessageDate = date;
|
||||||
unreadCount = unread;
|
unreadCount = unread;
|
||||||
|
dialogMuted = muted;
|
||||||
lastUnreadState = messageObject != null && messageObject.isUnread();
|
lastUnreadState = messageObject != null && messageObject.isUnread();
|
||||||
update(0);
|
update(0);
|
||||||
}
|
}
|
||||||
@ -463,6 +468,14 @@ public class DialogCell extends BaseCell {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dialogMuted) {
|
||||||
|
int w = AndroidUtilities.dp(6) + muteDrawable.getIntrinsicWidth();
|
||||||
|
nameWidth -= w;
|
||||||
|
if (LocaleController.isRTL) {
|
||||||
|
nameLeft += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nameWidth = Math.max(AndroidUtilities.dp(12), nameWidth);
|
nameWidth = Math.max(AndroidUtilities.dp(12), nameWidth);
|
||||||
CharSequence nameStringFinal = TextUtils.ellipsize(nameString.replace("\n", " "), currentNamePaint, nameWidth - AndroidUtilities.dp(12), TextUtils.TruncateAt.END);
|
CharSequence nameStringFinal = TextUtils.ellipsize(nameString.replace("\n", " "), currentNamePaint, nameWidth - AndroidUtilities.dp(12), TextUtils.TruncateAt.END);
|
||||||
try {
|
try {
|
||||||
@ -536,6 +549,9 @@ public class DialogCell extends BaseCell {
|
|||||||
nameLeft += (nameWidth - widthpx);
|
nameLeft += (nameWidth - widthpx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (dialogMuted) {
|
||||||
|
nameMuteLeft = (nameLeft - AndroidUtilities.dp(6) - muteDrawable.getIntrinsicWidth());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (messageLayout != null && messageLayout.getLineCount() > 0) {
|
if (messageLayout != null && messageLayout.getLineCount() > 0) {
|
||||||
left = messageLayout.getLineLeft(0);
|
left = messageLayout.getLineLeft(0);
|
||||||
@ -555,6 +571,9 @@ public class DialogCell extends BaseCell {
|
|||||||
nameLeft -= (nameWidth - widthpx);
|
nameLeft -= (nameWidth - widthpx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (dialogMuted) {
|
||||||
|
nameMuteLeft = (int) (nameLeft + left + AndroidUtilities.dp(6));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (messageLayout != null && messageLayout.getLineCount() > 0) {
|
if (messageLayout != null && messageLayout.getLineCount() > 0) {
|
||||||
left = messageLayout.getLineRight(0);
|
left = messageLayout.getLineRight(0);
|
||||||
@ -710,6 +729,11 @@ public class DialogCell extends BaseCell {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dialogMuted) {
|
||||||
|
setDrawableBounds(muteDrawable, nameMuteLeft, AndroidUtilities.dp(16.5f));
|
||||||
|
muteDrawable.draw(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
if (drawError) {
|
if (drawError) {
|
||||||
setDrawableBounds(errorDrawable, errorLeft, errorTop);
|
setDrawableBounds(errorDrawable, errorLeft, errorTop);
|
||||||
errorDrawable.draw(canvas);
|
errorDrawable.draw(canvas);
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* This is the source code of Telegram for Android v. 2.0.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.util.TypedValue;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.telegram.android.AndroidUtilities;
|
||||||
|
import org.telegram.ui.Components.FrameLayoutFixed;
|
||||||
|
|
||||||
|
public class PhotoEditToolCell extends FrameLayoutFixed {
|
||||||
|
|
||||||
|
private ImageView iconImage;
|
||||||
|
private TextView nameTextView;
|
||||||
|
private TextView valueTextView;
|
||||||
|
|
||||||
|
public PhotoEditToolCell(Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
iconImage = new ImageView(context);
|
||||||
|
iconImage.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
|
addView(iconImage);
|
||||||
|
LayoutParams layoutParams = (LayoutParams) iconImage.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.height = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.bottomMargin = AndroidUtilities.dp(20);
|
||||||
|
iconImage.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
nameTextView = new TextView(context);
|
||||||
|
nameTextView.setGravity(Gravity.CENTER);
|
||||||
|
nameTextView.setTextColor(0xffffffff);
|
||||||
|
nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
|
||||||
|
addView(nameTextView);
|
||||||
|
layoutParams = (LayoutParams) nameTextView.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.height = AndroidUtilities.dp(20);
|
||||||
|
layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM;
|
||||||
|
nameTextView.setLayoutParams(layoutParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
super.onMeasure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(80), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIconAndText(int resId, String text) {
|
||||||
|
iconImage.setImageResource(resId);
|
||||||
|
nameTextView.setText(text);
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,7 @@ package org.telegram.ui.Cells;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import org.telegram.android.AndroidUtilities;
|
import org.telegram.android.AndroidUtilities;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
@ -22,6 +23,7 @@ public class PhotoPickerPhotoCell extends FrameLayout {
|
|||||||
public BackupImageView photoImage;
|
public BackupImageView photoImage;
|
||||||
public FrameLayout checkFrame;
|
public FrameLayout checkFrame;
|
||||||
public CheckBox checkBox;
|
public CheckBox checkBox;
|
||||||
|
public ImageView editedImage;
|
||||||
public int itemWidth;
|
public int itemWidth;
|
||||||
|
|
||||||
public PhotoPickerPhotoCell(Context context) {
|
public PhotoPickerPhotoCell(Context context) {
|
||||||
@ -55,6 +57,16 @@ public class PhotoPickerPhotoCell extends FrameLayout {
|
|||||||
layoutParams.topMargin = AndroidUtilities.dp(6);
|
layoutParams.topMargin = AndroidUtilities.dp(6);
|
||||||
layoutParams.rightMargin = AndroidUtilities.dp(6);
|
layoutParams.rightMargin = AndroidUtilities.dp(6);
|
||||||
checkBox.setLayoutParams(layoutParams);
|
checkBox.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
editedImage = new ImageView(context);
|
||||||
|
editedImage.setImageResource(R.drawable.photo_edit);
|
||||||
|
editedImage.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
|
addView(editedImage);
|
||||||
|
layoutParams = (LayoutParams) editedImage.getLayoutParams();
|
||||||
|
layoutParams.width = AndroidUtilities.dp(42);
|
||||||
|
layoutParams.height = AndroidUtilities.dp(42);
|
||||||
|
layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
|
||||||
|
editedImage.setLayoutParams(layoutParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,381 @@
|
|||||||
|
/*
|
||||||
|
* This is the source code of Telegram for Android v. 2.0.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.Drawable;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.telegram.android.AndroidUtilities;
|
||||||
|
import org.telegram.android.ImageLoader;
|
||||||
|
import org.telegram.android.ImageReceiver;
|
||||||
|
import org.telegram.android.LocaleController;
|
||||||
|
import org.telegram.android.MediaController;
|
||||||
|
import org.telegram.android.MessageObject;
|
||||||
|
import org.telegram.messenger.FileLoader;
|
||||||
|
import org.telegram.messenger.R;
|
||||||
|
import org.telegram.messenger.TLRPC;
|
||||||
|
import org.telegram.messenger.Utilities;
|
||||||
|
import org.telegram.ui.Components.BackupImageView;
|
||||||
|
import org.telegram.ui.Components.CheckBox;
|
||||||
|
import org.telegram.ui.Components.LineProgressView;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class SharedDocumentCell extends FrameLayout implements MediaController.FileDownloadProgressListener {
|
||||||
|
|
||||||
|
private ImageView placeholderImabeView;
|
||||||
|
private BackupImageView thumbImageView;
|
||||||
|
private TextView nameTextView;
|
||||||
|
private TextView extTextView;
|
||||||
|
private TextView dateTextView;
|
||||||
|
private ImageView statusImageView;
|
||||||
|
private LineProgressView progressView;
|
||||||
|
private CheckBox checkBox;
|
||||||
|
|
||||||
|
private boolean needDivider;
|
||||||
|
|
||||||
|
private static Paint paint;
|
||||||
|
|
||||||
|
private int TAG;
|
||||||
|
|
||||||
|
private MessageObject message;
|
||||||
|
private boolean loading;
|
||||||
|
private boolean loaded;
|
||||||
|
|
||||||
|
private int icons[] = {
|
||||||
|
R.drawable.media_doc_blue,
|
||||||
|
R.drawable.media_doc_green,
|
||||||
|
R.drawable.media_doc_red,
|
||||||
|
R.drawable.media_doc_yellow
|
||||||
|
};
|
||||||
|
|
||||||
|
public SharedDocumentCell(Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
if (paint == null) {
|
||||||
|
paint = new Paint();
|
||||||
|
paint.setColor(0xffd9d9d9);
|
||||||
|
paint.setStrokeWidth(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TAG = MediaController.getInstance().generateObserverTag();
|
||||||
|
|
||||||
|
placeholderImabeView = new ImageView(context);
|
||||||
|
addView(placeholderImabeView);
|
||||||
|
LayoutParams layoutParams = (LayoutParams) placeholderImabeView.getLayoutParams();
|
||||||
|
layoutParams.width = AndroidUtilities.dp(40);
|
||||||
|
layoutParams.height = AndroidUtilities.dp(40);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(12);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(12) : 0;
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(8);
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
placeholderImabeView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
extTextView = new TextView(context);
|
||||||
|
extTextView.setTextColor(0xffffffff);
|
||||||
|
extTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
||||||
|
extTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
|
extTextView.setLines(1);
|
||||||
|
extTextView.setMaxLines(1);
|
||||||
|
extTextView.setSingleLine(true);
|
||||||
|
extTextView.setGravity(Gravity.CENTER);
|
||||||
|
extTextView.setEllipsize(TextUtils.TruncateAt.END);
|
||||||
|
addView(extTextView);
|
||||||
|
layoutParams = (LayoutParams) extTextView.getLayoutParams();
|
||||||
|
layoutParams.width = AndroidUtilities.dp(32);
|
||||||
|
layoutParams.height = LayoutParams.WRAP_CONTENT;
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(22);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(16);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(16) : 0;
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
extTextView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
thumbImageView = new BackupImageView(context);
|
||||||
|
thumbImageView.imageReceiver.setDelegate(new ImageReceiver.ImageReceiverDelegate() {
|
||||||
|
@Override
|
||||||
|
public void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb) {
|
||||||
|
extTextView.setVisibility(set ? GONE : VISIBLE);
|
||||||
|
placeholderImabeView.setVisibility(set ? GONE : VISIBLE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
addView(thumbImageView);
|
||||||
|
layoutParams = (LayoutParams) thumbImageView.getLayoutParams();
|
||||||
|
layoutParams.width = AndroidUtilities.dp(40);
|
||||||
|
layoutParams.height = AndroidUtilities.dp(40);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(12);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(12) : 0;
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(8);
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
thumbImageView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
nameTextView = new TextView(context);
|
||||||
|
nameTextView.setTextColor(0xff222222);
|
||||||
|
nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
||||||
|
nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
|
nameTextView.setLines(1);
|
||||||
|
nameTextView.setMaxLines(1);
|
||||||
|
nameTextView.setSingleLine(true);
|
||||||
|
nameTextView.setEllipsize(TextUtils.TruncateAt.END);
|
||||||
|
nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
|
||||||
|
addView(nameTextView);
|
||||||
|
layoutParams = (LayoutParams) nameTextView.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.height = LayoutParams.WRAP_CONTENT;
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(5);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(72);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(72) : AndroidUtilities.dp(8);
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
nameTextView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
statusImageView = new ImageView(context);
|
||||||
|
statusImageView.setVisibility(GONE);
|
||||||
|
addView(statusImageView);
|
||||||
|
layoutParams = (LayoutParams) statusImageView.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.WRAP_CONTENT;
|
||||||
|
layoutParams.height = LayoutParams.WRAP_CONTENT;
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(35);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(72);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(72) : AndroidUtilities.dp(8);
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
statusImageView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
dateTextView = new TextView(context);
|
||||||
|
dateTextView.setTextColor(0xff999999);
|
||||||
|
dateTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
||||||
|
dateTextView.setLines(1);
|
||||||
|
dateTextView.setMaxLines(1);
|
||||||
|
dateTextView.setSingleLine(true);
|
||||||
|
dateTextView.setEllipsize(TextUtils.TruncateAt.END);
|
||||||
|
dateTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL);
|
||||||
|
addView(dateTextView);
|
||||||
|
layoutParams = (LayoutParams) dateTextView.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.height = LayoutParams.WRAP_CONTENT;
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(30);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(72);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(72) : AndroidUtilities.dp(8);
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
dateTextView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
progressView = new LineProgressView(context);
|
||||||
|
addView(progressView);
|
||||||
|
layoutParams = (LayoutParams) progressView.getLayoutParams();
|
||||||
|
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||||
|
layoutParams.height = AndroidUtilities.dp(2);
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(54);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(72);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(72) : 0;
|
||||||
|
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
||||||
|
progressView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
checkBox = new CheckBox(context, R.drawable.round_check2);
|
||||||
|
checkBox.setVisibility(GONE);
|
||||||
|
addView(checkBox);
|
||||||
|
layoutParams = (LayoutParams) checkBox.getLayoutParams();
|
||||||
|
layoutParams.width = AndroidUtilities.dp(22);
|
||||||
|
layoutParams.height = AndroidUtilities.dp(22);
|
||||||
|
layoutParams.topMargin = AndroidUtilities.dp(30);
|
||||||
|
layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(34);
|
||||||
|
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(34) : 0;
|
||||||
|
layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
|
||||||
|
checkBox.setLayoutParams(layoutParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getThumbForNameOrMime(String name, String mime) {
|
||||||
|
if (name != null && name.length() != 0) {
|
||||||
|
int color = -1;
|
||||||
|
if (name.contains(".doc") || name.contains(".txt") || name.contains(".psd")) {
|
||||||
|
color = 0;
|
||||||
|
} else if (name.contains(".xls") || name.contains(".csv")) {
|
||||||
|
color = 1;
|
||||||
|
} else if (name.contains(".pdf") || name.contains(".ppt") || name.contains(".key")) {
|
||||||
|
color = 2;
|
||||||
|
} else if (name.contains(".zip") || name.contains(".rar") || name.contains(".ai") || name.contains(".mp3") || name.contains(".mov") || name.contains(".avi")) {
|
||||||
|
color = 3;
|
||||||
|
}
|
||||||
|
if (color == -1) {
|
||||||
|
int idx;
|
||||||
|
String ext = (idx = name.lastIndexOf(".")) == -1 ? "" : name.substring(idx + 1);
|
||||||
|
if (ext.length() != 0) {
|
||||||
|
color = ext.charAt(0) % icons.length;
|
||||||
|
} else {
|
||||||
|
color = name.charAt(0) % icons.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return icons[color];
|
||||||
|
}
|
||||||
|
return icons[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTextAndValueAndTypeAndThumb(String text, String value, String type, String thumb, int resId) {
|
||||||
|
nameTextView.setText(text);
|
||||||
|
dateTextView.setText(value);
|
||||||
|
if (type != null) {
|
||||||
|
extTextView.setVisibility(VISIBLE);
|
||||||
|
extTextView.setText(type);
|
||||||
|
} else {
|
||||||
|
extTextView.setVisibility(GONE);
|
||||||
|
}
|
||||||
|
if (resId == 0) {
|
||||||
|
placeholderImabeView.setImageResource(getThumbForNameOrMime(text, type));
|
||||||
|
placeholderImabeView.setVisibility(VISIBLE);
|
||||||
|
} else {
|
||||||
|
placeholderImabeView.setVisibility(GONE);
|
||||||
|
}
|
||||||
|
if (thumb != null || resId != 0) {
|
||||||
|
if (thumb != null) {
|
||||||
|
thumbImageView.setImage(thumb, "40_40", null);
|
||||||
|
} else {
|
||||||
|
thumbImageView.setImageResource(resId);
|
||||||
|
}
|
||||||
|
thumbImageView.setVisibility(VISIBLE);
|
||||||
|
} else {
|
||||||
|
thumbImageView.setVisibility(GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChecked(boolean checked, boolean animated) {
|
||||||
|
if (checkBox.getVisibility() != VISIBLE) {
|
||||||
|
checkBox.setVisibility(VISIBLE);
|
||||||
|
}
|
||||||
|
checkBox.setChecked(checked, animated);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocument(MessageObject document, boolean divider) {
|
||||||
|
needDivider = divider;
|
||||||
|
message = document;
|
||||||
|
loaded = false;
|
||||||
|
loading = false;
|
||||||
|
|
||||||
|
int idx = -1;
|
||||||
|
String name = FileLoader.getDocumentFileName(document.messageOwner.media.document);
|
||||||
|
placeholderImabeView.setVisibility(VISIBLE);
|
||||||
|
extTextView.setVisibility(VISIBLE);
|
||||||
|
placeholderImabeView.setImageResource(getThumbForNameOrMime(name, document.messageOwner.media.document.mime_type));
|
||||||
|
nameTextView.setText(name);
|
||||||
|
extTextView.setText((idx = name.lastIndexOf(".")) == -1 ? "" : name.substring(idx + 1).toLowerCase());
|
||||||
|
if (document.messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty) {
|
||||||
|
thumbImageView.setVisibility(GONE);
|
||||||
|
thumbImageView.setImageBitmap(null);
|
||||||
|
} else {
|
||||||
|
thumbImageView.setVisibility(VISIBLE);
|
||||||
|
thumbImageView.setImage(document.messageOwner.media.document.thumb.location, "40_40", (Drawable) null);
|
||||||
|
}
|
||||||
|
long date = (long) document.messageOwner.date * 1000;
|
||||||
|
dateTextView.setText(String.format("%s, %s", Utilities.formatFileSize(document.messageOwner.media.document.size), LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.formatterYear.format(new Date(date)), LocaleController.formatterDay.format(new Date(date)))));
|
||||||
|
setWillNotDraw(!needDivider);
|
||||||
|
progressView.setProgress(0, false);
|
||||||
|
|
||||||
|
updateFileExistIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateFileExistIcon() {
|
||||||
|
if (message != null) {
|
||||||
|
String fileName = null;
|
||||||
|
File cacheFile = null;
|
||||||
|
if (message.messageOwner.attachPath == null || message.messageOwner.attachPath.length() == 0 || !(new File(message.messageOwner.attachPath).exists())) {
|
||||||
|
cacheFile = FileLoader.getPathToMessage(message.messageOwner);
|
||||||
|
if (!cacheFile.exists()) {
|
||||||
|
fileName = FileLoader.getAttachFileName(message.messageOwner.media.document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loaded = false;
|
||||||
|
if (fileName == null) {
|
||||||
|
statusImageView.setVisibility(GONE);
|
||||||
|
dateTextView.setPadding(0, 0, 0, 0);
|
||||||
|
loading = false;
|
||||||
|
loaded = true;
|
||||||
|
MediaController.getInstance().removeLoadingFileObserver(this);
|
||||||
|
} else {
|
||||||
|
MediaController.getInstance().addLoadingFileObserver(fileName, this);
|
||||||
|
loading = FileLoader.getInstance().isLoadingFile(fileName);
|
||||||
|
statusImageView.setVisibility(VISIBLE);
|
||||||
|
statusImageView.setImageResource(loading ? R.drawable.media_doc_pause : R.drawable.media_doc_load);
|
||||||
|
dateTextView.setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(14), 0, LocaleController.isRTL ? AndroidUtilities.dp(14) : 0, 0);
|
||||||
|
if (loading) {
|
||||||
|
progressView.setVisibility(VISIBLE);
|
||||||
|
Float progress = ImageLoader.getInstance().getFileProgress(fileName);
|
||||||
|
if (progress == null) {
|
||||||
|
progress = 0.0f;
|
||||||
|
}
|
||||||
|
progressView.setProgress(progress, false);
|
||||||
|
} else {
|
||||||
|
progressView.setVisibility(GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
loading = false;
|
||||||
|
loaded = true;
|
||||||
|
progressView.setVisibility(GONE);
|
||||||
|
progressView.setProgress(0, false);
|
||||||
|
statusImageView.setVisibility(GONE);
|
||||||
|
dateTextView.setPadding(0, 0, 0, 0);
|
||||||
|
MediaController.getInstance().removeLoadingFileObserver(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageObject getDocument() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLoaded() {
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLoading() {
|
||||||
|
return loading;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(56) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
if (needDivider) {
|
||||||
|
canvas.drawLine(AndroidUtilities.dp(72), getHeight() - 1, getWidth() - getPaddingRight(), getHeight() - 1, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailedDownload(String name) {
|
||||||
|
updateFileExistIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccessDownload(String name) {
|
||||||
|
progressView.setProgress(1, true);
|
||||||
|
updateFileExistIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onProgressDownload(String fileName, float progress) {
|
||||||
|
progressView.setProgress(progress, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onProgressUpload(String fileName, float progress, boolean isEncrypted) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getObserverTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
}
|
@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* This is the source code of Telegram for Android v. 1.7.x.
|
|
||||||
* It is licensed under GNU GPL v. 2 or later.
|
|
||||||
* You should have received a copy of the license in this archive (see LICENSE).
|
|
||||||
*
|
|
||||||
* Copyright Nikolai Kudashov, 2013-2014.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.telegram.ui.Cells;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.TypedValue;
|
|
||||||
import android.view.Gravity;
|
|
||||||
import android.widget.FrameLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.telegram.android.AndroidUtilities;
|
|
||||||
import org.telegram.android.LocaleController;
|
|
||||||
import org.telegram.messenger.R;
|
|
||||||
import org.telegram.ui.Components.BackupImageView;
|
|
||||||
import org.telegram.ui.Components.CheckBox;
|
|
||||||
|
|
||||||
public class TextDetailDocumentsCell extends FrameLayout {
|
|
||||||
|
|
||||||
private TextView textView;
|
|
||||||
private TextView valueTextView;
|
|
||||||
private TextView typeTextView;
|
|
||||||
private BackupImageView imageView;
|
|
||||||
private CheckBox checkBox;
|
|
||||||
|
|
||||||
public TextDetailDocumentsCell(Context context) {
|
|
||||||
super(context);
|
|
||||||
|
|
||||||
textView = new TextView(context);
|
|
||||||
textView.setTextColor(0xff212121);
|
|
||||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
|
||||||
textView.setLines(1);
|
|
||||||
textView.setMaxLines(1);
|
|
||||||
textView.setSingleLine(true);
|
|
||||||
textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
|
|
||||||
addView(textView);
|
|
||||||
LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams();
|
|
||||||
layoutParams.width = LayoutParams.WRAP_CONTENT;
|
|
||||||
layoutParams.height = LayoutParams.WRAP_CONTENT;
|
|
||||||
layoutParams.topMargin = AndroidUtilities.dp(10);
|
|
||||||
layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 71);
|
|
||||||
layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 71 : 16);
|
|
||||||
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
|
||||||
textView.setLayoutParams(layoutParams);
|
|
||||||
|
|
||||||
valueTextView = new TextView(context);
|
|
||||||
valueTextView.setTextColor(0xff8a8a8a);
|
|
||||||
valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
|
|
||||||
valueTextView.setLines(1);
|
|
||||||
valueTextView.setMaxLines(1);
|
|
||||||
valueTextView.setSingleLine(true);
|
|
||||||
valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
|
|
||||||
addView(valueTextView);
|
|
||||||
layoutParams = (LayoutParams) valueTextView.getLayoutParams();
|
|
||||||
layoutParams.width = LayoutParams.WRAP_CONTENT;
|
|
||||||
layoutParams.height = LayoutParams.WRAP_CONTENT;
|
|
||||||
layoutParams.topMargin = AndroidUtilities.dp(35);
|
|
||||||
layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 71);
|
|
||||||
layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 71 : 16);
|
|
||||||
layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT;
|
|
||||||
valueTextView.setLayoutParams(layoutParams);
|
|
||||||
|
|
||||||
typeTextView = new TextView(context);
|
|
||||||
typeTextView.setBackgroundColor(0xff757575);
|
|
||||||
typeTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
|
|
||||||
typeTextView.setGravity(Gravity.CENTER);
|
|
||||||
typeTextView.setSingleLine(true);
|
|
||||||
typeTextView.setTextColor(0xffd1d1d1);
|
|
||||||
typeTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
|
||||||
typeTextView.setTypeface(Typeface.DEFAULT_BOLD);
|
|
||||||
addView(typeTextView);
|
|
||||||
layoutParams = (LayoutParams) typeTextView.getLayoutParams();
|
|
||||||
layoutParams.width = AndroidUtilities.dp(40);
|
|
||||||
layoutParams.height = AndroidUtilities.dp(40);
|
|
||||||
layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 16);
|
|
||||||
layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 0);
|
|
||||||
layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL;
|
|
||||||
typeTextView.setLayoutParams(layoutParams);
|
|
||||||
|
|
||||||
imageView = new BackupImageView(context);
|
|
||||||
addView(imageView);
|
|
||||||
layoutParams = (LayoutParams) imageView.getLayoutParams();
|
|
||||||
layoutParams.width = AndroidUtilities.dp(40);
|
|
||||||
layoutParams.height = AndroidUtilities.dp(40);
|
|
||||||
layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 0 : 16);
|
|
||||||
layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 16 : 0);
|
|
||||||
layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL;
|
|
||||||
imageView.setLayoutParams(layoutParams);
|
|
||||||
|
|
||||||
checkBox = new CheckBox(context, R.drawable.round_check2);
|
|
||||||
checkBox.setVisibility(GONE);
|
|
||||||
addView(checkBox);
|
|
||||||
layoutParams = (LayoutParams) checkBox.getLayoutParams();
|
|
||||||
layoutParams.width = AndroidUtilities.dp(22);
|
|
||||||
layoutParams.height = AndroidUtilities.dp(22);
|
|
||||||
layoutParams.topMargin = AndroidUtilities.dp(34);
|
|
||||||
layoutParams.leftMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(38);
|
|
||||||
layoutParams.rightMargin = LocaleController.isRTL ? AndroidUtilities.dp(38) : 0;
|
|
||||||
layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT);
|
|
||||||
checkBox.setLayoutParams(layoutParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
||||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64), MeasureSpec.EXACTLY));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTextAndValueAndTypeAndThumb(String text, String value, String type, String thumb, int resId) {
|
|
||||||
textView.setText(text);
|
|
||||||
valueTextView.setText(value);
|
|
||||||
if (type != null) {
|
|
||||||
typeTextView.setVisibility(VISIBLE);
|
|
||||||
typeTextView.setText(type);
|
|
||||||
} else {
|
|
||||||
typeTextView.setVisibility(GONE);
|
|
||||||
}
|
|
||||||
if (thumb != null || resId != 0) {
|
|
||||||
if (thumb != null) {
|
|
||||||
imageView.setImage(thumb, "40_40", null);
|
|
||||||
} else {
|
|
||||||
imageView.setImageResource(resId);
|
|
||||||
}
|
|
||||||
imageView.setVisibility(VISIBLE);
|
|
||||||
} else {
|
|
||||||
imageView.setVisibility(GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setChecked(boolean checked, boolean animated) {
|
|
||||||
if (checkBox.getVisibility() != VISIBLE) {
|
|
||||||
checkBox.setVisibility(VISIBLE);
|
|
||||||
}
|
|
||||||
checkBox.setChecked(checked, animated);
|
|
||||||
}
|
|
||||||
}
|
|
@ -134,6 +134,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
private RecyclerListView stickersListView;
|
private RecyclerListView stickersListView;
|
||||||
private StickersAdapter stickersAdapter;
|
private StickersAdapter stickersAdapter;
|
||||||
private View stickersPanel;
|
private View stickersPanel;
|
||||||
|
private TextView muteItem;
|
||||||
|
|
||||||
private boolean allowStickersPanel;
|
private boolean allowStickersPanel;
|
||||||
private AnimatorSetProxy runningAnimation;
|
private AnimatorSetProxy runningAnimation;
|
||||||
@ -213,6 +214,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
private final static int clear_history = 11;
|
private final static int clear_history = 11;
|
||||||
private final static int delete_chat = 12;
|
private final static int delete_chat = 12;
|
||||||
private final static int share_contact = 13;
|
private final static int share_contact = 13;
|
||||||
|
private final static int mute = 14;
|
||||||
|
|
||||||
AdapterView.OnItemLongClickListener onItemLongClickListener = new AdapterView.OnItemLongClickListener() {
|
AdapterView.OnItemLongClickListener onItemLongClickListener = new AdapterView.OnItemLongClickListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -446,6 +448,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioDidStarted);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioDidStarted);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateMessageMedia);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateMessageMedia);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.replaceMessagesObjects);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.replaceMessagesObjects);
|
||||||
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.notificationsSettingsUpdated);
|
||||||
|
|
||||||
super.onFragmentCreate();
|
super.onFragmentCreate();
|
||||||
|
|
||||||
@ -505,6 +508,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidStarted);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidStarted);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateMessageMedia);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateMessageMedia);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.replaceMessagesObjects);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.replaceMessagesObjects);
|
||||||
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.notificationsSettingsUpdated);
|
||||||
if (AndroidUtilities.isTablet()) {
|
if (AndroidUtilities.isTablet()) {
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, true);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, true);
|
||||||
}
|
}
|
||||||
@ -770,6 +774,58 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||||
showAlertDialog(builder);
|
showAlertDialog(builder);
|
||||||
}
|
}
|
||||||
|
} else if (id == mute) {
|
||||||
|
boolean muted = MessagesController.getInstance().isDialogMuted(dialog_id);
|
||||||
|
if (!muted) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||||
|
builder.setTitle(LocaleController.getString("Notifications", R.string.Notifications));
|
||||||
|
CharSequence[] items = new CharSequence[]{
|
||||||
|
LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 1)),
|
||||||
|
LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 8)),
|
||||||
|
LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Days", 2))
|
||||||
|
};
|
||||||
|
builder.setItems(items, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
int untilTime = ConnectionsManager.getInstance().getCurrentTime();
|
||||||
|
if (i == 0) {
|
||||||
|
untilTime += 60 * 60;
|
||||||
|
} else if (i == 1) {
|
||||||
|
untilTime += 60 * 60 * 8;
|
||||||
|
} else if (i == 2) {
|
||||||
|
untilTime += 60 * 60 * 48;
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
|
SharedPreferences.Editor editor = preferences.edit();
|
||||||
|
editor.putInt("notify2_" + dialog_id, 3);
|
||||||
|
editor.putInt("notifyuntil_" + dialog_id, untilTime);
|
||||||
|
long flags = ((long)untilTime << 32) | 1;
|
||||||
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, flags);
|
||||||
|
editor.commit();
|
||||||
|
TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.notify_settings = new TLRPC.TL_peerNotifySettings();
|
||||||
|
dialog.notify_settings.mute_until = untilTime;
|
||||||
|
}
|
||||||
|
NotificationsController.updateServerNotificationsSettings(dialog_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||||
|
showAlertDialog(builder);
|
||||||
|
} else {
|
||||||
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
|
SharedPreferences.Editor editor = preferences.edit();
|
||||||
|
editor.putInt("notify2_" + dialog_id, 0);
|
||||||
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, 0);
|
||||||
|
editor.commit();
|
||||||
|
TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.notify_settings = new TLRPC.TL_peerNotifySettings();
|
||||||
|
}
|
||||||
|
NotificationsController.updateServerNotificationsSettings(dialog_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -861,6 +917,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
nameTextView.setSingleLine(true);
|
nameTextView.setSingleLine(true);
|
||||||
nameTextView.setEllipsize(TextUtils.TruncateAt.END);
|
nameTextView.setEllipsize(TextUtils.TruncateAt.END);
|
||||||
nameTextView.setGravity(Gravity.LEFT);
|
nameTextView.setGravity(Gravity.LEFT);
|
||||||
|
nameTextView.setCompoundDrawablePadding(AndroidUtilities.dp(4));
|
||||||
nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
avatarContainer.addView(nameTextView);
|
avatarContainer.addView(nameTextView);
|
||||||
layoutParams2 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams();
|
layoutParams2 = (FrameLayout.LayoutParams) nameTextView.getLayoutParams();
|
||||||
@ -888,14 +945,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
layoutParams2.gravity = Gravity.BOTTOM;
|
layoutParams2.gravity = Gravity.BOTTOM;
|
||||||
onlineTextView.setLayoutParams(layoutParams2);
|
onlineTextView.setLayoutParams(layoutParams2);
|
||||||
|
|
||||||
updateTitle();
|
|
||||||
updateSubtitle();
|
|
||||||
|
|
||||||
if (currentEncryptedChat != null) {
|
|
||||||
nameTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_header, 0, 0, 0);
|
|
||||||
nameTextView.setCompoundDrawablePadding(AndroidUtilities.dp(4));
|
|
||||||
}
|
|
||||||
|
|
||||||
ActionBarMenu menu = actionBar.createMenu();
|
ActionBarMenu menu = actionBar.createMenu();
|
||||||
|
|
||||||
headerItem = menu.addItem(0, R.drawable.ic_ab_other);
|
headerItem = menu.addItem(0, R.drawable.ic_ab_other);
|
||||||
@ -911,11 +960,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
} else {
|
} else {
|
||||||
headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteChatUser", R.string.DeleteChatUser), 0);
|
headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteChatUser", R.string.DeleteChatUser), 0);
|
||||||
}
|
}
|
||||||
|
muteItem = headerItem.addSubItem(mute, null, 0);
|
||||||
|
|
||||||
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) headerItem.getLayoutParams();
|
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) headerItem.getLayoutParams();
|
||||||
layoutParams.rightMargin = AndroidUtilities.dp(-48);
|
layoutParams.rightMargin = AndroidUtilities.dp(-48);
|
||||||
headerItem.setLayoutParams(layoutParams);
|
headerItem.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
updateTitle();
|
||||||
|
updateSubtitle();
|
||||||
|
updateTitleIcons();
|
||||||
|
|
||||||
attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other);
|
attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other);
|
||||||
attachItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo);
|
attachItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo);
|
||||||
attachItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery);
|
attachItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery);
|
||||||
@ -1731,12 +1785,34 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
if (currentUser.phone != null && currentUser.phone.length() != 0) {
|
if (currentUser.phone != null && currentUser.phone.length() != 0) {
|
||||||
nameTextView.setText(PhoneFormat.getInstance().format("+" + currentUser.phone));
|
nameTextView.setText(PhoneFormat.getInstance().format("+" + currentUser.phone));
|
||||||
} else {
|
} else {
|
||||||
nameTextView.setText(ContactsController.formatName(currentUser.first_name, currentUser.last_name));
|
if (currentUser instanceof TLRPC.TL_userDeleted) {
|
||||||
|
nameTextView.setText(LocaleController.getString("HiddenName", R.string.HiddenName));
|
||||||
|
} else {
|
||||||
|
nameTextView.setText(ContactsController.formatName(currentUser.first_name, currentUser.last_name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nameTextView.setText(ContactsController.formatName(currentUser.first_name, currentUser.last_name));
|
nameTextView.setText(ContactsController.formatName(currentUser.first_name, currentUser.last_name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
|
||||||
|
if (dialog != null && dialog.notify_settings != null) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
nameTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.mute_blue, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateTitleIcons() {
|
||||||
|
int leftIcon = currentEncryptedChat != null ? R.drawable.ic_lock_header : 0;
|
||||||
|
int rightIcon = MessagesController.getInstance().isDialogMuted(dialog_id) ? R.drawable.mute_fixed : 0;
|
||||||
|
nameTextView.setCompoundDrawablesWithIntrinsicBounds(leftIcon, 0, rightIcon, 0);
|
||||||
|
|
||||||
|
if (rightIcon != 0) {
|
||||||
|
muteItem.setText(LocaleController.getString("UnmuteNotifications", R.string.UnmuteNotifications));
|
||||||
|
} else {
|
||||||
|
muteItem.setText(LocaleController.getString("MuteNotifications", R.string.MuteNotifications));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateSubtitle() {
|
private void updateSubtitle() {
|
||||||
@ -2076,7 +2152,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
TLRPC.Message dateMsg = new TLRPC.Message();
|
TLRPC.Message dateMsg = new TLRPC.Message();
|
||||||
dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date);
|
dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date);
|
||||||
dateMsg.id = 0;
|
dateMsg.id = 0;
|
||||||
MessageObject dateObj = new MessageObject(dateMsg, null);
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
||||||
dateObj.type = 10;
|
dateObj.type = 10;
|
||||||
dateObj.contentType = 4;
|
dateObj.contentType = 4;
|
||||||
if (load_type == 1) {
|
if (load_type == 1) {
|
||||||
@ -2099,7 +2175,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
TLRPC.Message dateMsg = new TLRPC.Message();
|
TLRPC.Message dateMsg = new TLRPC.Message();
|
||||||
dateMsg.message = "";
|
dateMsg.message = "";
|
||||||
dateMsg.id = 0;
|
dateMsg.id = 0;
|
||||||
MessageObject dateObj = new MessageObject(dateMsg, null);
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
||||||
dateObj.contentType = dateObj.type = 6;
|
dateObj.contentType = dateObj.type = 6;
|
||||||
boolean dateAdded = true;
|
boolean dateAdded = true;
|
||||||
if (a != messArr.size() - 1) {
|
if (a != messArr.size() - 1) {
|
||||||
@ -2395,7 +2471,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
TLRPC.Message dateMsg = new TLRPC.Message();
|
TLRPC.Message dateMsg = new TLRPC.Message();
|
||||||
dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date);
|
dateMsg.message = LocaleController.formatDateChat(obj.messageOwner.date);
|
||||||
dateMsg.id = 0;
|
dateMsg.id = 0;
|
||||||
MessageObject dateObj = new MessageObject(dateMsg, null);
|
MessageObject dateObj = new MessageObject(dateMsg, null, false);
|
||||||
dateObj.type = 10;
|
dateObj.type = 10;
|
||||||
dateObj.contentType = 4;
|
dateObj.contentType = 4;
|
||||||
messages.add(0, dateObj);
|
messages.add(0, dateObj);
|
||||||
@ -2534,7 +2610,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
TLRPC.Message newMsgObj = (TLRPC.Message)args[2];
|
TLRPC.Message newMsgObj = (TLRPC.Message)args[2];
|
||||||
if (newMsgObj != null) {
|
if (newMsgObj != null) {
|
||||||
obj.messageOwner.media = newMsgObj.media;
|
obj.messageOwner.media = newMsgObj.media;
|
||||||
obj.generateThumbs(true, 1);
|
obj.generateThumbs(true);
|
||||||
}
|
}
|
||||||
messagesDict.remove(msgId);
|
messagesDict.remove(msgId);
|
||||||
messagesDict.put(newMsgId, obj);
|
messagesDict.put(newMsgId, obj);
|
||||||
@ -2691,7 +2767,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
if (existMessageObject != null) {
|
if (existMessageObject != null) {
|
||||||
existMessageObject.messageOwner.media = messageObject.messageOwner.media;
|
existMessageObject.messageOwner.media = messageObject.messageOwner.media;
|
||||||
existMessageObject.messageOwner.attachPath = messageObject.messageOwner.attachPath;
|
existMessageObject.messageOwner.attachPath = messageObject.messageOwner.attachPath;
|
||||||
existMessageObject.generateThumbs(false, 1);
|
existMessageObject.generateThumbs(false);
|
||||||
}
|
}
|
||||||
updateVisibleRows();
|
updateVisibleRows();
|
||||||
} else if (id == NotificationCenter.replaceMessagesObjects) {
|
} else if (id == NotificationCenter.replaceMessagesObjects) {
|
||||||
@ -2713,6 +2789,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
chatAdapter.notifyDataSetChanged();
|
chatAdapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (id == NotificationCenter.notificationsSettingsUpdated) {
|
||||||
|
updateTitleIcons();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2746,8 +2824,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
if (currentChat != null && (currentChat instanceof TLRPC.TL_chatForbidden || currentChat.left) ||
|
if (currentChat != null && (currentChat instanceof TLRPC.TL_chatForbidden || currentChat.left) ||
|
||||||
currentUser != null && (currentUser instanceof TLRPC.TL_userDeleted || currentUser instanceof TLRPC.TL_userEmpty || userBlocked)) {
|
currentUser != null && (currentUser instanceof TLRPC.TL_userDeleted || currentUser instanceof TLRPC.TL_userEmpty || userBlocked)) {
|
||||||
bottomOverlayChat.setVisibility(View.VISIBLE);
|
bottomOverlayChat.setVisibility(View.VISIBLE);
|
||||||
|
muteItem.setVisibility(View.GONE);
|
||||||
chatActivityEnterView.setFieldFocused(false);
|
chatActivityEnterView.setFieldFocused(false);
|
||||||
} else {
|
} else {
|
||||||
|
muteItem.setVisibility(View.VISIBLE);
|
||||||
bottomOverlayChat.setVisibility(View.GONE);
|
bottomOverlayChat.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2925,6 +3005,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
} else {
|
} else {
|
||||||
selectedMessagesCountTextView.setTextSize(20);
|
selectedMessagesCountTextView.setTextSize(20);
|
||||||
}
|
}
|
||||||
|
if (AndroidUtilities.isTablet()) {
|
||||||
|
if (AndroidUtilities.isSmallTablet() && getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||||
|
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
|
||||||
|
} else {
|
||||||
|
actionBar.setBackButtonImage(R.drawable.ic_close_white);
|
||||||
|
}
|
||||||
|
}
|
||||||
int padding = (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2;
|
int padding = (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2;
|
||||||
avatarContainer.setPadding(avatarContainer.getPaddingLeft(), padding, avatarContainer.getPaddingRight(), padding);
|
avatarContainer.setPadding(avatarContainer.getPaddingLeft(), padding, avatarContainer.getPaddingRight(), padding);
|
||||||
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)avatarContainer.getLayoutParams();
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)avatarContainer.getLayoutParams();
|
||||||
@ -3007,10 +3094,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
} else if (type == 3) {
|
} else if (type == 3) {
|
||||||
items = new CharSequence[]{LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Delete", R.string.Delete)};
|
items = new CharSequence[]{LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Delete", R.string.Delete)};
|
||||||
} else if (type == 4) {
|
} else if (type == 4) {
|
||||||
items = new CharSequence[]{LocaleController.getString(selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? "SaveToDownloads" : "SaveToGallery",
|
items = new CharSequence[]{LocaleController.getString(selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? "ShareFile" : "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)};
|
selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? R.string.ShareFile : R.string.SaveToGallery), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)};
|
||||||
} else if (type == 5) {
|
} 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)};
|
items = new CharSequence[]{LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (type == 2) {
|
if (type == 2) {
|
||||||
@ -3018,8 +3105,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
} else if (type == 3) {
|
} else if (type == 3) {
|
||||||
items = new CharSequence[]{LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Delete", R.string.Delete)};
|
items = new CharSequence[]{LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Delete", R.string.Delete)};
|
||||||
} else if (type == 4) {
|
} else if (type == 4) {
|
||||||
items = new CharSequence[]{LocaleController.getString(selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? "SaveToDownloads" : "SaveToGallery",
|
items = new CharSequence[]{LocaleController.getString(selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? "ShareFile" : "SaveToGallery",
|
||||||
selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? R.string.SaveToDownloads : R.string.SaveToGallery), LocaleController.getString("Delete", R.string.Delete)};
|
selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? R.string.ShareFile : R.string.SaveToGallery), LocaleController.getString("Delete", R.string.Delete)};
|
||||||
} else if (type == 5) {
|
} else if (type == 5) {
|
||||||
items = new CharSequence[]{LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile), LocaleController.getString("Delete", R.string.Delete)};
|
items = new CharSequence[]{LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile), LocaleController.getString("Delete", R.string.Delete)};
|
||||||
}
|
}
|
||||||
@ -3206,7 +3293,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||||||
} else if (selectedObject.type == 1) {
|
} else if (selectedObject.type == 1) {
|
||||||
MediaController.saveFile(path, getParentActivity(), 0, null);
|
MediaController.saveFile(path, getParentActivity(), 0, null);
|
||||||
} else if (selectedObject.type == 8 || selectedObject.type == 9) {
|
} else if (selectedObject.type == 8 || selectedObject.type == 9) {
|
||||||
MediaController.saveFile(path, getParentActivity(), 2, selectedObject.getDocumentName());
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
|
intent.setType(selectedObject.messageOwner.media.document.mime_type);
|
||||||
|
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path)));
|
||||||
|
getParentActivity().startActivity(Intent.createChooser(intent, ""));
|
||||||
}
|
}
|
||||||
} else if (option == 5) {
|
} else if (option == 5) {
|
||||||
File locFile = null;
|
File locFile = null;
|
||||||
|
@ -32,11 +32,11 @@ public class AvatarDrawable extends Drawable {
|
|||||||
private static TextPaint namePaint;
|
private static TextPaint namePaint;
|
||||||
private static int[] arrColors = {0xffe56555, 0xfff28c48, 0xffeec764, 0xff76c84d, 0xff5fbed5, 0xff549cdd, 0xff8e85ee, 0xfff2749a};
|
private static int[] arrColors = {0xffe56555, 0xfff28c48, 0xffeec764, 0xff76c84d, 0xff5fbed5, 0xff549cdd, 0xff8e85ee, 0xfff2749a};
|
||||||
private static int[] arrColorsProfiles = {0xffd86f65, 0xfff69d61, 0xfffabb3c, 0xff67b35d, 0xff56a2bb, 0xff5c98cd, 0xff8c79d2, 0xfff37fa6};
|
private static int[] arrColorsProfiles = {0xffd86f65, 0xfff69d61, 0xfffabb3c, 0xff67b35d, 0xff56a2bb, 0xff5c98cd, 0xff8c79d2, 0xfff37fa6};
|
||||||
private static int[] arrColorsProfilesBack = {0xffca6056, 0xfff18944, 0xfff2b02c, 0xff56a14c, 0xff4492ac, 0xff4c84b6, 0xff7d6ac4, 0xffe66b94};
|
private static int[] arrColorsProfilesBack = {0xffca6056, 0xfff18944, 0xff7d6ac4, 0xff56a14c, 0xff4492ac, 0xff4c84b6, 0xff7d6ac4, 0xff4c84b6};
|
||||||
private static int[] arrColorsProfilesText = {0xfff9cbc5, 0xfffdddc8, 0xfffce5bb, 0xffc0edba, 0xffb8e2f0, 0xffb3d7f7, 0xffcdc4ed, 0xfffed1e0};
|
private static int[] arrColorsProfilesText = {0xfff9cbc5, 0xfffdddc8, 0xffcdc4ed, 0xffc0edba, 0xffb8e2f0, 0xffb3d7f7, 0xffcdc4ed, 0xffb3d7f7};
|
||||||
private static int[] arrColorsNames = {0xffca5650, 0xffd87b29, 0xffc7a21c, 0xff50b232, 0xff42b1a8, 0xff4e92cc, 0xff4e92cc, 0xffdb5b9d};
|
private static int[] arrColorsNames = {0xffca5650, 0xffd87b29, 0xff4e92cc, 0xff50b232, 0xff42b1a8, 0xff4e92cc, 0xff4e92cc, 0xff4e92cc};
|
||||||
private static int[] arrColorsButtons = {R.drawable.bar_selector_red, R.drawable.bar_selector_orange, R.drawable.bar_selector_yellow,
|
private static int[] arrColorsButtons = {R.drawable.bar_selector_red, R.drawable.bar_selector_orange, R.drawable.bar_selector_violet,
|
||||||
R.drawable.bar_selector_green, R.drawable.bar_selector_cyan, R.drawable.bar_selector_blue, R.drawable.bar_selector_violet, R.drawable.bar_selector_pink};
|
R.drawable.bar_selector_green, R.drawable.bar_selector_cyan, R.drawable.bar_selector_blue, R.drawable.bar_selector_violet, R.drawable.bar_selector_blue};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ import org.telegram.ui.ActionBar.BaseFragment;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
public class AvatarUpdater implements NotificationCenter.NotificationCenterDelegate, PhotoCropActivity.PhotoCropActivityDelegate {
|
public class AvatarUpdater implements NotificationCenter.NotificationCenterDelegate, PhotoCropActivity.PhotoEditActivityDelegate {
|
||||||
public String currentPicturePath;
|
public String currentPicturePath;
|
||||||
private TLRPC.PhotoSize smallPhoto;
|
private TLRPC.PhotoSize smallPhoto;
|
||||||
private TLRPC.PhotoSize bigPhoto;
|
private TLRPC.PhotoSize bigPhoto;
|
||||||
@ -94,7 +94,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
|
|||||||
activity.presentFragment(photoCropActivity);
|
activity.presentFragment(photoCropActivity);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(path, uri, 800, 800);
|
Bitmap bitmap = ImageLoader.loadBitmap(path, uri, 800, 800, true);
|
||||||
processBitmap(bitmap);
|
processBitmap(bitmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void didFinishCrop(Bitmap bitmap) {
|
public void didFinishEdit(Bitmap bitmap, Bundle args) {
|
||||||
processBitmap(bitmap);
|
processBitmap(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ import android.view.View;
|
|||||||
|
|
||||||
import org.telegram.android.ImageReceiver;
|
import org.telegram.android.ImageReceiver;
|
||||||
import org.telegram.messenger.TLObject;
|
import org.telegram.messenger.TLObject;
|
||||||
|
import org.telegram.messenger.TLRPC;
|
||||||
|
|
||||||
|
|
||||||
public class BackupImageView extends View {
|
public class BackupImageView extends View {
|
||||||
@ -43,34 +44,35 @@ public class BackupImageView extends View {
|
|||||||
imageReceiver = new ImageReceiver(this);
|
imageReceiver = new ImageReceiver(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String filter, Drawable placeholder) {
|
public void setImage(TLObject path, String filter, Drawable thumb) {
|
||||||
setImage(path, null, filter, placeholder, null, 0);
|
setImage(path, null, filter, thumb, null, null, null, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String filter, Bitmap placeholderBitmap) {
|
public void setImage(TLObject path, String filter, Bitmap thumb) {
|
||||||
setImage(path, null, filter, null, placeholderBitmap, 0);
|
setImage(path, null, filter, null, thumb, null, null, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String filter, Drawable placeholder, int size) {
|
public void setImage(TLObject path, String filter, Drawable thumb, int size) {
|
||||||
setImage(path, null, filter, placeholder, null, size);
|
setImage(path, null, filter, thumb, null, null, null, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String filter, Bitmap placeholderBitmap, int size) {
|
public void setImage(TLObject path, String filter, Bitmap thumb, int size) {
|
||||||
setImage(path, null, filter, null, placeholderBitmap, size);
|
setImage(path, null, filter, null, thumb, null, null, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(String path, String filter, Drawable placeholder) {
|
public void setImage(TLObject path, String filter, TLRPC.FileLocation thumb, int size) {
|
||||||
setImage(null, path, filter, placeholder, null, 0);
|
setImage(path, null, filter, null, null, thumb, null, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(TLObject path, String httpUrl, String filter, Drawable placeholder, Bitmap placeholderBitmap, int size) {
|
public void setImage(String path, String filter, Drawable thumb) {
|
||||||
Drawable placeholderDrawable = null;
|
setImage(null, path, filter, thumb, null, null, null, 0);
|
||||||
if (placeholderBitmap != null) {
|
}
|
||||||
placeholderDrawable = new BitmapDrawable(null, placeholderBitmap);
|
|
||||||
} else if (placeholder != null) {
|
public void setImage(TLObject path, String httpUrl, String filter, Drawable thumb, Bitmap thumbBitmap, TLRPC.FileLocation thumbLocation, String thumbFilter, int size) {
|
||||||
placeholderDrawable = placeholder;
|
if (thumbBitmap != null) {
|
||||||
|
thumb = new BitmapDrawable(null, thumbBitmap);
|
||||||
}
|
}
|
||||||
imageReceiver.setImage(path, httpUrl, filter, placeholderDrawable, null, size, false);
|
imageReceiver.setImage(path, httpUrl, filter, thumb, thumbLocation, thumbFilter, size, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImageBitmap(Bitmap bitmap) {
|
public void setImageBitmap(Bitmap bitmap) {
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* This is the source code of Telegram for Android v. 2.0.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.Components;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.animation.DecelerateInterpolator;
|
||||||
|
|
||||||
|
import org.telegram.android.AndroidUtilities;
|
||||||
|
|
||||||
|
public class LineProgressView extends View {
|
||||||
|
|
||||||
|
private long lastUpdateTime = 0;
|
||||||
|
private float currentProgress = 0;
|
||||||
|
private float animationProgressStart = 0;
|
||||||
|
private long currentProgressTime = 0;
|
||||||
|
private float animatedProgressValue = 0;
|
||||||
|
private float animatedAlphaValue = 1.0f;
|
||||||
|
|
||||||
|
private static DecelerateInterpolator decelerateInterpolator = null;
|
||||||
|
private static Paint progressPaint = null;
|
||||||
|
|
||||||
|
public LineProgressView(Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
if (decelerateInterpolator == null) {
|
||||||
|
decelerateInterpolator = new DecelerateInterpolator();
|
||||||
|
progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
progressPaint.setStyle(Paint.Style.STROKE);
|
||||||
|
progressPaint.setStrokeCap(Paint.Cap.ROUND);
|
||||||
|
progressPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
||||||
|
progressPaint.setColor(0xff36a2ee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAnimation() {
|
||||||
|
long newTime = System.currentTimeMillis();
|
||||||
|
long dt = newTime - lastUpdateTime;
|
||||||
|
lastUpdateTime = newTime;
|
||||||
|
|
||||||
|
if (animatedProgressValue != 1 && animatedProgressValue != currentProgress) {
|
||||||
|
float progressDiff = currentProgress - animationProgressStart;
|
||||||
|
if (progressDiff > 0) {
|
||||||
|
currentProgressTime += dt;
|
||||||
|
if (currentProgressTime >= 300) {
|
||||||
|
animatedProgressValue = currentProgress;
|
||||||
|
animationProgressStart = currentProgress;
|
||||||
|
currentProgressTime = 0;
|
||||||
|
} else {
|
||||||
|
animatedProgressValue = animationProgressStart + progressDiff * decelerateInterpolator.getInterpolation(currentProgressTime / 300.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
if (animatedProgressValue >= 1 && animatedProgressValue == 1 && animatedAlphaValue != 0) {
|
||||||
|
animatedAlphaValue -= dt / 200.0f;
|
||||||
|
if (animatedAlphaValue <= 0) {
|
||||||
|
animatedAlphaValue = 0.0f;
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProgressColor(int color) {
|
||||||
|
progressPaint.setColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProgress(float value, boolean animated) {
|
||||||
|
if (!animated) {
|
||||||
|
animatedProgressValue = value;
|
||||||
|
animationProgressStart = value;
|
||||||
|
} else {
|
||||||
|
animationProgressStart = animatedProgressValue;
|
||||||
|
}
|
||||||
|
if (value != 1) {
|
||||||
|
animatedAlphaValue = 1;
|
||||||
|
}
|
||||||
|
currentProgress = value;
|
||||||
|
currentProgressTime = 0;
|
||||||
|
|
||||||
|
lastUpdateTime = System.currentTimeMillis();
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDraw(Canvas canvas) {
|
||||||
|
progressPaint.setAlpha((int)(255 * animatedAlphaValue));
|
||||||
|
canvas.drawRect(0, 0, getWidth() * animatedProgressValue, getHeight(), progressPaint);
|
||||||
|
updateAnimation();
|
||||||
|
}
|
||||||
|
}
|
@ -289,7 +289,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
|
|||||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
intent.setType("text/plain");
|
intent.setType("text/plain");
|
||||||
intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText());
|
intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText());
|
||||||
getParentActivity().startActivity(intent);
|
getParentActivity().startActivity(Intent.createChooser(intent, ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
|
@ -36,11 +36,10 @@ import org.telegram.messenger.Utilities;
|
|||||||
import org.telegram.ui.Adapters.BaseFragmentAdapter;
|
import org.telegram.ui.Adapters.BaseFragmentAdapter;
|
||||||
import org.telegram.ui.ActionBar.ActionBar;
|
import org.telegram.ui.ActionBar.ActionBar;
|
||||||
import org.telegram.ui.ActionBar.ActionBarMenu;
|
import org.telegram.ui.ActionBar.ActionBarMenu;
|
||||||
import org.telegram.ui.ActionBar.ActionBarMenuItem;
|
|
||||||
import org.telegram.ui.AnimationCompat.AnimatorSetProxy;
|
import org.telegram.ui.AnimationCompat.AnimatorSetProxy;
|
||||||
import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy;
|
import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy;
|
||||||
import org.telegram.ui.Cells.TextDetailDocumentsCell;
|
|
||||||
import org.telegram.ui.ActionBar.BaseFragment;
|
import org.telegram.ui.ActionBar.BaseFragment;
|
||||||
|
import org.telegram.ui.Cells.SharedDocumentCell;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -63,13 +62,13 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
private TextView emptyView;
|
private TextView emptyView;
|
||||||
|
|
||||||
private File currentDir;
|
private File currentDir;
|
||||||
private ArrayList<ListItem> items = new ArrayList<ListItem>();
|
private ArrayList<ListItem> items = new ArrayList<>();
|
||||||
private boolean receiverRegistered = false;
|
private boolean receiverRegistered = false;
|
||||||
private ArrayList<HistoryEntry> history = new ArrayList<HistoryEntry>();
|
private ArrayList<HistoryEntry> history = new ArrayList<>();
|
||||||
private long sizeLimit = 1024 * 1024 * 1024;
|
private long sizeLimit = 1024 * 1024 * 1024;
|
||||||
private DocumentSelectActivityDelegate delegate;
|
private DocumentSelectActivityDelegate delegate;
|
||||||
private HashMap<String, ListItem> selectedFiles = new HashMap<String, ListItem>();
|
private HashMap<String, ListItem> selectedFiles = new HashMap<>();
|
||||||
private ArrayList<View> actionModeViews = new ArrayList<View>();
|
private ArrayList<View> actionModeViews = new ArrayList<>();
|
||||||
private boolean scrolling;
|
private boolean scrolling;
|
||||||
|
|
||||||
private final static int done = 3;
|
private final static int done = 3;
|
||||||
@ -152,27 +151,19 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
public void onItemClick(int id) {
|
public void onItemClick(int id) {
|
||||||
if (id == -1) {
|
if (id == -1) {
|
||||||
finishFragment();
|
finishFragment();
|
||||||
} else if (id == 1) {
|
|
||||||
if (delegate != null) {
|
|
||||||
delegate.startDocumentSelectActivity();
|
|
||||||
}
|
|
||||||
finishFragment(false);
|
|
||||||
} else if (id == -2) {
|
} else if (id == -2) {
|
||||||
selectedFiles.clear();
|
selectedFiles.clear();
|
||||||
actionBar.hideActionMode();
|
actionBar.hideActionMode();
|
||||||
listView.invalidateViews();
|
listView.invalidateViews();
|
||||||
} else if (id == done) {
|
} else if (id == done) {
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
ArrayList<String> files = new ArrayList<String>();
|
ArrayList<String> files = new ArrayList<>();
|
||||||
files.addAll(selectedFiles.keySet());
|
files.addAll(selectedFiles.keySet());
|
||||||
delegate.didSelectFiles(DocumentSelectActivity.this, files);
|
delegate.didSelectFiles(DocumentSelectActivity.this, files);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ActionBarMenu menu = actionBar.createMenu();
|
|
||||||
final ActionBarMenuItem item = menu.addItem(1, R.drawable.ic_ab_other);
|
|
||||||
|
|
||||||
selectedFiles.clear();
|
selectedFiles.clear();
|
||||||
actionModeViews.clear();
|
actionModeViews.clear();
|
||||||
|
|
||||||
@ -254,7 +245,7 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size()));
|
selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size()));
|
||||||
if (Build.VERSION.SDK_INT >= 11) {
|
if (Build.VERSION.SDK_INT >= 11) {
|
||||||
AnimatorSetProxy animatorSet = new AnimatorSetProxy();
|
AnimatorSetProxy animatorSet = new AnimatorSetProxy();
|
||||||
ArrayList<Object> animators = new ArrayList<Object>();
|
ArrayList<Object> animators = new ArrayList<>();
|
||||||
for (int a = 0; a < actionModeViews.size(); a++) {
|
for (int a = 0; a < actionModeViews.size(); a++) {
|
||||||
View view2 = actionModeViews.get(a);
|
View view2 = actionModeViews.get(a);
|
||||||
AndroidUtilities.clearDrawableAnimation(view2);
|
AndroidUtilities.clearDrawableAnimation(view2);
|
||||||
@ -269,8 +260,8 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
animatorSet.start();
|
animatorSet.start();
|
||||||
}
|
}
|
||||||
scrolling = false;
|
scrolling = false;
|
||||||
if (view instanceof TextDetailDocumentsCell) {
|
if (view instanceof SharedDocumentCell) {
|
||||||
((TextDetailDocumentsCell) view).setChecked(true, true);
|
((SharedDocumentCell) view).setChecked(true, true);
|
||||||
}
|
}
|
||||||
actionBar.showActionMode();
|
actionBar.showActionMode();
|
||||||
}
|
}
|
||||||
@ -287,24 +278,32 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
ListItem item = items.get(i);
|
ListItem item = items.get(i);
|
||||||
File file = item.file;
|
File file = item.file;
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
HistoryEntry he = history.remove(history.size() - 1);
|
if (item.icon == R.drawable.ic_storage_gallery) {
|
||||||
actionBar.setTitle(he.title);
|
if (delegate != null) {
|
||||||
if (he.dir != null) {
|
delegate.startDocumentSelectActivity();
|
||||||
listFiles(he.dir);
|
}
|
||||||
|
finishFragment(false);
|
||||||
} else {
|
} else {
|
||||||
listRoots();
|
HistoryEntry he = history.remove(history.size() - 1);
|
||||||
|
actionBar.setTitle(he.title);
|
||||||
|
if (he.dir != null) {
|
||||||
|
listFiles(he.dir);
|
||||||
|
} else {
|
||||||
|
listRoots();
|
||||||
|
}
|
||||||
|
listView.setSelectionFromTop(he.scrollItem, he.scrollOffset);
|
||||||
}
|
}
|
||||||
listView.setSelectionFromTop(he.scrollItem, he.scrollOffset);
|
|
||||||
} else if (file.isDirectory()) {
|
} else if (file.isDirectory()) {
|
||||||
HistoryEntry he = new HistoryEntry();
|
HistoryEntry he = new HistoryEntry();
|
||||||
he.scrollItem = listView.getFirstVisiblePosition();
|
he.scrollItem = listView.getFirstVisiblePosition();
|
||||||
he.scrollOffset = listView.getChildAt(0).getTop();
|
he.scrollOffset = listView.getChildAt(0).getTop();
|
||||||
he.dir = currentDir;
|
he.dir = currentDir;
|
||||||
he.title = actionBar.getTitle().toString();
|
he.title = actionBar.getTitle().toString();
|
||||||
|
history.add(he);
|
||||||
if (!listFiles(file)) {
|
if (!listFiles(file)) {
|
||||||
|
history.remove(he);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
history.add(he);
|
|
||||||
actionBar.setTitle(item.title);
|
actionBar.setTitle(item.title);
|
||||||
listView.setSelection(0);
|
listView.setSelection(0);
|
||||||
} else {
|
} else {
|
||||||
@ -333,12 +332,12 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size()));
|
selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size()));
|
||||||
}
|
}
|
||||||
scrolling = false;
|
scrolling = false;
|
||||||
if (view instanceof TextDetailDocumentsCell) {
|
if (view instanceof SharedDocumentCell) {
|
||||||
((TextDetailDocumentsCell) view).setChecked(selectedFiles.containsKey(item.file.toString()), true);
|
((SharedDocumentCell) view).setChecked(selectedFiles.containsKey(item.file.toString()), true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
ArrayList<String> files = new ArrayList<String>();
|
ArrayList<String> files = new ArrayList<>();
|
||||||
files.add(file.getAbsolutePath());
|
files.add(file.getAbsolutePath());
|
||||||
delegate.didSelectFiles(DocumentSelectActivity.this, files);
|
delegate.didSelectFiles(DocumentSelectActivity.this, files);
|
||||||
}
|
}
|
||||||
@ -465,7 +464,16 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
}
|
}
|
||||||
ListItem item = new ListItem();
|
ListItem item = new ListItem();
|
||||||
item.title = "..";
|
item.title = "..";
|
||||||
item.subtitle = LocaleController.getString("Folder", R.string.Folder);
|
if (history.size() > 0) {
|
||||||
|
HistoryEntry entry = history.get(history.size() - 1);
|
||||||
|
if (entry.dir == null) {
|
||||||
|
item.subtitle = LocaleController.getString("Folder", R.string.Folder);
|
||||||
|
} else {
|
||||||
|
item.subtitle = entry.dir.toString();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
item.subtitle = LocaleController.getString("Folder", R.string.Folder);
|
||||||
|
}
|
||||||
item.icon = R.drawable.ic_directory;
|
item.icon = R.drawable.ic_directory;
|
||||||
item.file = null;
|
item.file = null;
|
||||||
items.add(0, item);
|
items.add(0, item);
|
||||||
@ -499,8 +507,8 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
try {
|
try {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader("/proc/mounts"));
|
BufferedReader reader = new BufferedReader(new FileReader("/proc/mounts"));
|
||||||
String line;
|
String line;
|
||||||
HashMap<String, ArrayList<String>> aliases = new HashMap<String, ArrayList<String>>();
|
HashMap<String, ArrayList<String>> aliases = new HashMap<>();
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
ArrayList<String> result = new ArrayList<>();
|
||||||
String extDevice = null;
|
String extDevice = null;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
if ((!line.contains("/mnt") && !line.contains("/storage") && !line.contains("/sdcard")) || line.contains("asec") || line.contains("tmpfs") || line.contains("none")) {
|
if ((!line.contains("/mnt") && !line.contains("/storage") && !line.contains("/sdcard")) || line.contains("asec") || line.contains("tmpfs") || line.contains("none")) {
|
||||||
@ -560,6 +568,13 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fs = new ListItem();
|
||||||
|
fs.title = LocaleController.getString("Gallery", R.string.Gallery);
|
||||||
|
fs.subtitle = LocaleController.getString("GalleryInfo", R.string.GalleryInfo);
|
||||||
|
fs.icon = R.drawable.ic_storage_gallery;
|
||||||
|
fs.file = null;
|
||||||
|
items.add(fs);
|
||||||
|
|
||||||
AndroidUtilities.clearDrawableAnimation(listView);
|
AndroidUtilities.clearDrawableAnimation(listView);
|
||||||
scrolling = true;
|
scrolling = true;
|
||||||
listAdapter.notifyDataSetChanged();
|
listAdapter.notifyDataSetChanged();
|
||||||
@ -608,15 +623,15 @@ public class DocumentSelectActivity extends BaseFragment {
|
|||||||
@Override
|
@Override
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
if (convertView == null) {
|
if (convertView == null) {
|
||||||
convertView = new TextDetailDocumentsCell(mContext);
|
convertView = new SharedDocumentCell(mContext);
|
||||||
}
|
}
|
||||||
TextDetailDocumentsCell textDetailCell = (TextDetailDocumentsCell) convertView;
|
SharedDocumentCell textDetailCell = (SharedDocumentCell) convertView;
|
||||||
ListItem item = items.get(position);
|
ListItem item = items.get(position);
|
||||||
if (item.icon != 0) {
|
if (item.icon != 0) {
|
||||||
((TextDetailDocumentsCell) convertView).setTextAndValueAndTypeAndThumb(item.title, item.subtitle, null, null, item.icon);
|
((SharedDocumentCell) convertView).setTextAndValueAndTypeAndThumb(item.title, item.subtitle, null, null, item.icon);
|
||||||
} else {
|
} else {
|
||||||
String type = item.ext.toUpperCase().substring(0, Math.min(item.ext.length(), 4));
|
String type = item.ext.toUpperCase().substring(0, Math.min(item.ext.length(), 4));
|
||||||
((TextDetailDocumentsCell) convertView).setTextAndValueAndTypeAndThumb(item.title, item.subtitle, type, item.thumb, 0);
|
((SharedDocumentCell) convertView).setTextAndValueAndTypeAndThumb(item.title, item.subtitle, type, item.thumb, 0);
|
||||||
}
|
}
|
||||||
if (item.file != null && actionBar.isActionModeShowed()) {
|
if (item.file != null && actionBar.isActionModeShowed()) {
|
||||||
textDetailCell.setChecked(selectedFiles.containsKey(item.file.toString()), !scrolling);
|
textDetailCell.setChecked(selectedFiles.containsKey(item.file.toString()), !scrolling);
|
||||||
|
@ -8,10 +8,13 @@
|
|||||||
|
|
||||||
package org.telegram.ui;
|
package org.telegram.ui;
|
||||||
|
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
|
import android.animation.StateListAnimator;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
import android.database.DataSetObserver;
|
import android.database.DataSetObserver;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.support.v4.view.PagerAdapter;
|
import android.support.v4.view.PagerAdapter;
|
||||||
@ -114,7 +117,13 @@ public class IntroActivity extends Activity {
|
|||||||
}
|
}
|
||||||
viewPager = (ViewPager)findViewById(R.id.intro_view_pager);
|
viewPager = (ViewPager)findViewById(R.id.intro_view_pager);
|
||||||
TextView startMessagingButton = (TextView) findViewById(R.id.start_messaging_button);
|
TextView startMessagingButton = (TextView) findViewById(R.id.start_messaging_button);
|
||||||
startMessagingButton.setText(LocaleController.getString("StartMessaging", R.string.StartMessaging));
|
startMessagingButton.setText(LocaleController.getString("StartMessaging", R.string.StartMessaging).toUpperCase());
|
||||||
|
if (Build.VERSION.SDK_INT >= 21) {
|
||||||
|
StateListAnimator animator = new StateListAnimator();
|
||||||
|
animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(startMessagingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200));
|
||||||
|
animator.addState(new int[] {}, ObjectAnimator.ofFloat(startMessagingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200));
|
||||||
|
startMessagingButton.setStateListAnimator(animator);
|
||||||
|
}
|
||||||
topImage1 = (ImageView)findViewById(R.id.icon_image1);
|
topImage1 = (ImageView)findViewById(R.id.icon_image1);
|
||||||
topImage2 = (ImageView)findViewById(R.id.icon_image2);
|
topImage2 = (ImageView)findViewById(R.id.icon_image2);
|
||||||
bottomPages = (ViewGroup)findViewById(R.id.bottom_pages);
|
bottomPages = (ViewGroup)findViewById(R.id.bottom_pages);
|
||||||
|
@ -276,7 +276,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
|||||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
intent.setType("text/plain");
|
intent.setType("text/plain");
|
||||||
intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText());
|
intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText());
|
||||||
startActivity(intent);
|
startActivity(Intent.createChooser(intent, ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
@ -735,6 +735,14 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
|||||||
} else if (showDialogsList) {
|
} else if (showDialogsList) {
|
||||||
if (!AndroidUtilities.isTablet()) {
|
if (!AndroidUtilities.isTablet()) {
|
||||||
actionBarLayout.removeAllFragments();
|
actionBarLayout.removeAllFragments();
|
||||||
|
} else {
|
||||||
|
if (!layersActionBarLayout.fragmentsStack.isEmpty()) {
|
||||||
|
for (int a = 0; a < layersActionBarLayout.fragmentsStack.size() - 1; a++) {
|
||||||
|
layersActionBarLayout.removeFragmentFromStack(layersActionBarLayout.fragmentsStack.get(0));
|
||||||
|
a--;
|
||||||
|
}
|
||||||
|
layersActionBarLayout.closeLastFragment(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pushOpened = false;
|
pushOpened = false;
|
||||||
isNew = false;
|
isNew = false;
|
||||||
|
@ -843,7 +843,7 @@ public class LoginActivity extends BaseFragment {
|
|||||||
needShowAlert(LocaleController.getString("CodeExpired", R.string.CodeExpired));
|
needShowAlert(LocaleController.getString("CodeExpired", R.string.CodeExpired));
|
||||||
} else if (error.text.startsWith("FLOOD_WAIT")) {
|
} else if (error.text.startsWith("FLOOD_WAIT")) {
|
||||||
needShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait));
|
needShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait));
|
||||||
} else {
|
} else if (error.code != -1000) {
|
||||||
needShowAlert(error.text);
|
needShowAlert(error.text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,12 @@
|
|||||||
|
|
||||||
package org.telegram.ui;
|
package org.telegram.ui;
|
||||||
|
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
|
import android.animation.StateListAnimator;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
|
import android.graphics.Outline;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
@ -18,6 +21,7 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewOutlineProvider;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.animation.AccelerateDecelerateInterpolator;
|
import android.view.animation.AccelerateDecelerateInterpolator;
|
||||||
import android.widget.AbsListView;
|
import android.widget.AbsListView;
|
||||||
@ -102,6 +106,8 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
|
|||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.contactsDidLoaded);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.contactsDidLoaded);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.appDidLogout);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.appDidLogout);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.openedChatChanged);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.openedChatChanged);
|
||||||
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.notificationsSettingsUpdated);
|
||||||
|
|
||||||
if (getArguments() != null) {
|
if (getArguments() != null) {
|
||||||
onlySelect = arguments.getBoolean("onlySelect", false);
|
onlySelect = arguments.getBoolean("onlySelect", false);
|
||||||
serverOnly = arguments.getBoolean("serverOnly", false);
|
serverOnly = arguments.getBoolean("serverOnly", false);
|
||||||
@ -126,6 +132,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
|
|||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.appDidLogout);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.appDidLogout);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.openedChatChanged);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.openedChatChanged);
|
||||||
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.notificationsSettingsUpdated);
|
||||||
delegate = null;
|
delegate = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,8 +280,21 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
|
|||||||
textView = (TextView)fragmentView.findViewById(R.id.search_empty_text);
|
textView = (TextView)fragmentView.findViewById(R.id.search_empty_text);
|
||||||
textView.setText(LocaleController.getString("NoResult", R.string.NoResult));
|
textView.setText(LocaleController.getString("NoResult", R.string.NoResult));
|
||||||
|
|
||||||
floatingButton = (ImageView)fragmentView.findViewById(R.id.floating_button);
|
floatingButton = (ImageView) fragmentView.findViewById(R.id.floating_button);
|
||||||
floatingButton.setVisibility(onlySelect ? View.GONE : View.VISIBLE);
|
floatingButton.setVisibility(onlySelect ? View.GONE : View.VISIBLE);
|
||||||
|
floatingButton.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
|
if (Build.VERSION.SDK_INT >= 21) {
|
||||||
|
StateListAnimator animator = new StateListAnimator();
|
||||||
|
animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200));
|
||||||
|
animator.addState(new int[] {}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200));
|
||||||
|
floatingButton.setStateListAnimator(animator);
|
||||||
|
floatingButton.setOutlineProvider(new ViewOutlineProvider() {
|
||||||
|
@Override
|
||||||
|
public void getOutline(View view, Outline outline) {
|
||||||
|
outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)floatingButton.getLayoutParams();
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)floatingButton.getLayoutParams();
|
||||||
layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(14) : 0;
|
layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(14) : 0;
|
||||||
layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(14);
|
layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(14);
|
||||||
@ -595,6 +615,10 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter
|
|||||||
}
|
}
|
||||||
updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG);
|
updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG);
|
||||||
}
|
}
|
||||||
|
} else if (id == NotificationCenter.notificationsSettingsUpdated) {
|
||||||
|
if (messagesListView != null) {
|
||||||
|
updateVisibleRows(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,7 +281,9 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati
|
|||||||
ArrayList<String> photos = new ArrayList<>();
|
ArrayList<String> photos = new ArrayList<>();
|
||||||
for (HashMap.Entry<Integer, MediaController.PhotoEntry> entry : selectedPhotos.entrySet()) {
|
for (HashMap.Entry<Integer, MediaController.PhotoEntry> entry : selectedPhotos.entrySet()) {
|
||||||
MediaController.PhotoEntry photoEntry = entry.getValue();
|
MediaController.PhotoEntry photoEntry = entry.getValue();
|
||||||
if (photoEntry.path != null) {
|
if (photoEntry.imagePath != null) {
|
||||||
|
photos.add(photoEntry.imagePath);
|
||||||
|
} else if (photoEntry.path != null) {
|
||||||
photos.add(photoEntry.path);
|
photos.add(photoEntry.path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,8 @@ import java.io.File;
|
|||||||
|
|
||||||
public class PhotoCropActivity extends BaseFragment {
|
public class PhotoCropActivity extends BaseFragment {
|
||||||
|
|
||||||
public interface PhotoCropActivityDelegate {
|
public interface PhotoEditActivityDelegate {
|
||||||
public abstract void didFinishCrop(Bitmap bitmap);
|
public abstract void didFinishEdit(Bitmap bitmap, Bundle args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class PhotoCropView extends FrameLayout {
|
private class PhotoCropView extends FrameLayout {
|
||||||
@ -44,12 +44,14 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
Paint rectPaint = null;
|
Paint rectPaint = null;
|
||||||
Paint circlePaint = null;
|
Paint circlePaint = null;
|
||||||
Paint halfPaint = null;
|
Paint halfPaint = null;
|
||||||
float rectSize = 600;
|
float rectSizeX = 600;
|
||||||
|
float rectSizeY = 600;
|
||||||
float rectX = -1, rectY = -1;
|
float rectX = -1, rectY = -1;
|
||||||
int draggingState = 0;
|
int draggingState = 0;
|
||||||
float oldX = 0, oldY = 0;
|
float oldX = 0, oldY = 0;
|
||||||
int bitmapWidth, bitmapHeight, bitmapX, bitmapY;
|
int bitmapWidth, bitmapHeight, bitmapX, bitmapY;
|
||||||
int viewWidth, viewHeight;
|
int viewWidth, viewHeight;
|
||||||
|
boolean freeform;
|
||||||
|
|
||||||
public PhotoCropView(Context context) {
|
public PhotoCropView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@ -68,14 +70,14 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
|
|
||||||
private void init() {
|
private void init() {
|
||||||
rectPaint = new Paint();
|
rectPaint = new Paint();
|
||||||
rectPaint.setColor(0xfffafafa);
|
rectPaint.setColor(0x3ffafafa);
|
||||||
rectPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
rectPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
||||||
rectPaint.setStyle(Paint.Style.STROKE);
|
rectPaint.setStyle(Paint.Style.STROKE);
|
||||||
circlePaint = new Paint();
|
circlePaint = new Paint();
|
||||||
circlePaint.setColor(0x7fffffff);
|
circlePaint.setColor(0xffffffff);
|
||||||
halfPaint = new Paint();
|
halfPaint = new Paint();
|
||||||
halfPaint.setColor(0x3f000000);
|
halfPaint.setColor(0xc8000000);
|
||||||
setBackgroundColor(0xff000000);
|
setBackgroundColor(0xff333333);
|
||||||
|
|
||||||
setOnTouchListener(new OnTouchListener() {
|
setOnTouchListener(new OnTouchListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -86,13 +88,13 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
|
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide < y && rectY + cornerSide > y) {
|
if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide < y && rectY + cornerSide > y) {
|
||||||
draggingState = 1;
|
draggingState = 1;
|
||||||
} else if (rectX - cornerSide + rectSize < x && rectX + cornerSide + rectSize > x && rectY - cornerSide < y && rectY + cornerSide > y) {
|
} else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide < y && rectY + cornerSide > y) {
|
||||||
draggingState = 2;
|
draggingState = 2;
|
||||||
} else if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide + rectSize < y && rectY + cornerSide + rectSize > y) {
|
} else if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) {
|
||||||
draggingState = 3;
|
draggingState = 3;
|
||||||
} else if (rectX - cornerSide + rectSize < x && rectX + cornerSide + rectSize > x && rectY - cornerSide + rectSize < y && rectY + cornerSide + rectSize > y) {
|
} else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) {
|
||||||
draggingState = 4;
|
draggingState = 4;
|
||||||
} else if (rectX < x && rectX + rectSize > x && rectY < y && rectY + rectSize > y) {
|
} else if (rectX < x && rectX + rectSizeX > x && rectY < y && rectY + rectSizeY > y) {
|
||||||
draggingState = 5;
|
draggingState = 5;
|
||||||
} else {
|
} else {
|
||||||
draggingState = 0;
|
draggingState = 0;
|
||||||
@ -113,61 +115,115 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
|
|
||||||
if (rectX < bitmapX) {
|
if (rectX < bitmapX) {
|
||||||
rectX = bitmapX;
|
rectX = bitmapX;
|
||||||
} else if (rectX + rectSize > bitmapX + bitmapWidth) {
|
} else if (rectX + rectSizeX > bitmapX + bitmapWidth) {
|
||||||
rectX = bitmapX + bitmapWidth - rectSize;
|
rectX = bitmapX + bitmapWidth - rectSizeX;
|
||||||
}
|
}
|
||||||
if (rectY < bitmapY) {
|
if (rectY < bitmapY) {
|
||||||
rectY = bitmapY;
|
rectY = bitmapY;
|
||||||
} else if (rectY + rectSize > bitmapY + bitmapHeight) {
|
} else if (rectY + rectSizeY > bitmapY + bitmapHeight) {
|
||||||
rectY = bitmapY + bitmapHeight - rectSize;
|
rectY = bitmapY + bitmapHeight - rectSizeY;
|
||||||
}
|
}
|
||||||
} else if (draggingState == 1) {
|
} else {
|
||||||
if (rectSize - diffX < 160) {
|
if (draggingState == 1) {
|
||||||
diffX = rectSize - 160;
|
if (rectSizeX - diffX < 160) {
|
||||||
}
|
diffX = rectSizeX - 160;
|
||||||
if (rectX + diffX < bitmapX) {
|
}
|
||||||
diffX = bitmapX - rectX;
|
if (rectX + diffX < bitmapX) {
|
||||||
}
|
diffX = bitmapX - rectX;
|
||||||
if (rectY + diffX < bitmapY) {
|
}
|
||||||
diffX = bitmapY - rectY;
|
if (!freeform) {
|
||||||
}
|
if (rectY + diffX < bitmapY) {
|
||||||
rectX += diffX;
|
diffX = bitmapY - rectY;
|
||||||
rectY += diffX;
|
}
|
||||||
rectSize -= diffX;
|
rectX += diffX;
|
||||||
} else if (draggingState == 2) {
|
rectY += diffX;
|
||||||
if (rectSize + diffX < 160) {
|
rectSizeX -= diffX;
|
||||||
diffX = -(rectSize - 160);
|
rectSizeY -= diffX;
|
||||||
}
|
} else {
|
||||||
if (rectX + rectSize + diffX > bitmapX + bitmapWidth) {
|
if (rectSizeY - diffY < 160) {
|
||||||
diffX = bitmapX + bitmapWidth - rectX - rectSize;
|
diffY = rectSizeY - 160;
|
||||||
}
|
}
|
||||||
if (rectY - diffX < bitmapY) {
|
if (rectY + diffY < bitmapY) {
|
||||||
diffX = rectY - bitmapY;
|
diffY = bitmapY - rectY;
|
||||||
}
|
}
|
||||||
rectY -= diffX;
|
rectX += diffX;
|
||||||
rectSize += diffX;
|
rectY += diffY;
|
||||||
} else if (draggingState == 3) {
|
rectSizeX -= diffX;
|
||||||
if (rectSize - diffX < 160) {
|
rectSizeY -= diffY;
|
||||||
diffX = rectSize - 160;
|
}
|
||||||
}
|
} else if (draggingState == 2) {
|
||||||
if (rectX + diffX < bitmapX) {
|
if (rectSizeX + diffX < 160) {
|
||||||
diffX = bitmapX - rectX;
|
diffX = -(rectSizeX - 160);
|
||||||
}
|
}
|
||||||
if (rectY + rectSize - diffX > bitmapY + bitmapHeight) {
|
if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) {
|
||||||
diffX = rectY + rectSize - bitmapY - bitmapHeight;
|
diffX = bitmapX + bitmapWidth - rectX - rectSizeX;
|
||||||
}
|
}
|
||||||
rectX += diffX;
|
if (!freeform) {
|
||||||
rectSize -= diffX;
|
if (rectY - diffX < bitmapY) {
|
||||||
} else if (draggingState == 4) {
|
diffX = rectY - bitmapY;
|
||||||
if (rectX + rectSize + diffX > bitmapX + bitmapWidth) {
|
}
|
||||||
diffX = bitmapX + bitmapWidth - rectX - rectSize;
|
rectY -= diffX;
|
||||||
}
|
rectSizeX += diffX;
|
||||||
if (rectY + rectSize + diffX > bitmapY + bitmapHeight) {
|
rectSizeY += diffX;
|
||||||
diffX = bitmapY + bitmapHeight - rectY - rectSize;
|
} else {
|
||||||
}
|
if (rectSizeY - diffY < 160) {
|
||||||
rectSize += diffX;
|
diffY = rectSizeY - 160;
|
||||||
if (rectSize < 160) {
|
}
|
||||||
rectSize = 160;
|
if (rectY + diffY < bitmapY) {
|
||||||
|
diffY = bitmapY - rectY;
|
||||||
|
}
|
||||||
|
rectY += diffY;
|
||||||
|
rectSizeX += diffX;
|
||||||
|
rectSizeY -= diffY;
|
||||||
|
}
|
||||||
|
} else if (draggingState == 3) {
|
||||||
|
if (rectSizeX - diffX < 160) {
|
||||||
|
diffX = rectSizeX - 160;
|
||||||
|
}
|
||||||
|
if (rectX + diffX < bitmapX) {
|
||||||
|
diffX = bitmapX - rectX;
|
||||||
|
}
|
||||||
|
if (!freeform) {
|
||||||
|
if (rectY + rectSizeX - diffX > bitmapY + bitmapHeight) {
|
||||||
|
diffX = rectY + rectSizeX - bitmapY - bitmapHeight;
|
||||||
|
}
|
||||||
|
rectX += diffX;
|
||||||
|
rectSizeX -= diffX;
|
||||||
|
rectSizeY -= diffX;
|
||||||
|
} else {
|
||||||
|
if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) {
|
||||||
|
diffY = bitmapY + bitmapHeight - rectY - rectSizeY;
|
||||||
|
}
|
||||||
|
rectX += diffX;
|
||||||
|
rectSizeX -= diffX;
|
||||||
|
rectSizeY += diffY;
|
||||||
|
if (rectSizeY < 160) {
|
||||||
|
rectSizeY = 160;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (draggingState == 4) {
|
||||||
|
if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) {
|
||||||
|
diffX = bitmapX + bitmapWidth - rectX - rectSizeX;
|
||||||
|
}
|
||||||
|
if (!freeform) {
|
||||||
|
if (rectY + rectSizeX + diffX > bitmapY + bitmapHeight) {
|
||||||
|
diffX = bitmapY + bitmapHeight - rectY - rectSizeX;
|
||||||
|
}
|
||||||
|
rectSizeX += diffX;
|
||||||
|
rectSizeY += diffX;
|
||||||
|
} else {
|
||||||
|
if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) {
|
||||||
|
diffY = bitmapY + bitmapHeight - rectY - rectSizeY;
|
||||||
|
}
|
||||||
|
rectSizeX += diffX;
|
||||||
|
rectSizeY += diffY;
|
||||||
|
}
|
||||||
|
if (rectSizeX < 160) {
|
||||||
|
rectSizeX = 160;
|
||||||
|
}
|
||||||
|
if (rectSizeY < 160) {
|
||||||
|
rectSizeY = 160;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,7 +242,8 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
}
|
}
|
||||||
float percX = (rectX - bitmapX) / bitmapWidth;
|
float percX = (rectX - bitmapX) / bitmapWidth;
|
||||||
float percY = (rectY - bitmapY) / bitmapHeight;
|
float percY = (rectY - bitmapY) / bitmapHeight;
|
||||||
float percSize = rectSize / bitmapWidth;
|
float percSizeX = rectSizeX / bitmapWidth;
|
||||||
|
float percSizeY = rectSizeY / bitmapHeight;
|
||||||
float w = imageToCrop.getWidth();
|
float w = imageToCrop.getWidth();
|
||||||
float h = imageToCrop.getHeight();
|
float h = imageToCrop.getHeight();
|
||||||
float scaleX = viewWidth / w;
|
float scaleX = viewWidth / w;
|
||||||
@ -198,23 +255,33 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
bitmapWidth = viewWidth;
|
bitmapWidth = viewWidth;
|
||||||
bitmapHeight = (int)Math.ceil(h * scaleX);
|
bitmapHeight = (int)Math.ceil(h * scaleX);
|
||||||
}
|
}
|
||||||
bitmapX = (viewWidth - bitmapWidth) / 2;
|
bitmapX = (viewWidth - bitmapWidth) / 2 + AndroidUtilities.dp(14);
|
||||||
bitmapY = (viewHeight - bitmapHeight) / 2;
|
bitmapY = (viewHeight - bitmapHeight) / 2 + AndroidUtilities.dp(14);
|
||||||
|
|
||||||
if (rectX == -1 && rectY == -1) {
|
if (rectX == -1 && rectY == -1) {
|
||||||
if (bitmapWidth > bitmapHeight) {
|
if (freeform) {
|
||||||
rectY = bitmapY;
|
rectY = bitmapY;
|
||||||
rectX = (viewWidth - bitmapHeight) / 2;
|
|
||||||
rectSize = bitmapHeight;
|
|
||||||
} else {
|
|
||||||
rectX = bitmapX;
|
rectX = bitmapX;
|
||||||
rectY = (viewHeight - bitmapWidth) / 2;
|
rectSizeX = bitmapWidth;
|
||||||
rectSize = bitmapWidth;
|
rectSizeY = bitmapHeight;
|
||||||
|
} else {
|
||||||
|
if (bitmapWidth > bitmapHeight) {
|
||||||
|
rectY = bitmapY;
|
||||||
|
rectX = (viewWidth - bitmapHeight) / 2 + AndroidUtilities.dp(14);
|
||||||
|
rectSizeX = bitmapHeight;
|
||||||
|
rectSizeY = bitmapHeight;
|
||||||
|
} else {
|
||||||
|
rectX = bitmapX;
|
||||||
|
rectY = (viewHeight - bitmapWidth) / 2 + AndroidUtilities.dp(14);
|
||||||
|
rectSizeX = bitmapWidth;
|
||||||
|
rectSizeY = bitmapWidth;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rectX = percX * bitmapWidth + bitmapX;
|
rectX = percX * bitmapWidth + bitmapX;
|
||||||
rectY = percY * bitmapHeight + bitmapY;
|
rectY = percY * bitmapHeight + bitmapY;
|
||||||
rectSize = percSize * bitmapWidth;
|
rectSizeX = percSizeX * bitmapWidth;
|
||||||
|
rectSizeY = percSizeY * bitmapHeight;
|
||||||
}
|
}
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
@ -222,31 +289,33 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
@Override
|
@Override
|
||||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||||
super.onLayout(changed, left, top, right, bottom);
|
super.onLayout(changed, left, top, right, bottom);
|
||||||
viewWidth = right - left;
|
viewWidth = right - left - AndroidUtilities.dp(28);
|
||||||
viewHeight = bottom - top;
|
viewHeight = bottom - top - AndroidUtilities.dp(28);
|
||||||
updateBitmapSize();
|
updateBitmapSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getBitmap() {
|
public Bitmap getBitmap() {
|
||||||
float percX = (rectX - bitmapX) / bitmapWidth;
|
float percX = (rectX - bitmapX) / bitmapWidth;
|
||||||
float percY = (rectY - bitmapY) / bitmapHeight;
|
float percY = (rectY - bitmapY) / bitmapHeight;
|
||||||
float percSize = rectSize / bitmapWidth;
|
float percSizeX = rectSizeX / bitmapWidth;
|
||||||
|
float percSizeY = rectSizeY / bitmapWidth;
|
||||||
int x = (int)(percX * imageToCrop.getWidth());
|
int x = (int)(percX * imageToCrop.getWidth());
|
||||||
int y = (int)(percY * imageToCrop.getHeight());
|
int y = (int)(percY * imageToCrop.getHeight());
|
||||||
int size = (int)(percSize * imageToCrop.getWidth());
|
int sizeX = (int)(percSizeX * imageToCrop.getWidth());
|
||||||
if (x + size > imageToCrop.getWidth()) {
|
int sizeY = (int)(percSizeY * imageToCrop.getWidth());
|
||||||
size = imageToCrop.getWidth() - x;
|
if (x + sizeX > imageToCrop.getWidth()) {
|
||||||
|
sizeX = imageToCrop.getWidth() - x;
|
||||||
}
|
}
|
||||||
if (y + size > imageToCrop.getHeight()) {
|
if (y + sizeY > imageToCrop.getHeight()) {
|
||||||
size = imageToCrop.getHeight() - y;
|
sizeY = imageToCrop.getHeight() - y;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return Bitmap.createBitmap(imageToCrop, x, y, size, size);
|
return Bitmap.createBitmap(imageToCrop, x, y, sizeX, sizeY);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
FileLog.e("tmessags", e);
|
FileLog.e("tmessags", e);
|
||||||
System.gc();
|
System.gc();
|
||||||
try {
|
try {
|
||||||
return Bitmap.createBitmap(imageToCrop, x, y, size, size);
|
return Bitmap.createBitmap(imageToCrop, x, y, sizeX, sizeY);
|
||||||
} catch (Throwable e2) {
|
} catch (Throwable e2) {
|
||||||
FileLog.e("tmessages", e2);
|
FileLog.e("tmessages", e2);
|
||||||
}
|
}
|
||||||
@ -261,26 +330,39 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
drawable.draw(canvas);
|
drawable.draw(canvas);
|
||||||
}
|
}
|
||||||
canvas.drawRect(bitmapX, bitmapY, bitmapX + bitmapWidth, rectY, halfPaint);
|
canvas.drawRect(bitmapX, bitmapY, bitmapX + bitmapWidth, rectY, halfPaint);
|
||||||
canvas.drawRect(bitmapX, rectY, rectX, rectY + rectSize, halfPaint);
|
canvas.drawRect(bitmapX, rectY, rectX, rectY + rectSizeY, halfPaint);
|
||||||
canvas.drawRect(rectX + rectSize, rectY, bitmapX + bitmapWidth, rectY + rectSize, halfPaint);
|
canvas.drawRect(rectX + rectSizeX, rectY, bitmapX + bitmapWidth, rectY + rectSizeY, halfPaint);
|
||||||
canvas.drawRect(bitmapX, rectY + rectSize, bitmapX + bitmapWidth, bitmapY + bitmapHeight, halfPaint);
|
canvas.drawRect(bitmapX, rectY + rectSizeY, bitmapX + bitmapWidth, bitmapY + bitmapHeight, halfPaint);
|
||||||
|
|
||||||
canvas.drawRect(rectX, rectY, rectX + rectSize, rectY + rectSize, rectPaint);
|
canvas.drawRect(rectX, rectY, rectX + rectSizeX, rectY + rectSizeY, rectPaint);
|
||||||
|
|
||||||
int side = AndroidUtilities.dp(7);
|
int side = AndroidUtilities.dp(1);
|
||||||
canvas.drawRect(rectX - side, rectY - side, rectX + side, rectY + side, circlePaint);
|
canvas.drawRect(rectX + side, rectY + side, rectX + side + AndroidUtilities.dp(20), rectY + side * 3, circlePaint);
|
||||||
canvas.drawRect(rectX + rectSize - side, rectY - side, rectX + rectSize + side, rectY + side, circlePaint);
|
canvas.drawRect(rectX + side, rectY + side, rectX + side * 3, rectY + side + AndroidUtilities.dp(20), circlePaint);
|
||||||
canvas.drawRect(rectX - side, rectY + rectSize - side, rectX + side, rectY + rectSize + side, circlePaint);
|
|
||||||
canvas.drawRect(rectX + rectSize - side, rectY + rectSize - side, rectX + rectSize + side, rectY + rectSize + side, circlePaint);
|
canvas.drawRect(rectX + rectSizeX - side - AndroidUtilities.dp(20), rectY + side, rectX + rectSizeX - side, rectY + side * 3, circlePaint);
|
||||||
|
canvas.drawRect(rectX + rectSizeX - side * 3, rectY + side, rectX + rectSizeX - side, rectY + side + AndroidUtilities.dp(20), circlePaint);
|
||||||
|
|
||||||
|
canvas.drawRect(rectX + side, rectY + rectSizeY - side - AndroidUtilities.dp(20), rectX + side * 3, rectY + rectSizeY - side, circlePaint);
|
||||||
|
canvas.drawRect(rectX + side, rectY + rectSizeY - side * 3, rectX + side + AndroidUtilities.dp(20), rectY + rectSizeY - side, circlePaint);
|
||||||
|
|
||||||
|
canvas.drawRect(rectX + rectSizeX - side - AndroidUtilities.dp(20), rectY + rectSizeY - side * 3, rectX + rectSizeX - side, rectY + rectSizeY - side, circlePaint);
|
||||||
|
canvas.drawRect(rectX + rectSizeX - side * 3, rectY + rectSizeY - side - AndroidUtilities.dp(20), rectX + rectSizeX - side, rectY + rectSizeY - side, circlePaint);
|
||||||
|
|
||||||
|
for (int a = 1; a < 3; a++) {
|
||||||
|
canvas.drawRect(rectX + rectSizeX / 3 * a, rectY + side, rectX + side + rectSizeX / 3 * a, rectY + rectSizeY - side, circlePaint);
|
||||||
|
canvas.drawRect(rectX + side, rectY + rectSizeY / 3 * a, rectX - side + rectSizeX, rectY + rectSizeY / 3 * a + side, circlePaint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Bitmap imageToCrop;
|
private Bitmap imageToCrop;
|
||||||
private BitmapDrawable drawable;
|
private BitmapDrawable drawable;
|
||||||
private PhotoCropActivityDelegate delegate = null;
|
private PhotoEditActivityDelegate delegate = null;
|
||||||
private PhotoCropView view;
|
private PhotoCropView view;
|
||||||
private boolean sameBitmap = false;
|
private boolean sameBitmap = false;
|
||||||
private boolean doneButtonPressed = false;
|
private boolean doneButtonPressed = false;
|
||||||
|
private String bitmapKey;
|
||||||
|
|
||||||
private final static int done_button = 1;
|
private final static int done_button = 1;
|
||||||
|
|
||||||
@ -288,29 +370,40 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
super(args);
|
super(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PhotoCropActivity(Bundle args, Bitmap bitmap, String key) {
|
||||||
|
super(args);
|
||||||
|
imageToCrop = bitmap;
|
||||||
|
bitmapKey = key;
|
||||||
|
if (imageToCrop != null && key != null) {
|
||||||
|
ImageLoader.getInstance().incrementUseCount(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onFragmentCreate() {
|
public boolean onFragmentCreate() {
|
||||||
swipeBackEnabled = false;
|
swipeBackEnabled = false;
|
||||||
String photoPath = getArguments().getString("photoPath");
|
if (imageToCrop == null) {
|
||||||
Uri photoUri = getArguments().getParcelable("photoUri");
|
String photoPath = getArguments().getString("photoPath");
|
||||||
if (photoPath == null && photoUri == null) {
|
Uri photoUri = getArguments().getParcelable("photoUri");
|
||||||
return false;
|
if (photoPath == null && photoUri == null) {
|
||||||
}
|
return false;
|
||||||
if (photoPath != null) {
|
}
|
||||||
File f = new File(photoPath);
|
if (photoPath != null) {
|
||||||
if (!f.exists()) {
|
File f = new File(photoPath);
|
||||||
|
if (!f.exists()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int size = 0;
|
||||||
|
if (AndroidUtilities.isTablet()) {
|
||||||
|
size = AndroidUtilities.dp(520);
|
||||||
|
} else {
|
||||||
|
size = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y);
|
||||||
|
}
|
||||||
|
imageToCrop = ImageLoader.loadBitmap(photoPath, photoUri, size, size, true);
|
||||||
|
if (imageToCrop == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
int size = 0;
|
|
||||||
if (AndroidUtilities.isTablet()) {
|
|
||||||
size = AndroidUtilities.dp(520);
|
|
||||||
} else {
|
|
||||||
size = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y);
|
|
||||||
}
|
|
||||||
imageToCrop = ImageLoader.loadBitmap(photoPath, photoUri, size, size);
|
|
||||||
if (imageToCrop == null) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
drawable = new BitmapDrawable(imageToCrop);
|
drawable = new BitmapDrawable(imageToCrop);
|
||||||
super.onFragmentCreate();
|
super.onFragmentCreate();
|
||||||
@ -321,7 +414,12 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
public void onFragmentDestroy() {
|
public void onFragmentDestroy() {
|
||||||
super.onFragmentDestroy();
|
super.onFragmentDestroy();
|
||||||
drawable = null;
|
drawable = null;
|
||||||
if (imageToCrop != null && !sameBitmap) {
|
if (bitmapKey != null) {
|
||||||
|
if (ImageLoader.getInstance().decrementUseCount(bitmapKey) && !ImageLoader.getInstance().isInCache(bitmapKey)) {
|
||||||
|
bitmapKey = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bitmapKey == null && imageToCrop != null && !sameBitmap) {
|
||||||
imageToCrop.recycle();
|
imageToCrop.recycle();
|
||||||
imageToCrop = null;
|
imageToCrop = null;
|
||||||
}
|
}
|
||||||
@ -330,6 +428,8 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
@Override
|
@Override
|
||||||
public View createView(LayoutInflater inflater, ViewGroup container) {
|
public View createView(LayoutInflater inflater, ViewGroup container) {
|
||||||
if (fragmentView == null) {
|
if (fragmentView == null) {
|
||||||
|
actionBar.setBackgroundColor(0xff333333);
|
||||||
|
actionBar.setItemsBackground(R.drawable.bar_selector_picker);
|
||||||
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
|
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
|
||||||
actionBar.setAllowOverlayTitle(true);
|
actionBar.setAllowOverlayTitle(true);
|
||||||
actionBar.setTitle(LocaleController.getString("CropImage", R.string.CropImage));
|
actionBar.setTitle(LocaleController.getString("CropImage", R.string.CropImage));
|
||||||
@ -344,7 +444,7 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
if (bitmap == imageToCrop) {
|
if (bitmap == imageToCrop) {
|
||||||
sameBitmap = true;
|
sameBitmap = true;
|
||||||
}
|
}
|
||||||
delegate.didFinishCrop(bitmap);
|
delegate.didFinishEdit(bitmap, getArguments());
|
||||||
doneButtonPressed = true;
|
doneButtonPressed = true;
|
||||||
}
|
}
|
||||||
finishFragment();
|
finishFragment();
|
||||||
@ -356,6 +456,7 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56));
|
menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56));
|
||||||
|
|
||||||
fragmentView = view = new PhotoCropView(getParentActivity());
|
fragmentView = view = new PhotoCropView(getParentActivity());
|
||||||
|
((PhotoCropView) fragmentView).freeform = getArguments().getBoolean("freeform", false);
|
||||||
fragmentView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
|
fragmentView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
|
||||||
} else {
|
} else {
|
||||||
ViewGroup parent = (ViewGroup)fragmentView.getParent();
|
ViewGroup parent = (ViewGroup)fragmentView.getParent();
|
||||||
@ -366,7 +467,7 @@ public class PhotoCropActivity extends BaseFragment {
|
|||||||
return fragmentView;
|
return fragmentView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDelegate(PhotoCropActivityDelegate delegate) {
|
public void setDelegate(PhotoEditActivityDelegate delegate) {
|
||||||
this.delegate = delegate;
|
this.delegate = delegate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1285
TMessagesProj/src/main/java/org/telegram/ui/PhotoEditorActivity.java
Normal file
@ -12,6 +12,7 @@ import android.app.Activity;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -32,6 +33,7 @@ import android.widget.TextView;
|
|||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.telegram.android.AndroidUtilities;
|
import org.telegram.android.AndroidUtilities;
|
||||||
|
import org.telegram.android.ImageLoader;
|
||||||
import org.telegram.android.LocaleController;
|
import org.telegram.android.LocaleController;
|
||||||
import org.telegram.android.MediaController;
|
import org.telegram.android.MediaController;
|
||||||
import org.telegram.android.MessagesStorage;
|
import org.telegram.android.MessagesStorage;
|
||||||
@ -45,6 +47,7 @@ import org.telegram.android.volley.toolbox.JsonObjectRequest;
|
|||||||
import org.telegram.android.volley.toolbox.Volley;
|
import org.telegram.android.volley.toolbox.Volley;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.BuildVars;
|
import org.telegram.messenger.BuildVars;
|
||||||
|
import org.telegram.messenger.FileLoader;
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
@ -65,7 +68,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class PhotoPickerActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, PhotoViewer.PhotoViewerProvider {
|
public class PhotoPickerActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, PhotoViewer.PhotoViewerProvider, PhotoCropActivity.PhotoEditActivityDelegate {
|
||||||
|
|
||||||
public static interface PhotoPickerActivityDelegate {
|
public static interface PhotoPickerActivityDelegate {
|
||||||
public abstract void selectedPhotosChanged();
|
public abstract void selectedPhotosChanged();
|
||||||
@ -85,7 +88,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
|
|
||||||
private boolean searching;
|
private boolean searching;
|
||||||
private String nextSearchBingString;
|
private String nextSearchBingString;
|
||||||
private boolean giffySearchEndReached = true;
|
private boolean giphySearchEndReached = true;
|
||||||
private String lastSearchString;
|
private String lastSearchString;
|
||||||
private boolean loadingRecent;
|
private boolean loadingRecent;
|
||||||
|
|
||||||
@ -184,7 +187,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
searchResultKeys.clear();
|
searchResultKeys.clear();
|
||||||
lastSearchString = null;
|
lastSearchString = null;
|
||||||
nextSearchBingString = null;
|
nextSearchBingString = null;
|
||||||
giffySearchEndReached = true;
|
giphySearchEndReached = true;
|
||||||
searching = false;
|
searching = false;
|
||||||
requestQueue.cancelAll("search");
|
requestQueue.cancelAll("search");
|
||||||
if (type == 0) {
|
if (type == 0) {
|
||||||
@ -204,11 +207,11 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
searchResult.clear();
|
searchResult.clear();
|
||||||
searchResultKeys.clear();
|
searchResultKeys.clear();
|
||||||
nextSearchBingString = null;
|
nextSearchBingString = null;
|
||||||
giffySearchEndReached = true;
|
giphySearchEndReached = true;
|
||||||
if (type == 0) {
|
if (type == 0) {
|
||||||
searchBingImages(editText.getText().toString(), 0, 53);
|
searchBingImages(editText.getText().toString(), 0, 53);
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
searchGiffyImages(editText.getText().toString(), 0, 53);
|
searchGiphyImages(editText.getText().toString(), 0, 53);
|
||||||
}
|
}
|
||||||
lastSearchString = editText.getText().toString();
|
lastSearchString = editText.getText().toString();
|
||||||
if (lastSearchString.length() == 0) {
|
if (lastSearchString.length() == 0) {
|
||||||
@ -320,8 +323,8 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !searching) {
|
if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !searching) {
|
||||||
if (type == 0 && nextSearchBingString != null) {
|
if (type == 0 && nextSearchBingString != null) {
|
||||||
searchBingImages(lastSearchString, searchResult.size(), 54);
|
searchBingImages(lastSearchString, searchResult.size(), 54);
|
||||||
} else if (type == 1 && !giffySearchEndReached) {
|
} else if (type == 1 && !giphySearchEndReached) {
|
||||||
searchGiffyImages(searchItem.getSearchField().getText().toString(), searchResult.size(), 54);
|
searchGiphyImages(searchItem.getSearchField().getText().toString(), searchResult.size(), 54);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -615,6 +618,20 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void didFinishEdit(Bitmap bitmap, Bundle args) {
|
||||||
|
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 80, false, 101, 101);
|
||||||
|
if (size != null) {
|
||||||
|
int id = args.getInt("id");
|
||||||
|
MediaController.PhotoEntry entry = selectedAlbum.photosByIds.get(id);
|
||||||
|
entry.imagePath = FileLoader.getPathToAttach(size, true).toString();
|
||||||
|
selectedPhotos.put(entry.imageId, entry);
|
||||||
|
listAdapter.notifyDataSetChanged();
|
||||||
|
photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true);
|
||||||
|
delegate.selectedPhotosChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateSearchInterface() {
|
private void updateSearchInterface() {
|
||||||
if (listAdapter != null) {
|
if (listAdapter != null) {
|
||||||
listAdapter.notifyDataSetChanged();
|
listAdapter.notifyDataSetChanged();
|
||||||
@ -630,7 +647,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void searchGiffyImages(String query, int offset, final int count) {
|
private void searchGiphyImages(String query, int offset, final int count) {
|
||||||
if (searching) {
|
if (searching) {
|
||||||
searching = false;
|
searching = false;
|
||||||
requestQueue.cancelAll("search");
|
requestQueue.cancelAll("search");
|
||||||
@ -647,7 +664,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
try {
|
try {
|
||||||
JSONObject pagination = response.getJSONObject("pagination");
|
JSONObject pagination = response.getJSONObject("pagination");
|
||||||
int total_count = pagination.getInt("total_count");
|
int total_count = pagination.getInt("total_count");
|
||||||
giffySearchEndReached = searchResult.size() + result.length() >= total_count;
|
giphySearchEndReached = searchResult.size() + result.length() >= total_count;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
}
|
}
|
||||||
@ -678,7 +695,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!added) {
|
if (!added) {
|
||||||
giffySearchEndReached = true;
|
giphySearchEndReached = true;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e("tmessages", e);
|
FileLog.e("tmessages", e);
|
||||||
@ -691,7 +708,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
@Override
|
@Override
|
||||||
public void onErrorResponse(VolleyError error) {
|
public void onErrorResponse(VolleyError error) {
|
||||||
FileLog.e("tmessages", "Error: " + error.getMessage());
|
FileLog.e("tmessages", "Error: " + error.getMessage());
|
||||||
giffySearchEndReached = true;
|
giphySearchEndReached = true;
|
||||||
searching = false;
|
searching = false;
|
||||||
updateSearchInterface();
|
updateSearchInterface();
|
||||||
}
|
}
|
||||||
@ -884,7 +901,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
} else if (type == 0) {
|
} else if (type == 0) {
|
||||||
return searchResult.size() + (nextSearchBingString == null ? 0 : 1);
|
return searchResult.size() + (nextSearchBingString == null ? 0 : 1);
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
return searchResult.size() + (giffySearchEndReached ? 0 : 1);
|
return searchResult.size() + (giphySearchEndReached ? 0 : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return selectedAlbum.photos.size();
|
return selectedAlbum.photos.size();
|
||||||
@ -920,9 +937,11 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
MediaController.PhotoEntry photoEntry = selectedAlbum.photos.get((Integer) ((View) v.getParent()).getTag());
|
MediaController.PhotoEntry photoEntry = selectedAlbum.photos.get((Integer) ((View) v.getParent()).getTag());
|
||||||
if (selectedPhotos.containsKey(photoEntry.imageId)) {
|
if (selectedPhotos.containsKey(photoEntry.imageId)) {
|
||||||
selectedPhotos.remove(photoEntry.imageId);
|
selectedPhotos.remove(photoEntry.imageId);
|
||||||
|
photoEntry.imagePath = null;
|
||||||
} else {
|
} else {
|
||||||
selectedPhotos.put(photoEntry.imageId, photoEntry);
|
selectedPhotos.put(photoEntry.imageId, photoEntry);
|
||||||
}
|
}
|
||||||
|
((PhotoPickerPhotoCell) v.getParent()).editedImage.setVisibility(photoEntry.imagePath != null ? View.VISIBLE : View.GONE);
|
||||||
((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedPhotos.containsKey(photoEntry.imageId), true);
|
((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedPhotos.containsKey(photoEntry.imageId), true);
|
||||||
} else {
|
} else {
|
||||||
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
|
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
|
||||||
@ -937,6 +956,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
} else {
|
} else {
|
||||||
selectedWebPhotos.put(photoEntry.id, photoEntry);
|
selectedWebPhotos.put(photoEntry.id, photoEntry);
|
||||||
}
|
}
|
||||||
|
((PhotoPickerPhotoCell) v.getParent()).editedImage.setVisibility(View.GONE);
|
||||||
((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), true);
|
((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), true);
|
||||||
}
|
}
|
||||||
photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true);
|
photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true);
|
||||||
@ -958,6 +978,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
imageView.setImageResource(R.drawable.nophotos);
|
imageView.setImageResource(R.drawable.nophotos);
|
||||||
}
|
}
|
||||||
cell.checkBox.setChecked(selectedPhotos.containsKey(photoEntry.imageId), false);
|
cell.checkBox.setChecked(selectedPhotos.containsKey(photoEntry.imageId), false);
|
||||||
|
cell.editedImage.setVisibility(photoEntry.imagePath != null ? View.VISIBLE : View.GONE);
|
||||||
showing = PhotoViewer.getInstance().isShowingImage(photoEntry.path);
|
showing = PhotoViewer.getInstance().isShowingImage(photoEntry.path);
|
||||||
} else {
|
} else {
|
||||||
MediaController.SearchImage photoEntry = null;
|
MediaController.SearchImage photoEntry = null;
|
||||||
@ -972,6 +993,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen
|
|||||||
imageView.setImageResource(R.drawable.nophotos);
|
imageView.setImageResource(R.drawable.nophotos);
|
||||||
}
|
}
|
||||||
cell.checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), false);
|
cell.checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), false);
|
||||||
|
cell.editedImage.setVisibility(View.GONE);
|
||||||
showing = PhotoViewer.getInstance().isShowingImage(photoEntry.thumbUrl);
|
showing = PhotoViewer.getInstance().isShowingImage(photoEntry.thumbUrl);
|
||||||
}
|
}
|
||||||
imageView.imageReceiver.setVisible(!showing, false);
|
imageView.imageReceiver.setVisible(!showing, false);
|
||||||
|
@ -34,11 +34,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.animation.AlphaAnimation;
|
|
||||||
import android.view.animation.Animation;
|
|
||||||
import android.view.animation.AnimationSet;
|
|
||||||
import android.view.animation.DecelerateInterpolator;
|
import android.view.animation.DecelerateInterpolator;
|
||||||
import android.view.animation.ScaleAnimation;
|
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.Scroller;
|
import android.widget.Scroller;
|
||||||
@ -48,6 +44,7 @@ import org.telegram.android.AndroidUtilities;
|
|||||||
import org.telegram.android.ContactsController;
|
import org.telegram.android.ContactsController;
|
||||||
import org.telegram.android.ImageLoader;
|
import org.telegram.android.ImageLoader;
|
||||||
import org.telegram.android.MessagesStorage;
|
import org.telegram.android.MessagesStorage;
|
||||||
|
import org.telegram.android.query.SharedMediaQuery;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.ConnectionsManager;
|
import org.telegram.messenger.ConnectionsManager;
|
||||||
import org.telegram.messenger.FileLoader;
|
import org.telegram.messenger.FileLoader;
|
||||||
@ -108,7 +105,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
private PhotoPickerBottomLayout pickerView;
|
private PhotoPickerBottomLayout pickerView;
|
||||||
private ImageView shareButton;
|
private ImageView shareButton;
|
||||||
private RadialProgressView radialProgressViews[] = new RadialProgressView[3];
|
private RadialProgressView radialProgressViews[] = new RadialProgressView[3];
|
||||||
private GifDrawable gifDrawable = null;
|
private GifDrawable gifDrawable;
|
||||||
|
private ActionBarMenuItem editItem;
|
||||||
|
private AnimatorSetProxy currentActionBarAnimation;
|
||||||
private boolean canShowBottom = true;
|
private boolean canShowBottom = true;
|
||||||
|
|
||||||
private int animationInProgress = 0;
|
private int animationInProgress = 0;
|
||||||
@ -117,7 +116,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
private PlaceProviderObject showAfterAnimation;
|
private PlaceProviderObject showAfterAnimation;
|
||||||
private PlaceProviderObject hideAfterAnimation;
|
private PlaceProviderObject hideAfterAnimation;
|
||||||
private boolean disableShowCheck = false;
|
private boolean disableShowCheck = false;
|
||||||
private Animation.AnimationListener animationListener;
|
|
||||||
|
|
||||||
private ImageReceiver leftImage = new ImageReceiver();
|
private ImageReceiver leftImage = new ImageReceiver();
|
||||||
private ImageReceiver centerImage = new ImageReceiver();
|
private ImageReceiver centerImage = new ImageReceiver();
|
||||||
@ -189,6 +187,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
private final static int gallery_menu_save = 1;
|
private final static int gallery_menu_save = 1;
|
||||||
private final static int gallery_menu_showall = 2;
|
private final static int gallery_menu_showall = 2;
|
||||||
private final static int gallery_menu_send = 3;
|
private final static int gallery_menu_send = 3;
|
||||||
|
private final static int gallery_menu_edit = 4;
|
||||||
|
|
||||||
private final static int PAGE_SPACING = AndroidUtilities.dp(30);
|
private final static int PAGE_SPACING = AndroidUtilities.dp(30);
|
||||||
|
|
||||||
@ -286,14 +285,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onDraw(Canvas canvas) {
|
public void onDraw(Canvas canvas) {
|
||||||
int sizeScaled = (int)(size * scale);
|
int sizeScaled = (int) (size * scale);
|
||||||
int x = (canvas.getWidth() - sizeScaled) / 2;
|
int x = (canvas.getWidth() - sizeScaled) / 2;
|
||||||
int y = (canvas.getHeight() - sizeScaled) / 2;
|
int y = (canvas.getHeight() - sizeScaled) / 2;
|
||||||
|
|
||||||
if (previousBackgroundState >= 0 && previousBackgroundState < 4) {
|
if (previousBackgroundState >= 0 && previousBackgroundState < 4) {
|
||||||
Drawable drawable = progressDrawables[previousBackgroundState];
|
Drawable drawable = progressDrawables[previousBackgroundState];
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
drawable.setAlpha((int)(255 * animatedAlphaValue * alpha));
|
drawable.setAlpha((int) (255 * animatedAlphaValue * alpha));
|
||||||
drawable.setBounds(x, y, x + sizeScaled, y + sizeScaled);
|
drawable.setBounds(x, y, x + sizeScaled, y + sizeScaled);
|
||||||
drawable.draw(canvas);
|
drawable.draw(canvas);
|
||||||
}
|
}
|
||||||
@ -303,9 +302,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
Drawable drawable = progressDrawables[backgroundState];
|
Drawable drawable = progressDrawables[backgroundState];
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
if (previousBackgroundState != -2) {
|
if (previousBackgroundState != -2) {
|
||||||
drawable.setAlpha((int)(255 * (1.0f - animatedAlphaValue) * alpha));
|
drawable.setAlpha((int) (255 * (1.0f - animatedAlphaValue) * alpha));
|
||||||
} else {
|
} else {
|
||||||
drawable.setAlpha((int)(255 * alpha));
|
drawable.setAlpha((int) (255 * alpha));
|
||||||
}
|
}
|
||||||
drawable.setBounds(x, y, x + sizeScaled, y + sizeScaled);
|
drawable.setBounds(x, y, x + sizeScaled, y + sizeScaled);
|
||||||
drawable.draw(canvas);
|
drawable.draw(canvas);
|
||||||
@ -315,9 +314,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (backgroundState == 0 || backgroundState == 1 || previousBackgroundState == 0 || previousBackgroundState == 1) {
|
if (backgroundState == 0 || backgroundState == 1 || previousBackgroundState == 0 || previousBackgroundState == 1) {
|
||||||
int diff = AndroidUtilities.dp(1);
|
int diff = AndroidUtilities.dp(1);
|
||||||
if (previousBackgroundState != -2) {
|
if (previousBackgroundState != -2) {
|
||||||
progressPaint.setAlpha((int)(255 * animatedAlphaValue * alpha));
|
progressPaint.setAlpha((int) (255 * animatedAlphaValue * alpha));
|
||||||
} else {
|
} else {
|
||||||
progressPaint.setAlpha((int)(255 * alpha));
|
progressPaint.setAlpha((int) (255 * alpha));
|
||||||
}
|
}
|
||||||
progressRect.set(x + diff, y + diff, x + sizeScaled - diff, y + sizeScaled - diff);
|
progressRect.set(x + diff, y + diff, x + sizeScaled - diff, y + sizeScaled - diff);
|
||||||
canvas.drawArc(progressRect, -90 + radOffset, Math.max(4, 360 * animatedProgressValue), false, progressPaint);
|
canvas.drawArc(progressRect, -90 + radOffset, Math.max(4, 360 * animatedProgressValue), false, progressPaint);
|
||||||
@ -340,13 +339,21 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
|
|
||||||
public static interface PhotoViewerProvider {
|
public static interface PhotoViewerProvider {
|
||||||
public PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index);
|
public PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index);
|
||||||
|
|
||||||
public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index);
|
public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index);
|
||||||
|
|
||||||
public void willSwitchFromPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index);
|
public void willSwitchFromPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index);
|
||||||
|
|
||||||
public void willHidePhotoViewer();
|
public void willHidePhotoViewer();
|
||||||
|
|
||||||
public boolean isPhotoChecked(int index);
|
public boolean isPhotoChecked(int index);
|
||||||
|
|
||||||
public void setPhotoChecked(int index);
|
public void setPhotoChecked(int index);
|
||||||
|
|
||||||
public void cancelButtonPressed();
|
public void cancelButtonPressed();
|
||||||
|
|
||||||
public void sendButtonPressed(int index);
|
public void sendButtonPressed(int index);
|
||||||
|
|
||||||
public int getSelectedCount();
|
public int getSelectedCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,14 +380,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
setWillNotDraw(false);
|
setWillNotDraw(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onAnimationEnd() {
|
|
||||||
super.onAnimationEnd();
|
|
||||||
if (getInstance().animationListener != null) {
|
|
||||||
getInstance().animationListener.onAnimationEnd(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
getInstance().onDraw(canvas);
|
getInstance().onDraw(canvas);
|
||||||
@ -388,6 +387,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static volatile PhotoViewer Instance = null;
|
private static volatile PhotoViewer Instance = null;
|
||||||
|
|
||||||
public static PhotoViewer getInstance() {
|
public static PhotoViewer getInstance() {
|
||||||
PhotoViewer localInstance = Instance;
|
PhotoViewer localInstance = Instance;
|
||||||
if (localInstance == null) {
|
if (localInstance == null) {
|
||||||
@ -405,7 +405,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
@Override
|
@Override
|
||||||
public void didReceivedNotification(int id, Object... args) {
|
public void didReceivedNotification(int id, Object... args) {
|
||||||
if (id == NotificationCenter.FileDidFailedLoad) {
|
if (id == NotificationCenter.FileDidFailedLoad) {
|
||||||
String location = (String)args[0];
|
String location = (String) args[0];
|
||||||
for (int a = 0; a < 3; a++) {
|
for (int a = 0; a < 3; a++) {
|
||||||
if (currentFileNames[a] != null && currentFileNames[a].equals(location)) {
|
if (currentFileNames[a] != null && currentFileNames[a].equals(location)) {
|
||||||
radialProgressViews[a].setProgress(1.0f, true);
|
radialProgressViews[a].setProgress(1.0f, true);
|
||||||
@ -414,7 +414,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (id == NotificationCenter.FileDidLoaded) {
|
} else if (id == NotificationCenter.FileDidLoaded) {
|
||||||
String location = (String)args[0];
|
String location = (String) args[0];
|
||||||
for (int a = 0; a < 3; a++) {
|
for (int a = 0; a < 3; a++) {
|
||||||
if (currentFileNames[a] != null && currentFileNames[a].equals(location)) {
|
if (currentFileNames[a] != null && currentFileNames[a].equals(location)) {
|
||||||
radialProgressViews[a].setProgress(1.0f, true);
|
radialProgressViews[a].setProgress(1.0f, true);
|
||||||
@ -426,7 +426,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (id == NotificationCenter.FileLoadProgressChanged) {
|
} else if (id == NotificationCenter.FileLoadProgressChanged) {
|
||||||
String location = (String)args[0];
|
String location = (String) args[0];
|
||||||
for (int a = 0; a < 3; a++) {
|
for (int a = 0; a < 3; a++) {
|
||||||
if (currentFileNames[a] != null && currentFileNames[a].equals(location)) {
|
if (currentFileNames[a] != null && currentFileNames[a].equals(location)) {
|
||||||
Float progress = (Float) args[1];
|
Float progress = (Float) args[1];
|
||||||
@ -434,13 +434,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (id == NotificationCenter.userPhotosLoaded) {
|
} else if (id == NotificationCenter.userPhotosLoaded) {
|
||||||
int guid = (Integer)args[4];
|
int guid = (Integer) args[4];
|
||||||
int uid = (Integer)args[0];
|
int uid = (Integer) args[0];
|
||||||
if (avatarsUserId == uid && classGuid == guid) {
|
if (avatarsUserId == uid && classGuid == guid) {
|
||||||
boolean fromCache = (Boolean)args[3];
|
boolean fromCache = (Boolean) args[3];
|
||||||
|
|
||||||
int setToImage = -1;
|
int setToImage = -1;
|
||||||
ArrayList<TLRPC.Photo> photos = (ArrayList<TLRPC.Photo>)args[5];
|
ArrayList<TLRPC.Photo> photos = (ArrayList<TLRPC.Photo>) args[5];
|
||||||
if (photos.isEmpty()) {
|
if (photos.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -486,27 +486,27 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (id == NotificationCenter.mediaCountDidLoaded) {
|
} else if (id == NotificationCenter.mediaCountDidLoaded) {
|
||||||
long uid = (Long)args[0];
|
long uid = (Long) args[0];
|
||||||
if (uid == currentDialogId) {
|
if (uid == currentDialogId) {
|
||||||
if ((int)currentDialogId != 0 && (Boolean)args[2]) {
|
if ((int) currentDialogId != 0 && (Boolean) args[2]) {
|
||||||
MessagesController.getInstance().getMediaCount(currentDialogId, classGuid, false);
|
SharedMediaQuery.getMediaCount(currentDialogId, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, false);
|
||||||
}
|
}
|
||||||
totalImagesCount = (Integer)args[1];
|
totalImagesCount = (Integer) args[1];
|
||||||
if (needSearchImageInArr && isFirstLoading) {
|
if (needSearchImageInArr && isFirstLoading) {
|
||||||
isFirstLoading = false;
|
isFirstLoading = false;
|
||||||
loadingMoreImages = true;
|
loadingMoreImages = true;
|
||||||
MessagesController.getInstance().loadMedia(currentDialogId, 0, 100, 0, true, classGuid);
|
SharedMediaQuery.loadMedia(currentDialogId, 0, 100, 0, SharedMediaQuery.MEDIA_PHOTOVIDEO, true, classGuid);
|
||||||
} else if (!imagesArr.isEmpty()) {
|
} else if (!imagesArr.isEmpty()) {
|
||||||
actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount));
|
actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (id == NotificationCenter.mediaDidLoaded) {
|
} else if (id == NotificationCenter.mediaDidLoaded) {
|
||||||
long uid = (Long)args[0];
|
long uid = (Long) args[0];
|
||||||
int guid = (Integer)args[4];
|
int guid = (Integer) args[4];
|
||||||
if (uid == currentDialogId && guid == classGuid) {
|
if (uid == currentDialogId && guid == classGuid) {
|
||||||
loadingMoreImages = false;
|
loadingMoreImages = false;
|
||||||
ArrayList<MessageObject> arr = (ArrayList<MessageObject>)args[2];
|
ArrayList<MessageObject> arr = (ArrayList<MessageObject>) args[2];
|
||||||
boolean fromCache = (Boolean)args[3];
|
boolean fromCache = (Boolean) args[3];
|
||||||
cacheEndReached = !fromCache;
|
cacheEndReached = !fromCache;
|
||||||
if (needSearchImageInArr) {
|
if (needSearchImageInArr) {
|
||||||
if (arr.isEmpty()) {
|
if (arr.isEmpty()) {
|
||||||
@ -548,7 +548,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
} else {
|
} else {
|
||||||
if (!cacheEndReached || !arr.isEmpty() && added != 0) {
|
if (!cacheEndReached || !arr.isEmpty() && added != 0) {
|
||||||
loadingMoreImages = true;
|
loadingMoreImages = true;
|
||||||
MessagesController.getInstance().loadMedia(currentDialogId, 0, 100, imagesArrTemp.get(0).messageOwner.id, true, classGuid);
|
SharedMediaQuery.loadMedia(currentDialogId, 0, 100, imagesArrTemp.get(0).messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, true, classGuid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -601,7 +601,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
containerView = new FrameLayoutDrawer(activity);
|
containerView = new FrameLayoutDrawer(activity);
|
||||||
containerView.setFocusable(false);
|
containerView.setFocusable(false);
|
||||||
windowView.addView(containerView);
|
windowView.addView(containerView);
|
||||||
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)containerView.getLayoutParams();
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) containerView.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT;
|
layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
|
layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
|
||||||
@ -652,10 +652,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (opennedFromMedia) {
|
if (opennedFromMedia) {
|
||||||
closePhoto(true);
|
closePhoto(true);
|
||||||
} else if (currentDialogId != 0) {
|
} else if (currentDialogId != 0) {
|
||||||
|
disableShowCheck = true;
|
||||||
closePhoto(false);
|
closePhoto(false);
|
||||||
Bundle args2 = new Bundle();
|
Bundle args2 = new Bundle();
|
||||||
args2.putLong("dialog_id", currentDialogId);
|
args2.putLong("dialog_id", currentDialogId);
|
||||||
((LaunchActivity)parentActivity).presentFragment(new MediaActivity(args2), false, true);
|
((LaunchActivity) parentActivity).presentFragment(new MediaActivity(args2), false, true);
|
||||||
}
|
}
|
||||||
} else if (id == gallery_menu_send) {
|
} else if (id == gallery_menu_send) {
|
||||||
/*Intent intent = new Intent(this, MessagesActivity.class);
|
/*Intent intent = new Intent(this, MessagesActivity.class);
|
||||||
@ -690,6 +691,21 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
} else if (id == gallery_menu_edit) {
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
Bitmap bitmap = centerImage.getBitmap();
|
||||||
|
String key = centerImage.getKey();
|
||||||
|
if (bitmap == null) {
|
||||||
|
args.putString("photoPath", currentPathObject);
|
||||||
|
}
|
||||||
|
MediaController.PhotoEntry object = (MediaController.PhotoEntry) imagesArrLocals.get(currentIndex);
|
||||||
|
args.putInt("id", object.imageId);
|
||||||
|
args.putBoolean("freeformCrop", true);
|
||||||
|
args.putBoolean("onlyCrop", true);
|
||||||
|
PhotoEditorActivity fragment = new PhotoEditorActivity(args, bitmap, key);
|
||||||
|
fragment.setDelegate((PhotoCropActivity.PhotoEditActivityDelegate) placeProvider);
|
||||||
|
((LaunchActivity) parentActivity).presentFragment(fragment, false, true);
|
||||||
|
closePhoto(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,9 +732,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
menuItem.addSubItem(gallery_menu_save, LocaleController.getString("SaveToGallery", R.string.SaveToGallery), 0);
|
menuItem.addSubItem(gallery_menu_save, LocaleController.getString("SaveToGallery", R.string.SaveToGallery), 0);
|
||||||
menuItem.addSubItem(gallery_menu_showall, LocaleController.getString("ShowAllMedia", R.string.ShowAllMedia), 0);
|
menuItem.addSubItem(gallery_menu_showall, LocaleController.getString("ShowAllMedia", R.string.ShowAllMedia), 0);
|
||||||
|
|
||||||
|
editItem = menu.addItemWithWidth(gallery_menu_edit, R.drawable.photo_edit, AndroidUtilities.dp(56));
|
||||||
|
|
||||||
bottomLayout = new FrameLayout(containerView.getContext());
|
bottomLayout = new FrameLayout(containerView.getContext());
|
||||||
containerView.addView(bottomLayout);
|
containerView.addView(bottomLayout);
|
||||||
layoutParams = (FrameLayout.LayoutParams)bottomLayout.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) bottomLayout.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
layoutParams.height = AndroidUtilities.dp(48);
|
layoutParams.height = AndroidUtilities.dp(48);
|
||||||
layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT;
|
layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT;
|
||||||
@ -764,7 +782,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
intent.setType("image/jpeg");
|
intent.setType("image/jpeg");
|
||||||
}
|
}
|
||||||
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
|
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
|
||||||
parentActivity.startActivity(intent);
|
|
||||||
|
parentActivity.startActivity(Intent.createChooser(intent, ""));
|
||||||
} else {
|
} else {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
|
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
|
||||||
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
||||||
@ -802,10 +821,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
|
|
||||||
ArrayList<Long> random_ids = null;
|
ArrayList<Long> random_ids = null;
|
||||||
TLRPC.EncryptedChat encryptedChat = null;
|
TLRPC.EncryptedChat encryptedChat = null;
|
||||||
if ((int)obj.getDialogId() == 0 && obj.messageOwner.random_id != 0) {
|
if ((int) obj.getDialogId() == 0 && obj.messageOwner.random_id != 0) {
|
||||||
random_ids = new ArrayList<>();
|
random_ids = new ArrayList<>();
|
||||||
random_ids.add(obj.messageOwner.random_id);
|
random_ids.add(obj.messageOwner.random_id);
|
||||||
encryptedChat = MessagesController.getInstance().getEncryptedChat((int)(obj.getDialogId() >> 32));
|
encryptedChat = MessagesController.getInstance().getEncryptedChat((int) (obj.getDialogId() >> 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagesController.getInstance().deleteMessages(arr, random_ids, encryptedChat);
|
MessagesController.getInstance().deleteMessages(arr, random_ids, encryptedChat);
|
||||||
@ -868,7 +887,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
nameTextView.setTextColor(0xffffffff);
|
nameTextView.setTextColor(0xffffffff);
|
||||||
nameTextView.setGravity(Gravity.CENTER);
|
nameTextView.setGravity(Gravity.CENTER);
|
||||||
bottomLayout.addView(nameTextView);
|
bottomLayout.addView(nameTextView);
|
||||||
layoutParams = (FrameLayout.LayoutParams)nameTextView.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;
|
layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;
|
||||||
layoutParams.gravity = Gravity.TOP;
|
layoutParams.gravity = Gravity.TOP;
|
||||||
@ -885,7 +904,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
dateTextView.setTextColor(0xffb8bdbe);
|
dateTextView.setTextColor(0xffb8bdbe);
|
||||||
dateTextView.setGravity(Gravity.CENTER);
|
dateTextView.setGravity(Gravity.CENTER);
|
||||||
bottomLayout.addView(dateTextView);
|
bottomLayout.addView(dateTextView);
|
||||||
layoutParams = (FrameLayout.LayoutParams)dateTextView.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) dateTextView.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;
|
layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;
|
||||||
layoutParams.gravity = Gravity.TOP;
|
layoutParams.gravity = Gravity.TOP;
|
||||||
@ -895,6 +914,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
dateTextView.setLayoutParams(layoutParams);
|
dateTextView.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
pickerView = new PhotoPickerBottomLayout(parentActivity);
|
pickerView = new PhotoPickerBottomLayout(parentActivity);
|
||||||
|
pickerView.setBackgroundColor(0x7f000000);
|
||||||
containerView.addView(pickerView);
|
containerView.addView(pickerView);
|
||||||
pickerView.cancelButton.setOnClickListener(new View.OnClickListener() {
|
pickerView.cancelButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -915,7 +935,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
layoutParams = (FrameLayout.LayoutParams)pickerView.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) pickerView.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
|
||||||
layoutParams.height = AndroidUtilities.dp(48);
|
layoutParams.height = AndroidUtilities.dp(48);
|
||||||
layoutParams.gravity = Gravity.BOTTOM;
|
layoutParams.gravity = Gravity.BOTTOM;
|
||||||
@ -935,7 +955,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
checkImageView.setColor(0xff3ccaef);
|
checkImageView.setColor(0xff3ccaef);
|
||||||
containerView.addView(checkImageView);
|
containerView.addView(checkImageView);
|
||||||
checkImageView.setVisibility(View.GONE);
|
checkImageView.setVisibility(View.GONE);
|
||||||
layoutParams = (FrameLayout.LayoutParams)checkImageView.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) checkImageView.getLayoutParams();
|
||||||
layoutParams.width = AndroidUtilities.dp(45);
|
layoutParams.width = AndroidUtilities.dp(45);
|
||||||
layoutParams.height = AndroidUtilities.dp(45);
|
layoutParams.height = AndroidUtilities.dp(45);
|
||||||
layoutParams.gravity = Gravity.RIGHT;
|
layoutParams.gravity = Gravity.RIGHT;
|
||||||
@ -963,13 +983,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
private void toggleCheckImageView(boolean show) {
|
private void toggleCheckImageView(boolean show) {
|
||||||
AnimatorSetProxy animatorSet = new AnimatorSetProxy();
|
AnimatorSetProxy animatorSet = new AnimatorSetProxy();
|
||||||
animatorSet.playTogether(
|
animatorSet.playTogether(
|
||||||
ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", show ? 1.0f : 0.0f)
|
ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", show ? 1.0f : 0.0f),
|
||||||
|
ObjectAnimatorProxy.ofFloat(pickerView, "alpha", show ? 1.0f : 0.0f)
|
||||||
);
|
);
|
||||||
animatorSet.setDuration(200);
|
animatorSet.setDuration(200);
|
||||||
animatorSet.start();
|
animatorSet.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toggleActionBar(boolean show, boolean animated) {
|
private void toggleActionBar(boolean show, final boolean animated) {
|
||||||
if (show) {
|
if (show) {
|
||||||
actionBar.setVisibility(View.VISIBLE);
|
actionBar.setVisibility(View.VISIBLE);
|
||||||
if (canShowBottom) {
|
if (canShowBottom) {
|
||||||
@ -981,25 +1002,28 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
bottomLayout.setEnabled(show);
|
bottomLayout.setEnabled(show);
|
||||||
|
|
||||||
if (animated) {
|
if (animated) {
|
||||||
AnimatorSetProxy animatorSet = new AnimatorSetProxy();
|
currentActionBarAnimation = new AnimatorSetProxy();
|
||||||
animatorSet.playTogether(
|
currentActionBarAnimation.playTogether(
|
||||||
ObjectAnimatorProxy.ofFloat(actionBar, "alpha", show ? 1.0f : 0.0f),
|
ObjectAnimatorProxy.ofFloat(actionBar, "alpha", show ? 1.0f : 0.0f),
|
||||||
ObjectAnimatorProxy.ofFloat(bottomLayout, "alpha", show ? 1.0f : 0.0f)
|
ObjectAnimatorProxy.ofFloat(bottomLayout, "alpha", show ? 1.0f : 0.0f)
|
||||||
);
|
);
|
||||||
if (!show) {
|
if (!show) {
|
||||||
animatorSet.addListener(new AnimatorListenerAdapterProxy() {
|
currentActionBarAnimation.addListener(new AnimatorListenerAdapterProxy() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Object animation) {
|
public void onAnimationEnd(Object animation) {
|
||||||
actionBar.setVisibility(View.GONE);
|
if (currentActionBarAnimation.equals(animation)) {
|
||||||
if (canShowBottom) {
|
actionBar.setVisibility(View.GONE);
|
||||||
bottomLayout.setVisibility(View.GONE);
|
if (canShowBottom) {
|
||||||
|
bottomLayout.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
currentActionBarAnimation = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
animatorSet.setDuration(200);
|
currentActionBarAnimation.setDuration(200);
|
||||||
animatorSet.start();
|
currentActionBarAnimation.start();
|
||||||
} else {
|
} else {
|
||||||
ViewProxy.setAlpha(actionBar, show ? 1.0f : 0.0f);
|
ViewProxy.setAlpha(actionBar, show ? 1.0f : 0.0f);
|
||||||
ViewProxy.setAlpha(bottomLayout, show ? 1.0f : 0.0f);
|
ViewProxy.setAlpha(bottomLayout, show ? 1.0f : 0.0f);
|
||||||
@ -1075,7 +1099,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (message.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
|
if (message.messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
|
||||||
return message.messageOwner.action.newUserPhoto.photo_big;
|
return message.messageOwner.action.newUserPhoto.photo_big;
|
||||||
} else {
|
} else {
|
||||||
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.messageOwner.action.photo.sizes, AndroidUtilities.getPhotoSize());
|
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
if (sizeFull != null) {
|
if (sizeFull != null) {
|
||||||
size[0] = sizeFull.size;
|
size[0] = sizeFull.size;
|
||||||
if (size[0] == 0) {
|
if (size[0] == 0) {
|
||||||
@ -1087,7 +1111,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && message.messageOwner.media.photo != null) {
|
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && message.messageOwner.media.photo != null) {
|
||||||
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.messageOwner.media.photo.sizes, AndroidUtilities.getPhotoSize());
|
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
if (sizeFull != null) {
|
if (sizeFull != null) {
|
||||||
size[0] = sizeFull.size;
|
size[0] = sizeFull.size;
|
||||||
if (size[0] == 0) {
|
if (size[0] == 0) {
|
||||||
@ -1138,7 +1162,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
location.secret = sizeFull.secret;
|
location.secret = sizeFull.secret;
|
||||||
return location;
|
return location;
|
||||||
} else {
|
} else {
|
||||||
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.messageOwner.action.photo.sizes, AndroidUtilities.getPhotoSize());
|
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
if (sizeFull != null) {
|
if (sizeFull != null) {
|
||||||
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
|
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
|
||||||
location.local_id = sizeFull.location.local_id;
|
location.local_id = sizeFull.location.local_id;
|
||||||
@ -1149,7 +1173,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
|
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) {
|
||||||
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.messageOwner.media.photo.sizes, AndroidUtilities.getPhotoSize());
|
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
if (sizeFull != null) {
|
if (sizeFull != null) {
|
||||||
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
|
TLRPC.TL_inputFileLocation location = new TLRPC.TL_inputFileLocation();
|
||||||
location.local_id = sizeFull.location.local_id;
|
location.local_id = sizeFull.location.local_id;
|
||||||
@ -1206,9 +1230,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
menuItem.setVisibility(View.VISIBLE);
|
menuItem.setVisibility(View.VISIBLE);
|
||||||
bottomLayout.setVisibility(View.VISIBLE);
|
bottomLayout.setVisibility(View.VISIBLE);
|
||||||
ViewProxy.setAlpha(checkImageView, 1.0f);
|
ViewProxy.setAlpha(checkImageView, 1.0f);
|
||||||
|
ViewProxy.setAlpha(pickerView, 1.0f);
|
||||||
checkImageView.clearAnimation();
|
checkImageView.clearAnimation();
|
||||||
|
pickerView.clearAnimation();
|
||||||
checkImageView.setVisibility(View.GONE);
|
checkImageView.setVisibility(View.GONE);
|
||||||
pickerView.setVisibility(View.GONE);
|
pickerView.setVisibility(View.GONE);
|
||||||
|
editItem.setVisibility(View.GONE);
|
||||||
for (int a = 0; a < 3; a++) {
|
for (int a = 0; a < 3; a++) {
|
||||||
if (radialProgressViews[a] != null) {
|
if (radialProgressViews[a] != null) {
|
||||||
radialProgressViews[a].setBackgroundState(-1, false);
|
radialProgressViews[a].setBackgroundState(-1, false);
|
||||||
@ -1284,17 +1311,26 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
bottomLayout.setVisibility(View.GONE);
|
bottomLayout.setVisibility(View.GONE);
|
||||||
shareButton.setVisibility(View.VISIBLE);
|
shareButton.setVisibility(View.VISIBLE);
|
||||||
canShowBottom = false;
|
canShowBottom = false;
|
||||||
|
//editItem.setVisibility(imagesArrLocals.get(index) instanceof MediaController.PhotoEntry ? View.VISIBLE : View.GONE);
|
||||||
updateSelectedCount();
|
updateSelectedCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentDialogId != 0 && totalImagesCount == 0) {
|
if (currentDialogId != 0 && totalImagesCount == 0) {
|
||||||
MessagesController.getInstance().getMediaCount(currentDialogId, classGuid, true);
|
SharedMediaQuery.getMediaCount(currentDialogId, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true);
|
||||||
} else if (avatarsUserId != 0) {
|
} else if (avatarsUserId != 0) {
|
||||||
MessagesController.getInstance().loadUserPhotos(avatarsUserId, 0, 80, 0, true, classGuid);
|
MessagesController.getInstance().loadUserPhotos(avatarsUserId, 0, 80, 0, true, classGuid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImageIndex(int index, boolean init) {
|
private void setImages() {
|
||||||
|
if (animationInProgress == 0) {
|
||||||
|
setIndexToImage(centerImage, currentIndex);
|
||||||
|
setIndexToImage(rightImage, currentIndex + 1);
|
||||||
|
setIndexToImage(leftImage, currentIndex - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setImageIndex(int index, boolean init) {
|
||||||
if (currentIndex == index) {
|
if (currentIndex == index) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1332,7 +1368,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (totalImagesCount != 0 && !needSearchImageInArr) {
|
if (totalImagesCount != 0 && !needSearchImageInArr) {
|
||||||
if (imagesArr.size() < totalImagesCount && !loadingMoreImages && currentIndex < 5) {
|
if (imagesArr.size() < totalImagesCount && !loadingMoreImages && currentIndex < 5) {
|
||||||
MessageObject lastMessage = imagesArr.get(0);
|
MessageObject lastMessage = imagesArr.get(0);
|
||||||
MessagesController.getInstance().loadMedia(currentDialogId, 0, 100, lastMessage.messageOwner.id, !cacheEndReached, classGuid);
|
SharedMediaQuery.loadMedia(currentDialogId, 0, 100, lastMessage.messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, !cacheEndReached, classGuid);
|
||||||
loadingMoreImages = true;
|
loadingMoreImages = true;
|
||||||
}
|
}
|
||||||
actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount));
|
actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount));
|
||||||
@ -1427,9 +1463,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (prevIndex == -1) {
|
if (prevIndex == -1) {
|
||||||
setIndexToImage(centerImage, currentIndex);
|
setImages();
|
||||||
setIndexToImage(rightImage, currentIndex + 1);
|
|
||||||
setIndexToImage(leftImage, currentIndex - 1);
|
|
||||||
|
|
||||||
for (int a = 0; a < 3; a++) {
|
for (int a = 0; a < 3; a++) {
|
||||||
checkProgress(a, false);
|
checkProgress(a, false);
|
||||||
@ -1553,6 +1587,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
|
|
||||||
private void setIndexToImage(ImageReceiver imageReceiver, int index) {
|
private void setIndexToImage(ImageReceiver imageReceiver, int index) {
|
||||||
if (!imagesArrLocals.isEmpty()) {
|
if (!imagesArrLocals.isEmpty()) {
|
||||||
|
imageReceiver.setParentMessageObject(null);
|
||||||
if (index >= 0 && index < imagesArrLocals.size()) {
|
if (index >= 0 && index < imagesArrLocals.size()) {
|
||||||
Object object = imagesArrLocals.get(index);
|
Object object = imagesArrLocals.get(index);
|
||||||
int size = (int) (AndroidUtilities.getPhotoSize() / AndroidUtilities.density);
|
int size = (int) (AndroidUtilities.getPhotoSize() / AndroidUtilities.density);
|
||||||
@ -1584,33 +1619,38 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (!imagesArr.isEmpty()) {
|
if (!imagesArr.isEmpty()) {
|
||||||
messageObject = imagesArr.get(index);
|
messageObject = imagesArr.get(index);
|
||||||
}
|
}
|
||||||
|
imageReceiver.setParentMessageObject(messageObject);
|
||||||
|
if (messageObject != null) {
|
||||||
|
imageReceiver.setShouldGenerateQualityThumb(true);
|
||||||
|
}
|
||||||
|
|
||||||
if (messageObject != null && messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
if (messageObject != null && messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) {
|
||||||
if (messageObject.imagePreview != null) {
|
imageReceiver.setNeedsQualityThumb(true);
|
||||||
imageReceiver.setImageBitmap(messageObject.imagePreview);
|
if (messageObject.messageOwner.media.video.thumb != null) {
|
||||||
} else if (messageObject.messageOwner.media.video.thumb != null) {
|
|
||||||
Bitmap placeHolder = null;
|
Bitmap placeHolder = null;
|
||||||
if (currentThumb != null && imageReceiver == centerImage) {
|
if (currentThumb != null && imageReceiver == centerImage) {
|
||||||
placeHolder = currentThumb;
|
placeHolder = currentThumb;
|
||||||
}
|
}
|
||||||
imageReceiver.setImage(fileLocation, null, placeHolder != null ? new BitmapDrawable(null, placeHolder) : null, 0, true);
|
TLRPC.PhotoSize thumbLocation = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 100);
|
||||||
|
imageReceiver.setImage(null, null, null, placeHolder != null ? new BitmapDrawable(null, placeHolder) : null, thumbLocation.location, "b", 0, true);
|
||||||
} else {
|
} else {
|
||||||
imageReceiver.setImageBitmap(parentActivity.getResources().getDrawable(R.drawable.photoview_placeholder));
|
imageReceiver.setImageBitmap(parentActivity.getResources().getDrawable(R.drawable.photoview_placeholder));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
imageReceiver.setNeedsQualityThumb(false);
|
||||||
Bitmap placeHolder = null;
|
Bitmap placeHolder = null;
|
||||||
if (messageObject != null) {
|
|
||||||
placeHolder = messageObject.imagePreview;
|
|
||||||
}
|
|
||||||
if (currentThumb != null && imageReceiver == centerImage) {
|
if (currentThumb != null && imageReceiver == centerImage) {
|
||||||
placeHolder = currentThumb;
|
placeHolder = currentThumb;
|
||||||
}
|
}
|
||||||
if (size[0] == 0) {
|
if (size[0] == 0) {
|
||||||
size[0] = -1;
|
size[0] = -1;
|
||||||
}
|
}
|
||||||
imageReceiver.setImage(fileLocation, null, placeHolder != null ? new BitmapDrawable(null, placeHolder) : null, size[0], avatarsUserId != 0);
|
TLRPC.PhotoSize thumbLocation = messageObject != null ? FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 100) : null;
|
||||||
|
imageReceiver.setImage(fileLocation, null, null, placeHolder != null ? new BitmapDrawable(null, placeHolder) : null, thumbLocation != null ? thumbLocation.location : null, "b", size[0], avatarsUserId != 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
imageReceiver.setNeedsQualityThumb(false);
|
||||||
|
imageReceiver.setParentMessageObject(null);
|
||||||
if (size[0] == 0) {
|
if (size[0] == 0) {
|
||||||
imageReceiver.setImageBitmap((Bitmap) null);
|
imageReceiver.setImageBitmap((Bitmap) null);
|
||||||
} else {
|
} else {
|
||||||
@ -1776,6 +1816,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
animationInProgress = 0;
|
animationInProgress = 0;
|
||||||
|
setImages();
|
||||||
transitionAnimationStartTime = 0;
|
transitionAnimationStartTime = 0;
|
||||||
containerView.invalidate();
|
containerView.invalidate();
|
||||||
animatingImageView.setVisibility(View.GONE);
|
animatingImageView.setVisibility(View.GONE);
|
||||||
@ -1843,7 +1884,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
|
|
||||||
final PlaceProviderObject object = placeProvider.getPlaceForPhoto(currentMessageObject, currentFileLocation, currentIndex);
|
final PlaceProviderObject object = placeProvider.getPlaceForPhoto(currentMessageObject, currentFileLocation, currentIndex);
|
||||||
|
|
||||||
if(animated) {
|
if (animated) {
|
||||||
AndroidUtilities.lockOrientation(parentActivity);
|
AndroidUtilities.lockOrientation(parentActivity);
|
||||||
|
|
||||||
animationInProgress = 1;
|
animationInProgress = 1;
|
||||||
@ -1948,48 +1989,36 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
transitionAnimationStartTime = System.currentTimeMillis();
|
transitionAnimationStartTime = System.currentTimeMillis();
|
||||||
animatorSet.start();
|
animatorSet.start();
|
||||||
} else {
|
} else {
|
||||||
AnimationSet animationSet = new AnimationSet(true);
|
AnimatorSetProxy animatorSet = new AnimatorSetProxy();
|
||||||
AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
|
animatorSet.playTogether(
|
||||||
animation.setDuration(150);
|
ObjectAnimatorProxy.ofFloat(containerView, "scaleX", 0.9f),
|
||||||
animation.setFillAfter(false);
|
ObjectAnimatorProxy.ofFloat(containerView, "scaleY", 0.9f),
|
||||||
animationSet.addAnimation(animation);
|
ObjectAnimatorProxy.ofInt(backgroundDrawable, "alpha", 0),
|
||||||
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.9f, 1.0f, 0.9f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
|
ObjectAnimatorProxy.ofFloat(containerView, "alpha", 0.0f)
|
||||||
scaleAnimation.setDuration(150);
|
);
|
||||||
scaleAnimation.setFillAfter(false);
|
|
||||||
animationSet.addAnimation(scaleAnimation);
|
|
||||||
animationSet.setDuration(150);
|
|
||||||
animationInProgress = 2;
|
animationInProgress = 2;
|
||||||
animationEndRunnable = new Runnable() {
|
animationEndRunnable = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (animationListener != null) {
|
animationInProgress = 0;
|
||||||
animationInProgress = 0;
|
onPhotoClosed(object);
|
||||||
onPhotoClosed(object);
|
ViewProxy.setScaleX(containerView, 1.0f);
|
||||||
animationListener = null;
|
ViewProxy.setScaleY(containerView, 1.0f);
|
||||||
}
|
containerView.clearAnimation();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
animationSet.setAnimationListener(animationListener = new Animation.AnimationListener() {
|
animatorSet.setDuration(200);
|
||||||
|
animatorSet.addListener(new AnimatorListenerAdapterProxy() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(Animation animation) {
|
public void onAnimationEnd(Object animation) {
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAnimationEnd(Animation animation) {
|
|
||||||
if (animationEndRunnable != null) {
|
if (animationEndRunnable != null) {
|
||||||
animationEndRunnable.run();
|
animationEndRunnable.run();
|
||||||
animationEndRunnable = null;
|
animationEndRunnable = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAnimationRepeat(Animation animation) {
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
transitionAnimationStartTime = System.currentTimeMillis();
|
transitionAnimationStartTime = System.currentTimeMillis();
|
||||||
containerView.startAnimation(animationSet);
|
animatorSet.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2025,9 +2054,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
radialProgressViews[a].setBackgroundState(-1, false);
|
radialProgressViews[a].setBackgroundState(-1, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
centerImage.setImageBitmap((Bitmap)null);
|
centerImage.setImageBitmap((Bitmap) null);
|
||||||
leftImage.setImageBitmap((Bitmap)null);
|
leftImage.setImageBitmap((Bitmap) null);
|
||||||
rightImage.setImageBitmap((Bitmap)null);
|
rightImage.setImageBitmap((Bitmap) null);
|
||||||
containerView.post(new Runnable() {
|
containerView.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -2081,7 +2110,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ev.getPointerCount() == 1 && gestureDetector.onTouchEvent(ev)) {
|
if (ev.getPointerCount() == 1 && gestureDetector.onTouchEvent(ev)) {
|
||||||
if (doubleTap) {
|
if (doubleTap) {
|
||||||
doubleTap = false;
|
doubleTap = false;
|
||||||
moving = false;
|
moving = false;
|
||||||
@ -2121,9 +2150,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
|
} else if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
|
||||||
discardTap = true;
|
|
||||||
if (canZoom && ev.getPointerCount() == 2 && !draggingDown && zooming && !changingPage) {
|
if (canZoom && ev.getPointerCount() == 2 && !draggingDown && zooming && !changingPage) {
|
||||||
scale = (float)Math.hypot(ev.getX(1) - ev.getX(0), ev.getY(1) - ev.getY(0)) / pinchStartDistance * pinchStartScale;
|
discardTap = true;
|
||||||
|
scale = (float) Math.hypot(ev.getX(1) - ev.getX(0), ev.getY(1) - ev.getY(0)) / pinchStartDistance * pinchStartScale;
|
||||||
translationX = (pinchCenterX - containerView.getWidth() / 2) - ((pinchCenterX - containerView.getWidth() / 2) - pinchStartX) * (scale / pinchStartScale);
|
translationX = (pinchCenterX - containerView.getWidth() / 2) - ((pinchCenterX - containerView.getWidth() / 2) - pinchStartX) * (scale / pinchStartScale);
|
||||||
translationY = (pinchCenterY - containerView.getHeight() / 2) - ((pinchCenterY - containerView.getHeight() / 2) - pinchStartY) * (scale / pinchStartScale);
|
translationY = (pinchCenterY - containerView.getHeight() / 2) - ((pinchCenterY - containerView.getHeight() / 2) - pinchStartY) * (scale / pinchStartScale);
|
||||||
updateMinMax(scale);
|
updateMinMax(scale);
|
||||||
@ -2134,6 +2163,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
}
|
}
|
||||||
float dx = Math.abs(ev.getX() - moveStartX);
|
float dx = Math.abs(ev.getX() - moveStartX);
|
||||||
float dy = Math.abs(ev.getY() - dragY);
|
float dy = Math.abs(ev.getY() - dragY);
|
||||||
|
if (dx > AndroidUtilities.dp(3) || dy > AndroidUtilities.dp(3)) {
|
||||||
|
discardTap = true;
|
||||||
|
}
|
||||||
if (canDragDown && !draggingDown && scale == 1 && dy >= AndroidUtilities.dp(30) && dy / 2 > dx) {
|
if (canDragDown && !draggingDown && scale == 1 && dy >= AndroidUtilities.dp(30) && dy / 2 > dx) {
|
||||||
draggingDown = true;
|
draggingDown = true;
|
||||||
moving = false;
|
moving = false;
|
||||||
@ -2141,6 +2173,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (isActionBarVisible && canShowBottom) {
|
if (isActionBarVisible && canShowBottom) {
|
||||||
toggleActionBar(false, true);
|
toggleActionBar(false, true);
|
||||||
} else if (checkImageView.getVisibility() == View.VISIBLE) {
|
} else if (checkImageView.getVisibility() == View.VISIBLE) {
|
||||||
|
toggleActionBar(false, true);
|
||||||
toggleCheckImageView(false);
|
toggleCheckImageView(false);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -2197,7 +2230,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
if (scale < 1.0f) {
|
if (scale < 1.0f) {
|
||||||
updateMinMax(1.0f);
|
updateMinMax(1.0f);
|
||||||
animateTo(1.0f, 0, 0, true);
|
animateTo(1.0f, 0, 0, true);
|
||||||
} else if(scale > 3.0f) {
|
} else if (scale > 3.0f) {
|
||||||
float atx = (pinchCenterX - containerView.getWidth() / 2) - ((pinchCenterX - containerView.getWidth() / 2) - pinchStartX) * (3.0f / pinchStartScale);
|
float atx = (pinchCenterX - containerView.getWidth() / 2) - ((pinchCenterX - containerView.getWidth() / 2) - pinchStartX) * (3.0f / pinchStartScale);
|
||||||
float aty = (pinchCenterY - containerView.getHeight() / 2) - ((pinchCenterY - containerView.getHeight() / 2) - pinchStartY) * (3.0f / pinchStartScale);
|
float aty = (pinchCenterY - containerView.getHeight() / 2) - ((pinchCenterY - containerView.getHeight() / 2) - pinchStartY) * (3.0f / pinchStartScale);
|
||||||
updateMinMax(3.0f);
|
updateMinMax(3.0f);
|
||||||
@ -2221,6 +2254,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
closePhoto(true);
|
closePhoto(true);
|
||||||
} else {
|
} else {
|
||||||
if (checkImageView.getVisibility() == View.VISIBLE) {
|
if (checkImageView.getVisibility() == View.VISIBLE) {
|
||||||
|
toggleActionBar(true, true);
|
||||||
toggleCheckImageView(true);
|
toggleCheckImageView(true);
|
||||||
}
|
}
|
||||||
animateTo(1, 0, 0);
|
animateTo(1, 0, 0);
|
||||||
@ -2238,11 +2272,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
velocity = velocityTracker.getXVelocity();
|
velocity = velocityTracker.getXVelocity();
|
||||||
}
|
}
|
||||||
|
|
||||||
if((translationX < minX - containerView.getWidth() / 3 || velocity < -AndroidUtilities.dp(650)) && rightImage.hasImage()){
|
if ((translationX < minX - containerView.getWidth() / 3 || velocity < -AndroidUtilities.dp(650)) && rightImage.hasImage()) {
|
||||||
goToNext();
|
goToNext();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if((translationX > maxX + containerView.getWidth() / 3 || velocity > AndroidUtilities.dp(650)) && leftImage.hasImage()){
|
if ((translationX > maxX + containerView.getWidth() / 3 || velocity > AndroidUtilities.dp(650)) && leftImage.hasImage()) {
|
||||||
goToPrev();
|
goToPrev();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2331,7 +2365,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
float ai = -1;
|
float ai = -1;
|
||||||
|
|
||||||
if (System.currentTimeMillis() - animationStartTime < animationDuration) {
|
if (System.currentTimeMillis() - animationStartTime < animationDuration) {
|
||||||
ai = interpolator.getInterpolation((float)(System.currentTimeMillis() - animationStartTime) / animationDuration);
|
ai = interpolator.getInterpolation((float) (System.currentTimeMillis() - animationStartTime) / animationDuration);
|
||||||
if (ai >= 1.0f) {
|
if (ai >= 1.0f) {
|
||||||
ai = -1;
|
ai = -1;
|
||||||
}
|
}
|
||||||
@ -2475,7 +2509,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
|
|
||||||
if (gifDrawable != null) {
|
if (gifDrawable != null) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
gifDrawable.setAlpha((int)(alpha * 255));
|
gifDrawable.setAlpha((int) (alpha * 255));
|
||||||
gifDrawable.setBounds(-width / 2, -height / 2, width / 2, height / 2);
|
gifDrawable.setBounds(-width / 2, -height / 2, width / 2, height / 2);
|
||||||
gifDrawable.draw(canvas);
|
gifDrawable.draw(canvas);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
@ -2526,7 +2560,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
|
|
||||||
@SuppressLint("DrawAllocation")
|
@SuppressLint("DrawAllocation")
|
||||||
private void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
private void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||||
if(changed) {
|
if (changed) {
|
||||||
scale = 1;
|
scale = 1;
|
||||||
translationX = 0;
|
translationX = 0;
|
||||||
translationY = 0;
|
translationY = 0;
|
||||||
@ -2537,8 +2571,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
|||||||
@Override
|
@Override
|
||||||
public boolean onPreDraw() {
|
public boolean onPreDraw() {
|
||||||
checkImageView.getViewTreeObserver().removeOnPreDrawListener(this);
|
checkImageView.getViewTreeObserver().removeOnPreDrawListener(this);
|
||||||
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)checkImageView.getLayoutParams();
|
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) checkImageView.getLayoutParams();
|
||||||
WindowManager manager = (WindowManager)ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE);
|
WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE);
|
||||||
int rotation = manager.getDefaultDisplay().getRotation();
|
int rotation = manager.getDefaultDisplay().getRotation();
|
||||||
if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) {
|
if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) {
|
||||||
layoutParams.topMargin = AndroidUtilities.dp(58);
|
layoutParams.topMargin = AndroidUtilities.dp(58);
|
||||||
|
@ -13,6 +13,7 @@ import android.app.KeyguardManager;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@ -45,7 +46,6 @@ import org.telegram.android.NotificationCenter;
|
|||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
import org.telegram.android.MessageObject;
|
import org.telegram.android.MessageObject;
|
||||||
import org.telegram.android.PhotoObject;
|
|
||||||
import org.telegram.ui.ActionBar.ActionBar;
|
import org.telegram.ui.ActionBar.ActionBar;
|
||||||
import org.telegram.ui.ActionBar.ActionBarMenu;
|
import org.telegram.ui.ActionBar.ActionBarMenu;
|
||||||
import org.telegram.ui.Components.AvatarDrawable;
|
import org.telegram.ui.Components.AvatarDrawable;
|
||||||
@ -524,7 +524,8 @@ public class PopupNotificationActivity extends Activity implements NotificationC
|
|||||||
imageView.imageReceiver.setAspectFit(true);
|
imageView.imageReceiver.setAspectFit(true);
|
||||||
|
|
||||||
if (messageObject.type == 1) {
|
if (messageObject.type == 1) {
|
||||||
PhotoObject currentPhotoObject = PhotoObject.getClosestImageWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
TLRPC.PhotoSize currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
|
TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 100);
|
||||||
boolean photoSet = false;
|
boolean photoSet = false;
|
||||||
if (currentPhotoObject != null) {
|
if (currentPhotoObject != null) {
|
||||||
boolean photoExist = true;
|
boolean photoExist = true;
|
||||||
@ -535,11 +536,11 @@ public class PopupNotificationActivity extends Activity implements NotificationC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (photoExist || MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_PHOTO)) {
|
if (photoExist || MediaController.getInstance().canDownloadMedia(MediaController.AUTODOWNLOAD_MASK_PHOTO)) {
|
||||||
imageView.setImage(currentPhotoObject.photoOwner.location, "100_100", messageObject.imagePreview, currentPhotoObject.photoOwner.size);
|
imageView.setImage(currentPhotoObject.location, "100_100", thumb.location, currentPhotoObject.size);
|
||||||
photoSet = true;
|
photoSet = true;
|
||||||
} else {
|
} else {
|
||||||
if (messageObject.imagePreview != null) {
|
if (thumb != null) {
|
||||||
imageView.setImageBitmap(messageObject.imagePreview);
|
imageView.setImage(thumb.location, null, (Drawable) null);
|
||||||
photoSet = true;
|
photoSet = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,15 @@
|
|||||||
|
|
||||||
package org.telegram.ui;
|
package org.telegram.ui;
|
||||||
|
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
|
import android.animation.StateListAnimator;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Outline;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -24,6 +27,7 @@ import android.view.Gravity;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewOutlineProvider;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.widget.AbsListView;
|
import android.widget.AbsListView;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
@ -38,6 +42,7 @@ import org.telegram.android.LocaleController;
|
|||||||
import org.telegram.android.MessagesStorage;
|
import org.telegram.android.MessagesStorage;
|
||||||
import org.telegram.android.SecretChatHelper;
|
import org.telegram.android.SecretChatHelper;
|
||||||
import org.telegram.android.SendMessagesHelper;
|
import org.telegram.android.SendMessagesHelper;
|
||||||
|
import org.telegram.android.query.SharedMediaQuery;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.ConnectionsManager;
|
import org.telegram.messenger.ConnectionsManager;
|
||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
@ -170,14 +175,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatInfoDidLoaded);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.chatInfoDidLoaded);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.closeChats);
|
|
||||||
|
|
||||||
sortedUsers = new ArrayList<>();
|
sortedUsers = new ArrayList<>();
|
||||||
updateOnlineCount();
|
updateOnlineCount();
|
||||||
if (chat_id > 0) {
|
if (chat_id > 0) {
|
||||||
MessagesController.getInstance().getMediaCount(-chat_id, classGuid, true);
|
SharedMediaQuery.getMediaCount(-chat_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
avatarUpdater = new AvatarUpdater();
|
avatarUpdater = new AvatarUpdater();
|
||||||
@ -196,6 +199,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
|
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.mediaCountDidLoaded);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.mediaCountDidLoaded);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateInterfaces);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateInterfaces);
|
||||||
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.closeChats);
|
||||||
updateRowsIds();
|
updateRowsIds();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -206,6 +210,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
super.onFragmentDestroy();
|
super.onFragmentDestroy();
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.mediaCountDidLoaded);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.mediaCountDidLoaded);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces);
|
||||||
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
|
||||||
if (user_id != 0) {
|
if (user_id != 0) {
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.encryptedChatCreated);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.encryptedChatCreated);
|
||||||
@ -214,7 +219,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
MessagesController.getInstance().cancelLoadFullUser(user_id);
|
MessagesController.getInstance().cancelLoadFullUser(user_id);
|
||||||
} else if (chat_id != 0) {
|
} else if (chat_id != 0) {
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatInfoDidLoaded);
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatInfoDidLoaded);
|
||||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
|
|
||||||
avatarUpdater.clear();
|
avatarUpdater.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -547,21 +551,36 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (dialog_id != 0) {
|
if (dialog_id != 0) {
|
||||||
MessagesController.getInstance().getMediaCount(dialog_id, classGuid, true);
|
SharedMediaQuery.getMediaCount(dialog_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true);
|
||||||
} else {
|
} else {
|
||||||
MessagesController.getInstance().getMediaCount(user_id, classGuid, true);
|
SharedMediaQuery.getMediaCount(user_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, classGuid, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
frameLayout.addView(actionBar);
|
frameLayout.addView(actionBar);
|
||||||
|
|
||||||
if (user_id != 0 || chat_id >= 0 && !currentChat.left) {
|
if (user_id != 0 || chat_id >= 0 && !currentChat.left) {
|
||||||
writeButton = new ImageView(getParentActivity());
|
writeButton = new ImageView(getParentActivity());
|
||||||
|
writeButton.setBackgroundResource(R.drawable.floating_user_states);
|
||||||
|
writeButton.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
if (user_id != 0) {
|
if (user_id != 0) {
|
||||||
writeButton.setImageResource(R.drawable.floating_user_states);
|
writeButton.setImageResource(R.drawable.floating_message);
|
||||||
|
writeButton.setPadding(0, AndroidUtilities.dp(3), 0, 0);
|
||||||
} else if (chat_id != 0) {
|
} else if (chat_id != 0) {
|
||||||
writeButton.setImageResource(R.drawable.floating_group_states);
|
writeButton.setImageResource(R.drawable.floating_camera);
|
||||||
}
|
}
|
||||||
frameLayout.addView(writeButton);
|
frameLayout.addView(writeButton);
|
||||||
|
if (Build.VERSION.SDK_INT >= 21) {
|
||||||
|
StateListAnimator animator = new StateListAnimator();
|
||||||
|
animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200));
|
||||||
|
animator.addState(new int[] {}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200));
|
||||||
|
writeButton.setStateListAnimator(animator);
|
||||||
|
writeButton.setOutlineProvider(new ViewOutlineProvider() {
|
||||||
|
@Override
|
||||||
|
public void getOutline(View view, Outline outline) {
|
||||||
|
outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT;
|
layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT;
|
||||||
layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;
|
layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;
|
||||||
@ -580,6 +599,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
if (user == null || user instanceof TLRPC.TL_userEmpty) {
|
if (user == null || user instanceof TLRPC.TL_userEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
NotificationCenter.getInstance().removeObserver(ProfileActivity.this, NotificationCenter.closeChats);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putInt("user_id", user_id);
|
args.putInt("user_id", user_id);
|
||||||
@ -814,6 +834,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
NotificationCenter.getInstance().removeObserver(ProfileActivity.this, NotificationCenter.closeChats);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
||||||
TLRPC.EncryptedChat encryptedChat = (TLRPC.EncryptedChat) args[0];
|
TLRPC.EncryptedChat encryptedChat = (TLRPC.EncryptedChat) args[0];
|
||||||
Bundle args2 = new Bundle();
|
Bundle args2 = new Bundle();
|
||||||
@ -1082,7 +1103,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
AvatarDrawable avatarDrawable = new AvatarDrawable(user);
|
AvatarDrawable avatarDrawable = new AvatarDrawable(user);
|
||||||
avatarImage.setImage(photo, "50_50", avatarDrawable);
|
avatarImage.setImage(photo, "50_50", avatarDrawable);
|
||||||
|
|
||||||
nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name));
|
if (user instanceof TLRPC.TL_userDeleted) {
|
||||||
|
nameTextView.setText(LocaleController.getString("HiddenName", R.string.HiddenName));
|
||||||
|
} else {
|
||||||
|
nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name));
|
||||||
|
}
|
||||||
onlineTextView.setText(LocaleController.formatUserStatus(user));
|
onlineTextView.setText(LocaleController.formatUserStatus(user));
|
||||||
|
|
||||||
avatarImage.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false);
|
avatarImage.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false);
|
||||||
@ -1166,6 +1191,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||||||
if (dialog_id != 0) {
|
if (dialog_id != 0) {
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putBoolean("scrollToTopOnResume", true);
|
args.putBoolean("scrollToTopOnResume", true);
|
||||||
|
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
|
||||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
||||||
int lower_part = (int)dialog_id;
|
int lower_part = (int)dialog_id;
|
||||||
if (lower_part != 0) {
|
if (lower_part != 0) {
|
||||||
|
@ -30,14 +30,13 @@ import android.widget.ListView;
|
|||||||
import org.telegram.android.AndroidUtilities;
|
import org.telegram.android.AndroidUtilities;
|
||||||
import org.telegram.android.MessagesController;
|
import org.telegram.android.MessagesController;
|
||||||
import org.telegram.android.MessagesStorage;
|
import org.telegram.android.MessagesStorage;
|
||||||
|
import org.telegram.android.NotificationsController;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.ConnectionsManager;
|
import org.telegram.messenger.ConnectionsManager;
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.android.LocaleController;
|
import org.telegram.android.LocaleController;
|
||||||
import org.telegram.android.NotificationCenter;
|
import org.telegram.android.NotificationCenter;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.RPCRequest;
|
|
||||||
import org.telegram.messenger.TLObject;
|
|
||||||
import org.telegram.messenger.TLRPC;
|
import org.telegram.messenger.TLRPC;
|
||||||
import org.telegram.ui.Adapters.BaseFragmentAdapter;
|
import org.telegram.ui.Adapters.BaseFragmentAdapter;
|
||||||
import org.telegram.ui.Cells.TextColorCell;
|
import org.telegram.ui.Cells.TextColorCell;
|
||||||
@ -162,18 +161,23 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
|||||||
LocaleController.getString("Disabled", R.string.Disabled)
|
LocaleController.getString("Disabled", R.string.Disabled)
|
||||||
}, new DialogInterface.OnClickListener() {
|
}, new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface d, int which) {
|
||||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||||
SharedPreferences.Editor editor = preferences.edit();
|
SharedPreferences.Editor editor = preferences.edit();
|
||||||
editor.putInt("notify2_" + dialog_id, which);
|
editor.putInt("notify2_" + dialog_id, which);
|
||||||
MessagesStorage.getInstance().setDialogFlags(dialog_id, which == 2 ? 1 : 0);
|
MessagesStorage.getInstance().setDialogFlags(dialog_id, which == 2 ? 1 : 0);
|
||||||
editor.commit();
|
editor.commit();
|
||||||
|
TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id);
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.notify_settings = new TLRPC.TL_peerNotifySettings();
|
||||||
|
if (which == 2) {
|
||||||
|
dialog.notify_settings.mute_until = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (listView != null) {
|
if (listView != null) {
|
||||||
listView.invalidateViews();
|
listView.invalidateViews();
|
||||||
}
|
}
|
||||||
if (i == settingsNotificationsRow) {
|
NotificationsController.updateServerNotificationsSettings(dialog_id);
|
||||||
updateServerNotificationsSettings();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||||
@ -298,45 +302,6 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
|||||||
return fragmentView;
|
return fragmentView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateServerNotificationsSettings() {
|
|
||||||
if ((int)dialog_id == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
|
||||||
TLRPC.TL_account_updateNotifySettings req = new TLRPC.TL_account_updateNotifySettings();
|
|
||||||
req.settings = new TLRPC.TL_inputPeerNotifySettings();
|
|
||||||
req.settings.sound = "default";
|
|
||||||
req.settings.events_mask = 0;
|
|
||||||
req.settings.mute_until = preferences.getInt("notify2_" + dialog_id, 0) != 2 ? 0 : Integer.MAX_VALUE;
|
|
||||||
req.settings.show_previews = preferences.getBoolean("preview_" + dialog_id, true);
|
|
||||||
|
|
||||||
req.peer = new TLRPC.TL_inputNotifyPeer();
|
|
||||||
|
|
||||||
if ((int)dialog_id < 0) {
|
|
||||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerChat();
|
|
||||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer.chat_id = -(int)dialog_id;
|
|
||||||
} else {
|
|
||||||
TLRPC.User user = MessagesController.getInstance().getUser((int)dialog_id);
|
|
||||||
if (user == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) {
|
|
||||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerForeign();
|
|
||||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer.access_hash = user.access_hash;
|
|
||||||
} else {
|
|
||||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerContact();
|
|
||||||
}
|
|
||||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer.user_id = (int)dialog_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
|
||||||
@Override
|
|
||||||
public void run(TLObject response, TLRPC.TL_error error) {
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
|
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
@ -451,6 +416,19 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
|||||||
textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Enabled", R.string.Enabled), true);
|
textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Enabled", R.string.Enabled), true);
|
||||||
} else if (value == 2) {
|
} else if (value == 2) {
|
||||||
textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Disabled", R.string.Disabled), true);
|
textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Disabled", R.string.Disabled), true);
|
||||||
|
} else if (value == 3) {
|
||||||
|
int delta = preferences.getInt("notifyuntil_" + dialog_id, 0) - ConnectionsManager.getInstance().getCurrentTime();
|
||||||
|
String val;
|
||||||
|
if (delta <= 0) {
|
||||||
|
val = LocaleController.getString("Enabled", R.string.Enabled);
|
||||||
|
} else if (delta < 60 * 60) {
|
||||||
|
val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Minutes", delta / 60));
|
||||||
|
} else if (delta < 60 * 60 * 24) {
|
||||||
|
val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Hours", (int) Math.ceil(delta / 60.0f / 60)));
|
||||||
|
} else {
|
||||||
|
val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Days", (int) Math.ceil(delta / 60.0f / 60 / 24)));
|
||||||
|
}
|
||||||
|
textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), val, true);
|
||||||
}
|
}
|
||||||
} else if (i == settingsSoundRow) {
|
} else if (i == settingsSoundRow) {
|
||||||
String value = preferences.getString("sound_" + dialog_id, LocaleController.getString("Default", R.string.Default));
|
String value = preferences.getString("sound_" + dialog_id, LocaleController.getString("Default", R.string.Default));
|
||||||
|
@ -256,12 +256,12 @@ public class SecretPhotoViewer implements NotificationCenter.NotificationCenterD
|
|||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesDeleted);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesDeleted);
|
||||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didCreatedNewDeleteTask);
|
NotificationCenter.getInstance().addObserver(this, NotificationCenter.didCreatedNewDeleteTask);
|
||||||
|
|
||||||
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(messageObject.messageOwner.media.photo.sizes, AndroidUtilities.getPhotoSize());
|
TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize());
|
||||||
int size = sizeFull.size;
|
int size = sizeFull.size;
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
size = -1;
|
size = -1;
|
||||||
}
|
}
|
||||||
BitmapDrawable drawable = ImageLoader.getInstance().getImageFromMemory(sizeFull.location, null, null, null);
|
BitmapDrawable drawable = ImageLoader.getInstance().getImageFromMemory(sizeFull.location, null, null);
|
||||||
if (drawable == null) {
|
if (drawable == null) {
|
||||||
File file = FileLoader.getPathToAttach(sizeFull);
|
File file = FileLoader.getPathToAttach(sizeFull);
|
||||||
Bitmap bitmap = null;
|
Bitmap bitmap = null;
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
package org.telegram.ui;
|
package org.telegram.ui;
|
||||||
|
|
||||||
|
import android.animation.ObjectAnimator;
|
||||||
|
import android.animation.StateListAnimator;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
@ -18,7 +20,9 @@ import android.content.SharedPreferences;
|
|||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Outline;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
@ -31,6 +35,7 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewOutlineProvider;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.widget.AbsListView;
|
import android.widget.AbsListView;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
@ -596,7 +601,21 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
|
|||||||
frameLayout.addView(actionBar);
|
frameLayout.addView(actionBar);
|
||||||
|
|
||||||
writeButton = new ImageView(getParentActivity());
|
writeButton = new ImageView(getParentActivity());
|
||||||
writeButton.setImageResource(R.drawable.floating_group_states);
|
writeButton.setBackgroundResource(R.drawable.floating_user_states);
|
||||||
|
writeButton.setImageResource(R.drawable.floating_camera);
|
||||||
|
writeButton.setScaleType(ImageView.ScaleType.CENTER);
|
||||||
|
if (Build.VERSION.SDK_INT >= 21) {
|
||||||
|
StateListAnimator animator = new StateListAnimator();
|
||||||
|
animator.addState(new int[] {android.R.attr.state_pressed}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200));
|
||||||
|
animator.addState(new int[] {}, ObjectAnimator.ofFloat(writeButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200));
|
||||||
|
writeButton.setStateListAnimator(animator);
|
||||||
|
writeButton.setOutlineProvider(new ViewOutlineProvider() {
|
||||||
|
@Override
|
||||||
|
public void getOutline(View view, Outline outline) {
|
||||||
|
outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
frameLayout.addView(writeButton);
|
frameLayout.addView(writeButton);
|
||||||
layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams();
|
layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams();
|
||||||
layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT;
|
layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT;
|
||||||
|
@ -225,7 +225,7 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent
|
|||||||
Utilities.addMediaToGallery(currentPicturePath);
|
Utilities.addMediaToGallery(currentPicturePath);
|
||||||
try {
|
try {
|
||||||
Point screenSize = AndroidUtilities.getRealScreenSize();
|
Point screenSize = AndroidUtilities.getRealScreenSize();
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(currentPicturePath, null, screenSize.x, screenSize.y);
|
Bitmap bitmap = ImageLoader.loadBitmap(currentPicturePath, null, screenSize.x, screenSize.y, true);
|
||||||
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg");
|
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg");
|
||||||
FileOutputStream stream = new FileOutputStream(toFile);
|
FileOutputStream stream = new FileOutputStream(toFile);
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);
|
||||||
@ -242,7 +242,7 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Point screenSize = AndroidUtilities.getRealScreenSize();
|
Point screenSize = AndroidUtilities.getRealScreenSize();
|
||||||
Bitmap bitmap = ImageLoader.loadBitmap(null, data.getData(), screenSize.x, screenSize.y);
|
Bitmap bitmap = ImageLoader.loadBitmap(null, data.getData(), screenSize.x, screenSize.y, true);
|
||||||
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg");
|
File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper-temp.jpg");
|
||||||
FileOutputStream stream = new FileOutputStream(toFile);
|
FileOutputStream stream = new FileOutputStream(toFile);
|
||||||
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);
|
||||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.4 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/floating3_profile_m.png
Executable file
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 4.3 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/floating_camera.png
Executable file
After Width: | Height: | Size: 1.4 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/floating_m.png
Executable file
After Width: | Height: | Size: 2.2 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/floating_message.png
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/floating_pencil.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.7 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/ic_arrow_drop_down.png
Executable file
After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 227 B After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 373 B After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 1.6 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/ic_storage_gallery.png
Executable file
After Width: | Height: | Size: 1.9 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/media_doc_blue.png
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/media_doc_green.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/media_doc_load.png
Executable file
After Width: | Height: | Size: 1022 B |
BIN
TMessagesProj/src/main/res/drawable-hdpi/media_doc_pause.png
Executable file
After Width: | Height: | Size: 951 B |
BIN
TMessagesProj/src/main/res/drawable-hdpi/media_doc_red.png
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/media_doc_yellow.png
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/mute_blue.png
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/mute_grey.png
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_crop.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_edit.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_filters.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_rotate.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_sizes.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_tune.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/photo_tune_active.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/tip1.png
Executable file
After Width: | Height: | Size: 14 KiB |
BIN
TMessagesProj/src/main/res/drawable-hdpi/tip2.png
Executable file
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.5 KiB |