From 1c74ed4587f9a7e086067165eaea0532a6c33cae Mon Sep 17 00:00:00 2001 From: DrKLO Date: Mon, 25 Apr 2016 22:26:41 +0300 Subject: [PATCH] Bug fixes --- .../org/telegram/messenger/ImageLoader.java | 2 +- .../org/telegram/messenger/MessageObject.java | 2 + .../messenger/SendMessagesHelper.java | 46 +++++----- .../ui/ActionBar/ActionBarLayout.java | 63 +++++++++++++- .../telegram/ui/ActionBar/ActionBarMenu.java | 5 +- .../telegram/ui/ActionBar/BottomSheet.java | 34 +++++--- .../java/org/telegram/ui/ActionBar/Theme.java | 18 ++-- .../org/telegram/ui/AudioSelectActivity.java | 2 +- .../telegram/ui/Cells/ChatMessageCell.java | 12 ++- .../java/org/telegram/ui/ChatActivity.java | 24 ++---- .../ui/Components/ChatAttachView.java | 24 ++---- .../ui/Components/WebFrameLayout.java | 86 +++++++++++++++++-- .../java/org/telegram/ui/LaunchActivity.java | 6 +- .../java/org/telegram/ui/LoginActivity.java | 2 +- 14 files changed, 232 insertions(+), 94 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java index 079514d34..7f38c91a9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java @@ -1191,8 +1191,8 @@ public class ImageLoader { AndroidUtilities.addMediaToGallery(finalFile.toString()); } } - ImageLoader.this.fileDidLoaded(location, finalFile, type); NotificationCenter.getInstance().postNotificationName(NotificationCenter.FileDidLoaded, location); + ImageLoader.this.fileDidLoaded(location, finalFile, type); } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 234a5f8a5..0bff8975a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -1673,6 +1673,8 @@ public class MessageObject { public void checkMediaExistance() { File cacheFile = null; + attachPathExists = false; + mediaExists = false; if (type == 1) { TLRPC.PhotoSize currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(photoThumbs, AndroidUtilities.getPhotoSize()); if (currentPhotoObject != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java index 30f1b95e0..1af40c081 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java @@ -268,18 +268,18 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (file != null && media != null) { if (message.type == 0) { media.file = file; - performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath); + performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } else if (message.type == 1) { if (media.file == null) { media.file = file; if (media.thumb == null && message.location != null) { performSendDelayedMessage(message); } else { - performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath); + performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } } else { media.thumb = file; - performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath); + performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } } else if (message.type == 2) { if (media.file == null) { @@ -287,15 +287,15 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (media.thumb == null && message.location != null) { performSendDelayedMessage(message); } else { - performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath); + performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } } else { media.thumb = file; - performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath); + performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } } else if (message.type == 3) { media.file = file; - performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath); + performSendMessageRequest(message.sendRequest, message.obj, message.originalPath); } arr.remove(a); a--; @@ -838,6 +838,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } final ArrayList newMsgObjArr = arr; + final ArrayList newMsgArr = objArr; final HashMap messagesByRandomIdsFinal = messagesByRandomIds; final boolean isMegagroupFinal = isMegagroup; ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() { @@ -875,12 +876,13 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (newMsgObj == null) { continue; } + MessageObject msgObj = newMsgArr.get(newMsgObjArr.indexOf(newMsgObj)); newMsgObjArr.remove(newMsgObj); final int oldId = newMsgObj.id; final ArrayList sentMessages = new ArrayList<>(); sentMessages.add(message); newMsgObj.id = message.id; - processSentMessage(newMsgObj, message, null, true); + updateMediaPaths(msgObj, message, null, true); MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { @Override public void run() { @@ -1479,7 +1481,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter reqSend.contacts = sendToPeers; reqSend.media = new TLRPC.TL_inputMediaEmpty(); reqSend.random_id = random_ids; - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } else { TLRPC.TL_messages_sendMessage reqSend = new TLRPC.TL_messages_sendMessage(); reqSend.message = message; @@ -1498,7 +1500,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (!searchLinks) { reqSend.no_webpage = true; } - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } } else { TLRPC.TL_decryptedMessage reqSend; @@ -1694,32 +1696,32 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter reqSend = request; } if (type == 1) { - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } else if (type == 2) { if (photo.access_hash == 0) { performSendDelayedMessage(delayedMessage); } else { - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } } else if (type == 3) { if (document.access_hash == 0) { performSendDelayedMessage(delayedMessage); } else { - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } } else if (type == 6) { - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } else if (type == 7) { if (document.access_hash == 0 && delayedMessage != null) { performSendDelayedMessage(delayedMessage); } else { - performSendMessageRequest(reqSend, newMsgObj.messageOwner, originalPath); + performSendMessageRequest(reqSend, newMsgObj, originalPath); } } else if (type == 8) { if (document.access_hash == 0) { performSendDelayedMessage(delayedMessage); } else { - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } } } else { @@ -2010,7 +2012,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (asAdmin && reqSend.to_peer.channel_id != 0) { reqSend.broadcast = true; } - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } else if (type == 9) { TLRPC.TL_messages_sendInlineBotResult reqSend = new TLRPC.TL_messages_sendInlineBotResult(); reqSend.peer = sendToPeer; @@ -2027,7 +2029,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } reqSend.query_id = Utilities.parseLong(params.get("query_id")); reqSend.id = params.get("id"); - performSendMessageRequest(reqSend, newMsgObj.messageOwner, null); + performSendMessageRequest(reqSend, newMsgObj, null); } } catch (Exception e) { FileLog.e("tmessages", e); @@ -2185,7 +2187,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter return sendingMessages.containsKey(mid); } - private void performSendMessageRequest(final TLObject req, final TLRPC.Message newMsgObj, final String originalPath) { + private void performSendMessageRequest(final TLObject req, final MessageObject msgObj, final String originalPath) { + final TLRPC.Message newMsgObj = msgObj.messageOwner; putToSendingMessages(newMsgObj); ConnectionsManager.getInstance().sendRequest(req, new RequestDelegate() { @Override @@ -2252,7 +2255,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } if (message != null) { newMsgObj.id = message.id; - processSentMessage(newMsgObj, message, originalPath, false); + updateMediaPaths(msgObj, message, originalPath, false); } else { isSentError = true; } @@ -2329,7 +2332,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter }, ConnectionsManager.RequestFlagCanCompress | ConnectionsManager.RequestFlagInvokeAfter | (req instanceof TLRPC.TL_messages_sendMessage ? ConnectionsManager.RequestFlagNeedQuickAck : 0)); } - private void processSentMessage(TLRPC.Message newMsg, TLRPC.Message sentMessage, String originalPath, boolean post) { + private void updateMediaPaths(MessageObject newMsgObj, TLRPC.Message sentMessage, String originalPath, boolean post) { + TLRPC.Message newMsg = newMsgObj.messageOwner; if (sentMessage == null) { return; } @@ -2436,6 +2440,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter sentMessage.attachPath = newMsg.attachPath; sentMessage.message = newMsg.message; } else if (!MessageObject.isVideoMessage(sentMessage)) { + newMsgObj.mediaExists = newMsgObj.attachPathExists; + newMsgObj.attachPathExists = false; newMsg.attachPath = ""; if (originalPath != null && originalPath.startsWith("http")) { MessagesStorage.getInstance().addRecentLocalFile(originalPath, cacheFile2.toString(), newMsg.media.document); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java index 2eab94314..057635c5b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -13,6 +13,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; @@ -28,6 +29,7 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BuildVars; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.AnimationCompat.AnimatorListenerAdapterProxy; @@ -50,6 +52,9 @@ public class ActionBarLayout extends FrameLayout { public class LinearLayoutContainer extends LinearLayout { + private Rect rect = new Rect(); + private boolean isKeyboardVisible; + public LinearLayoutContainer(Context context) { super(context); setOrientation(VERTICAL); @@ -87,12 +92,32 @@ public class ActionBarLayout extends FrameLayout { public boolean hasOverlappingRendering() { return false; } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + View rootView = getRootView(); + getWindowVisibleDisplayFrame(rect); + int usableViewHeight = rootView.getHeight() - (rect.top != 0 ? AndroidUtilities.statusBarHeight : 0) - AndroidUtilities.getViewInset(rootView); + isKeyboardVisible = usableViewHeight - (rect.bottom - rect.top) > 0; + if (BuildVars.DEBUG_VERSION) { + FileLog.e("tmessages", "keyboard visible = " + isKeyboardVisible + " for " + this); + } + if (waitingForKeyboardCloseRunnable != null && !containerView.isKeyboardVisible && !containerViewBack.isKeyboardVisible) { + AndroidUtilities.cancelRunOnUIThread(waitingForKeyboardCloseRunnable); + waitingForKeyboardCloseRunnable.run(); + waitingForKeyboardCloseRunnable = null; + } + } } private static Drawable headerShadowDrawable; private static Drawable layerShadowDrawable; private static Paint scrimPaint; + private Runnable waitingForKeyboardCloseRunnable; + private LinearLayoutContainer containerView; private LinearLayoutContainer containerViewBack; private DrawerLayoutContainer drawerLayoutContainer; @@ -494,6 +519,10 @@ public class ActionBarLayout extends FrameLayout { private void onAnimationEndCheck(boolean byCheck) { onCloseAnimationEnd(false); onOpenAnimationEnd(false); + if (waitingForKeyboardCloseRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(waitingForKeyboardCloseRunnable); + waitingForKeyboardCloseRunnable = null; + } if (currentAnimation != null) { if (byCheck) { currentAnimation.cancel(); @@ -514,7 +543,7 @@ public class ActionBarLayout extends FrameLayout { } public boolean checkTransitionAnimation() { - if (transitionAnimationInProgress && transitionAnimationStartTime < System.currentTimeMillis() - 1000) { + if (transitionAnimationInProgress && transitionAnimationStartTime < System.currentTimeMillis() - 1500) { onAnimationEndCheck(true); } return transitionAnimationInProgress; @@ -718,7 +747,21 @@ public class ActionBarLayout extends FrameLayout { if (animation == null) { ViewProxy.setAlpha(containerView, 0.0f); ViewProxy.setTranslationX(containerView, 48.0f); - startLayoutAnimation(true, true); + if (containerView.isKeyboardVisible || containerViewBack.isKeyboardVisible) { + waitingForKeyboardCloseRunnable = new Runnable() { + @Override + public void run() { + FileLog.e("tmessages", "start delayed by keyboard open animation"); + if (waitingForKeyboardCloseRunnable != this) { + return; + } + startLayoutAnimation(true, true); + } + }; + AndroidUtilities.runOnUIThread(waitingForKeyboardCloseRunnable, 200); + } else { + startLayoutAnimation(true, true); + } } else { if (Build.VERSION.SDK_INT > 15) { //containerView.setLayerType(LAYER_TYPE_HARDWARE, null); @@ -868,7 +911,21 @@ public class ActionBarLayout extends FrameLayout { } }); if (animation == null) { - startLayoutAnimation(false, true); + if (containerView.isKeyboardVisible || containerViewBack.isKeyboardVisible) { + waitingForKeyboardCloseRunnable = new Runnable() { + @Override + public void run() { + if (waitingForKeyboardCloseRunnable != this) { + return; + } + FileLog.e("tmessages", "start delayed by keyboard close animation"); + startLayoutAnimation(false, true); + } + }; + AndroidUtilities.runOnUIThread(waitingForKeyboardCloseRunnable, 200); + } else { + startLayoutAnimation(false, true); + } } else { if (Build.VERSION.SDK_INT > 15) { //containerView.setLayerType(LAYER_TYPE_HARDWARE, null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java index 661b3b816..b0fa9ab09 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java @@ -112,10 +112,7 @@ public class ActionBarMenu extends LinearLayout { } public void clearItems() { - while(getChildCount() > 0) { - View view = getChildAt(0); - removeView(view); - } + removeAllViews(); } public void onMenuButtonPressed() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java index 7f9b294e3..98eef547f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java @@ -233,6 +233,9 @@ public class BottomSheet extends Dialog { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); + if (lastInsets != null && Build.VERSION.SDK_INT >= 21) { + width -= lastInsets.getSystemWindowInsetRight() + lastInsets.getSystemWindowInsetLeft(); + } setMeasuredDimension(width, height); boolean isPortrait = width < height; @@ -262,9 +265,6 @@ public class BottomSheet extends Dialog { if (child.getVisibility() == GONE || child == containerView) { continue; } - if (lastInsets != null && Build.VERSION.SDK_INT >= 21) { - child.dispatchApplyWindowInsets(lastInsets); - } measureChildWithMargins(child, MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), 0, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY), 0); } } @@ -272,15 +272,15 @@ public class BottomSheet extends Dialog { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (containerView != null) { - int l = ((right - left) - containerView.getMeasuredWidth()) / 2; int t = (bottom - top) - containerView.getMeasuredHeight(); if (lastInsets != null && Build.VERSION.SDK_INT >= 21) { - l += lastInsets.getSystemWindowInsetLeft() / 2; - l -= lastInsets.getSystemWindowInsetRight() / 2; + left += lastInsets.getSystemWindowInsetLeft(); + right += lastInsets.getSystemWindowInsetLeft(); if (focusable) { t -= lastInsets.getSystemWindowInsetBottom(); } } + int l = ((right - left) - containerView.getMeasuredWidth()) / 2; containerView.layout(l, t, l + containerView.getMeasuredWidth(), t + getMeasuredHeight()); } @@ -382,6 +382,12 @@ public class BottomSheet extends Dialog { protected boolean drawChild(Canvas canvas, View child, long drawingTime) { return super.drawChild(canvas, child, drawingTime); } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + FileLog.e("tmessages", "container on layout"); + } }; if (Build.VERSION.SDK_INT >= 21) { containerView.setFitsSystemWindows(true); @@ -548,7 +554,7 @@ public class BottomSheet extends Dialog { private void startRevealAnimation(final boolean open) { ViewProxy.setTranslationY(containerView, 0); - AnimatorSet animatorSet = new AnimatorSet(); + final AnimatorSet animatorSet = new AnimatorSet(); View view = delegate.getRevealView(); if (view.getVisibility() == View.VISIBLE && ((ViewGroup) view.getParent()).getVisibility() == View.VISIBLE) { @@ -580,6 +586,7 @@ public class BottomSheet extends Dialog { for (int a = 0; a < 4; a++) { finalRevealRadius = Math.max(finalRevealRadius, (int) Math.ceil(Math.sqrt((revealX - corners[a][0]) * (revealX - corners[a][0]) + (revealY - corners[a][1]) * (revealY - corners[a][1])))); } + int finalRevealX = revealX <= containerView.getMeasuredWidth() ? revealX : containerView.getMeasuredWidth(); ArrayList animators = new ArrayList<>(3); animators.add(ObjectAnimator.ofFloat(this, "revealRadius", open ? 0 : finalRevealRadius, open ? finalRevealRadius : 0)); @@ -587,7 +594,7 @@ public class BottomSheet extends Dialog { if (Build.VERSION.SDK_INT >= 21) { containerView.setElevation(AndroidUtilities.dp(10)); try { - animators.add(ViewAnimationUtils.createCircularReveal(containerView, revealX <= containerView.getMeasuredWidth() ? revealX : containerView.getMeasuredWidth(), revealY, open ? 0 : finalRevealRadius, open ? finalRevealRadius : 0)); + animators.add(ViewAnimationUtils.createCircularReveal(containerView, finalRevealX, revealY, open ? 0 : finalRevealRadius, open ? finalRevealRadius : 0)); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -626,7 +633,7 @@ public class BottomSheet extends Dialog { } containerView.invalidate(); if (Build.VERSION.SDK_INT >= 11) { - container.setLayerType(View.LAYER_TYPE_NONE, null); + containerView.setLayerType(View.LAYER_TYPE_NONE, null); } if (!open) { containerView.setVisibility(View.INVISIBLE); @@ -642,17 +649,20 @@ public class BottomSheet extends Dialog { } private void startOpenAnimation() { - if (Build.VERSION.SDK_INT >= 20) { - container.setLayerType(View.LAYER_TYPE_HARDWARE, null); - } if (containerView.getMeasuredHeight() == 0) { containerView.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.displaySize.x, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.displaySize.y, View.MeasureSpec.AT_MOST)); } backgroundDrawable.setAlpha(0); containerView.setVisibility(View.VISIBLE); if (useRevealAnimation) { + if (Build.VERSION.SDK_INT >= 20) { + containerView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + } startRevealAnimation(true); } else { + if (Build.VERSION.SDK_INT >= 20) { + container.setLayerType(View.LAYER_TYPE_HARDWARE, null); + } ViewProxy.setTranslationY(containerView, containerView.getMeasuredHeight()); backgroundDrawable.setAlpha(0); AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java index c529c9e16..4e69a1ecc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java @@ -233,6 +233,8 @@ public class Theme { public static PorterDuffColorFilter colorPressedFilter; private static int currentColor; + public static Drawable attachButtonDrawables[] = new Drawable[8]; + private static Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG); public static void loadRecources(Context context) { @@ -329,14 +331,14 @@ public class Theme { geoInDrawable = context.getResources().getDrawable(R.drawable.location_b); geoOutDrawable = context.getResources().getDrawable(R.drawable.location_g); - context.getResources().getDrawable(R.drawable.attach_camera_states); - context.getResources().getDrawable(R.drawable.attach_gallery_states); - context.getResources().getDrawable(R.drawable.attach_video_states); - context.getResources().getDrawable(R.drawable.attach_audio_states); - context.getResources().getDrawable(R.drawable.attach_file_states); - context.getResources().getDrawable(R.drawable.attach_contact_states); - context.getResources().getDrawable(R.drawable.attach_location_states); - context.getResources().getDrawable(R.drawable.attach_hide_states); + attachButtonDrawables[0] = context.getResources().getDrawable(R.drawable.attach_camera_states); + attachButtonDrawables[1] = context.getResources().getDrawable(R.drawable.attach_gallery_states); + attachButtonDrawables[2] = context.getResources().getDrawable(R.drawable.attach_video_states); + attachButtonDrawables[3] = context.getResources().getDrawable(R.drawable.attach_audio_states); + attachButtonDrawables[4] = context.getResources().getDrawable(R.drawable.attach_file_states); + attachButtonDrawables[5] = context.getResources().getDrawable(R.drawable.attach_contact_states); + attachButtonDrawables[6] = context.getResources().getDrawable(R.drawable.attach_location_states); + attachButtonDrawables[7] = context.getResources().getDrawable(R.drawable.attach_hide_states); cornerOuter[0] = context.getResources().getDrawable(R.drawable.corner_out_tl); cornerOuter[1] = context.getResources().getDrawable(R.drawable.corner_out_tr); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AudioSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/AudioSelectActivity.java index aaf4161af..ae365bbe0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/AudioSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/AudioSelectActivity.java @@ -203,7 +203,7 @@ public class AudioSelectActivity extends BaseFragment implements NotificationCen final ArrayList newAudioEntries = new ArrayList<>(); Cursor cursor = null; try { - cursor = ApplicationLoader.applicationContext.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, MediaStore.Audio.Media.IS_MUSIC + " != 0", null, null); + cursor = ApplicationLoader.applicationContext.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, MediaStore.Audio.Media.IS_MUSIC + " != 0", null, MediaStore.Audio.Media.TITLE); int id = -2000000000; while (cursor.moveToNext()) { MediaController.AudioEntry audioEntry = new MediaController.AudioEntry(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index f2cc715b0..16253ff43 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -62,7 +62,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; -public class ChatMessageCell extends ChatBaseCell implements SeekBar.SeekBarDelegate { +public class ChatMessageCell extends ChatBaseCell implements SeekBar.SeekBarDelegate, ImageReceiver.ImageReceiverDelegate { private final static int DOCUMENT_ATTACH_TYPE_NONE = 0; private final static int DOCUMENT_ATTACH_TYPE_DOCUMENT = 1; @@ -202,6 +202,7 @@ public class ChatMessageCell extends ChatBaseCell implements SeekBar.SeekBarDele super(context); avatarDrawable = new AvatarDrawable(); photoImage = new ImageReceiver(this); + photoImage.setDelegate(this); radialProgress = new RadialProgress(this); seekBar = new SeekBar(context); seekBar.setDelegate(this); @@ -1703,6 +1704,7 @@ public class ChatMessageCell extends ChatBaseCell implements SeekBar.SeekBarDele } } } else if (webPage.photo != null) { + drawImageButton = webPage.type != null && webPage.type.equals("photo"); currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, drawImageButton ? AndroidUtilities.getPhotoSize() : maxPhotoWidth, !drawImageButton); currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80); if (currentPhotoObjectThumb == currentPhotoObject) { @@ -3300,6 +3302,14 @@ public class ChatMessageCell extends ChatBaseCell implements SeekBar.SeekBarDele } } + @Override + public void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb) { + if (currentMessageObject != null && set && !thumb && !currentMessageObject.mediaExists && !currentMessageObject.attachPathExists) { + currentMessageObject.mediaExists = true; + updateButtonState(true); + } + } + @Override public void onProgressDownload(String fileName, float progress) { radialProgress.setProgress(progress, true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index eeeb857e4..d0b556419 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -250,7 +250,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private Runnable waitingForCharaterEnterRunnable; private boolean openAnimationEnded; - private boolean attachAttachViewFirstShow = true; private int readWithDate; private int readWithMid; @@ -702,7 +701,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not cantDeleteMessagesCount = 0; hasOwnBackground = true; - chatAttachView = null; + if (chatAttachView != null){ + chatAttachView.onDestroy(); + chatAttachView = null; + } chatAttachViewSheet = null; Theme.loadRecources(context); @@ -876,17 +878,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } chatAttachView.init(ChatActivity.this); - if (attachAttachViewFirstShow) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - showDialog(chatAttachViewSheet); - } - }); - attachAttachViewFirstShow = false; - } else { - showDialog(chatAttachViewSheet); - } + showDialog(chatAttachViewSheet); } else if (id == bot_help) { SendMessagesHelper.getInstance().sendMessage("/help", dialog_id, null, null, false, chatActivityEnterView == null || chatActivityEnterView.asAdmin(), null, null, null); } else if (id == bot_settings) { @@ -2845,11 +2837,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int totalItemCount = chatAdapter.getItemCount(); int checkLoadCount; if (scroll) { - if (lastLoadIndex < 3) { - checkLoadCount = 5; - } else { - checkLoadCount = 25; - } + checkLoadCount = 25; } else { checkLoadCount = 5; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachView.java index 86c3d2aa5..1f31dbf6a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachView.java @@ -17,6 +17,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; import android.os.Build; import android.text.TextUtils; import android.util.TypedValue; @@ -39,6 +40,7 @@ import org.telegram.messenger.support.widget.LinearLayoutManager; import org.telegram.messenger.R; import org.telegram.messenger.support.widget.RecyclerView; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.PhotoAttachPhotoCell; import org.telegram.ui.ChatActivity; import org.telegram.ui.PhotoViewer; @@ -97,9 +99,9 @@ public class ChatAttachView extends FrameLayout implements NotificationCenter.No super.onMeasure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(85), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(90), MeasureSpec.EXACTLY)); } - public void setTextAndIcon(CharSequence text, int icon) { + public void setTextAndIcon(CharSequence text, Drawable drawable) { textView.setText(text); - imageView.setBackgroundResource(icon); + imageView.setBackgroundDrawable(drawable); } } @@ -168,19 +170,9 @@ public class ChatAttachView extends FrameLayout implements NotificationCenter.No LocaleController.getString("ChatLocation", R.string.ChatLocation), "" }; - int itemIcons[] = new int[] { - R.drawable.attach_camera_states, - R.drawable.attach_gallery_states, - R.drawable.attach_video_states, - R.drawable.attach_audio_states, - R.drawable.attach_file_states, - R.drawable.attach_contact_states, - R.drawable.attach_location_states, - R.drawable.attach_hide_states, - }; for (int a = 0; a < 8; a++) { AttachButton attachButton = new AttachButton(context); - attachButton.setTextAndIcon(items[a], itemIcons[a]); + attachButton.setTextAndIcon(items[a], Theme.attachButtonDrawables[a]); addView(attachButton, LayoutHelper.createFrame(85, 90, Gravity.LEFT | Gravity.TOP)); attachButton.setTag(a); views[a] = attachButton; @@ -282,10 +274,8 @@ public class ChatAttachView extends FrameLayout implements NotificationCenter.No } public void loadGalleryPhotos() { - if (MediaController.allPhotosAlbumEntry == null) { - if (Build.VERSION.SDK_INT >= 21) { - MediaController.loadGalleryPhotosAlbums(0); - } + if (MediaController.allPhotosAlbumEntry == null && Build.VERSION.SDK_INT >= 21) { + MediaController.loadGalleryPhotosAlbums(0); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/WebFrameLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/WebFrameLayout.java index 43a315199..41c99a782 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/WebFrameLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/WebFrameLayout.java @@ -10,6 +10,7 @@ package org.telegram.ui.Components; import android.annotation.SuppressLint; import android.content.Context; +import android.net.Uri; import android.os.Build; import android.text.TextUtils; import android.util.TypedValue; @@ -38,6 +39,8 @@ import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class WebFrameLayout extends FrameLayout { @@ -52,11 +55,67 @@ public class WebFrameLayout extends FrameLayout { private int height; private String openUrl; private boolean hasDescription; + private String embedUrl; + + final static Pattern youtubeIdRegex = Pattern.compile("(?:youtube(?:-nocookie)?\\.com\\/(?:[^\\/\\n\\s]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[?&]v=)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})"); + private final String youtubeFrame = "" + + "
" + + "
" + + "
" + + " " + + " " + + "" + + ""; @SuppressLint("SetJavaScriptEnabled") public WebFrameLayout(Context context, final BottomSheet parentDialog, String title, String descripton, String originalUrl, final String url, int w, int h) { super(context); - + embedUrl = url; + if (embedUrl.toLowerCase().contains("youtube")) { + //embedUrl += "&enablejsapi=1"; + } hasDescription = descripton != null && descripton.length() > 0; openUrl = originalUrl; width = w; @@ -162,9 +221,6 @@ public class WebFrameLayout extends FrameLayout { progressBar = new ProgressBar(context); addView(progressBar, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 0, 0, (48 + 36 + (hasDescription ? 22 : 0)) / 2)); - //TODO 16m - //TODO 14 - TextView textView; if (hasDescription) { @@ -282,11 +338,31 @@ public class WebFrameLayout extends FrameLayout { public void onOpenAnimationEnd() { HashMap args = new HashMap<>(); args.put("Referer", "http://youtube.com"); + boolean ok = false; try { - webView.loadUrl(url, args); + Uri uri = Uri.parse(openUrl); + String host = uri.getHost().toLowerCase(); + if (host != null && host.endsWith("youtube.com") || host.endsWith("youtu.be")) { + Matcher matcher = youtubeIdRegex.matcher(openUrl); + String id = null; + if (matcher.find()) { + id = matcher.group(1); + } + if (id != null) { + ok = true; + webView.loadDataWithBaseURL("http://youtube.com", String.format(youtubeFrame, id), "text/html", "UTF-8", "http://youtube.com"); + } + } } catch (Exception e) { FileLog.e("tmessages", e); } + if (!ok) { + try { + webView.loadUrl(embedUrl, args); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index d636ea4bd..a7b7ab950 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -779,7 +779,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa group = path.replace("joinchat/", ""); } else if (path.startsWith("addstickers/")) { sticker = path.replace("addstickers/", ""); - } else if (path.startsWith("msg/")) { + } else if (path.startsWith("msg/") || path.startsWith("share/")) { message = data.getQueryParameter("url"); if (message == null) { message = ""; @@ -823,8 +823,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa url = url.replace("tg:addstickers", "tg://telegram.org").replace("tg://addstickers", "tg://telegram.org"); data = Uri.parse(url); sticker = data.getQueryParameter("set"); - } else if (url.startsWith("tg:msg") || url.startsWith("tg://msg")) { - url = url.replace("tg:msg", "tg://telegram.org").replace("tg://msg", "tg://telegram.org"); + } else if (url.startsWith("tg:msg") || url.startsWith("tg://msg") || url.startsWith("tg://share") || url.startsWith("tg:share")) { + url = url.replace("tg:msg", "tg://telegram.org").replace("tg://msg", "tg://telegram.org").replace("tg://share", "tg://telegram.org").replace("tg:share", "tg://telegram.org"); data = Uri.parse(url); message = data.getQueryParameter("url"); if (message == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 7dc0183ad..0ddae7e2f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -890,7 +890,7 @@ public class LoginActivity extends BaseFragment { if (countryState == 1) { needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); return; - } else if (countryState == 2 && !BuildVars.DEBUG_VERSION) { + } else if (countryState == 2 && !BuildVars.DEBUG_VERSION && !codeField.getText().toString().equals("999")) { needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("WrongCountry", R.string.WrongCountry)); return; }