diff --git a/TMessagesProj/jni/CMakeLists.txt b/TMessagesProj/jni/CMakeLists.txt index 9d6aa8e54e..eca54f7d94 100644 --- a/TMessagesProj/jni/CMakeLists.txt +++ b/TMessagesProj/jni/CMakeLists.txt @@ -60,7 +60,7 @@ add_library(libvpx STATIC IMPORTED) set_target_properties(libvpx PROPERTIES IMPORTED_LOCATION ${CMAKE_HOME_DIRECTORY}/ffmpeg/${ANDROID_ABI}/libvpx.a) add_library(rust STATIC IMPORTED) -set_target_properties(rust PROPERTIES IMPORTED_LOCATION ${CMAKE_HOME_DIRECTORY}/integrity/${ANDROID_ABI}/librust.a.12) +set_target_properties(rust PROPERTIES IMPORTED_LOCATION ${CMAKE_HOME_DIRECTORY}/integrity/${ANDROID_ABI}/librust.a.13) #tgnet add_library(tgnet STATIC diff --git a/TMessagesProj/jni/integrity/arm64-v8a/librust.a.12 b/TMessagesProj/jni/integrity/arm64-v8a/librust.a.13 similarity index 60% rename from TMessagesProj/jni/integrity/arm64-v8a/librust.a.12 rename to TMessagesProj/jni/integrity/arm64-v8a/librust.a.13 index 36a07e9011..3540c99c3f 100644 Binary files a/TMessagesProj/jni/integrity/arm64-v8a/librust.a.12 and b/TMessagesProj/jni/integrity/arm64-v8a/librust.a.13 differ diff --git a/TMessagesProj/jni/integrity/armeabi-v7a/librust.a.12 b/TMessagesProj/jni/integrity/armeabi-v7a/librust.a.13 similarity index 55% rename from TMessagesProj/jni/integrity/armeabi-v7a/librust.a.12 rename to TMessagesProj/jni/integrity/armeabi-v7a/librust.a.13 index df0aa78b01..02765aa9f5 100644 Binary files a/TMessagesProj/jni/integrity/armeabi-v7a/librust.a.12 and b/TMessagesProj/jni/integrity/armeabi-v7a/librust.a.13 differ diff --git a/TMessagesProj/jni/integrity/include/rust.h b/TMessagesProj/jni/integrity/include/rust.h index 569ab3e984..c29e772771 100644 --- a/TMessagesProj/jni/integrity/include/rust.h +++ b/TMessagesProj/jni/integrity/include/rust.h @@ -2,11 +2,7 @@ // Created by qwq233 on 3/24/2024. // -//#include -//#include -//#include #include -//#include extern "C" uint8_t logd(const char *tag, const char *msg); extern "C" uint8_t logi(const char *tag, const char *msg); diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 37592ed80e..db39e2c20c 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -122,19 +122,6 @@ - - - - - - - - - - - - - = 0) { + String ext = filename.substring(index + 1); + switch (ext.toLowerCase().hashCode()) { + case 0x17a1c: case 0x3107ab: case 0x19a1b: + case 0xe55: case 0x18417: case 0x184fe: + case 0x18181: + return false; + } } } if (isAnimated && (width > 1280 || height > 1280)) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 3e0d871d3e..01b68e243a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -19972,13 +19972,13 @@ public boolean checkCanOpenChat(Bundle bundle, BaseFragment fragment, MessageObj @Override public void onMessagesLoaded(boolean fromCache) { progress.end(); - fragment.presentFragment(new ChatActivity(bundle), true); + fragment.presentFragment(new ChatActivity(bundle)); } @Override public void onError() { progress.end(); - fragment.presentFragment(new ChatActivity(bundle), true); + fragment.presentFragment(new ChatActivity(bundle)); } })); return false; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java b/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java index 2df6a348fa..e68cf58b10 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java @@ -60,6 +60,7 @@ import java.lang.ref.WeakReference; import java.net.URLEncoder; +import java.util.Collections; import java.util.List; import java.util.regex.Matcher; @@ -264,11 +265,9 @@ public static void openUrl(final Context context, Uri uri, boolean _allowCustom, boolean[] forceBrowser = new boolean[]{false}; boolean internalUri = isInternalUri(uri, forceBrowser); String browserPackage = getBrowserPackageName(browser); - if (isBrowserPackageInstalled(context, browserPackage, uri)) { + if (browserPackage != null) { tryTelegraph = false; _allowCustom = false; - } else { - browserPackage = null; } final boolean allowCustom = _allowCustom; if (tryTelegraph) { @@ -442,7 +441,16 @@ public static void openUrl(final Context context, Uri uri, boolean _allowCustom, intent.putExtra(LaunchActivity.EXTRA_FORCE_NOT_INTERNAL_APPS, forceNotInternalForApps); ((LaunchActivity) context).onNewIntent(intent, inCaseLoading); } else { - context.startActivity(intent); + try { + context.startActivity(intent); + } catch (Exception e2) { + if (browserPackage != null) { + intent.setPackage(browserPackage = null); + context.startActivity(intent); + } else { + FileLog.e(e2); + } + } } } catch (Exception e) { FileLog.e(e); @@ -599,14 +607,6 @@ public static String getBrowserPackageName(String browser) { return null; } - public static boolean isBrowserPackageInstalled(Context context, String packageName, Uri uri) { - if (packageName == null) return false; - PackageManager packageManager = context.getPackageManager(); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - intent.setPackage(packageName); - return packageManager.resolveActivity(intent, 0) != null; - } - public static String replaceHostname(Uri originalUri, String newHostname) { String scheme = originalUri.getScheme(); String userInfo = originalUri.getUserInfo(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CachedMediaLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/CachedMediaLayout.java index 8c2ba13048..61ff78d3e1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CachedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CachedMediaLayout.java @@ -332,7 +332,7 @@ private void openItem(CacheModel.FileInfo fileInfo, CacheCell cacheCell) { photoEntries.add(new MediaController.PhotoEntry(0, 0, 0, fileInfo.file.getPath(), 0, fileInfo.type == TYPE_VIDEOS, 0, 0, 0)); PhotoViewer.getInstance().openPhotoForSelect(photoEntries, 0, PhotoViewer.SELECT_TYPE_NO_SELECT, false, placeProvider, null); } else { - AndroidUtilities.openForView(fileInfo.file, fileInfo.file.getName(), null, parentFragment.getParentActivity(), null); + AndroidUtilities.openForView(fileInfo.file, fileInfo.file.getName(), null, parentFragment.getParentActivity(), null, false); } } if (cacheCell.type == TYPE_MUSIC) { 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 ac51b6ea16..30c33f61c2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -19632,7 +19632,7 @@ private void drawCaptionLayout(Canvas canvas, MessageObject.TextLayoutBlocks cap buttonX -= AndroidUtilities.dp(10); } commentButtonRect.set( - buttonX - AndroidUtilities.dp((currentMessageObject == null || !currentMessageObject.isOut()) && !drawPinnedBottom && currentPosition == null && (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_POLL || pollInstantViewTouchesBottom) ? 6 : 0), + buttonX - AndroidUtilities.dp((currentMessageObject == null || !currentMessageObject.isOutOwner()) && !drawPinnedBottom && currentPosition == null && (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_POLL || pollInstantViewTouchesBottom) ? 6 : 0), (int) buttonY, endX - AndroidUtilities.dp(14), layoutHeight - AndroidUtilities.dp(h) + 1 diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java index e231098ccf..94ba25efff 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java @@ -3177,7 +3177,7 @@ public void didPressImage(ChatMessageCell cell, float x, float y) { } } try { - AndroidUtilities.openForView(message, getParentActivity(), null); + AndroidUtilities.openForView(message, getParentActivity(), null, false); } catch (Exception e) { alertUserOpenError(message); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java index 306ed55612..f86021428f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java @@ -313,6 +313,7 @@ public boolean dispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event); } }; + starsBalanceEditTextContainer.setVisibility(GONE); starsBalanceEditTextContainer.setText(getString(R.string.BotStarsWithdrawPlaceholder)); starsBalanceEditTextContainer.setLeftPadding(dp(14 + 22)); starsBalanceEditText = new EditTextBoldCursor(context) { @@ -691,13 +692,14 @@ private void setStarsBalance(long crypto_amount, int blockedUntil) { starsBalance = crypto_amount; starsBalanceTitle.setText(ssb); starsBalanceSubtitle.setText("≈" + BillingController.getInstance().formatCurrency(amount, "USD")); + starsBalanceEditTextContainer.setVisibility(crypto_amount > 0 ? VISIBLE : GONE); if (starsBalanceEditTextAll) { starsBalanceEditTextIgnore = true; starsBalanceEditText.setText(Long.toString(starsBalanceEditTextValue = crypto_amount)); starsBalanceEditText.setSelection(starsBalanceEditText.getText().length()); starsBalanceEditTextIgnore = false; - balanceButton.setEnabled(starsBalanceEditTextValue > 0); + starsBalanceButton.setEnabled(starsBalanceEditTextValue > 0); } starsBalanceBlockedUntil = blockedUntil; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java index 6a5fc6dfc4..e47fe48f2e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java @@ -1174,8 +1174,10 @@ public long findMinValue(int startXIndex, int endXIndex) { return minValue; } - public void setData(T chartData) { + public boolean setData(T chartData) { + boolean updated = false; if (this.chartData != chartData) { + updated = true; invalidate(); lines.clear(); if (chartData != null && chartData.lines != null) { @@ -1235,6 +1237,7 @@ public void setData(T chartData) { alphaAnimator.cancel(); } } + return updated; } protected float getMinDistance() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/ChartPickerDelegate.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/ChartPickerDelegate.java index aeae132b7b..669b479843 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/ChartPickerDelegate.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/ChartPickerDelegate.java @@ -233,6 +233,12 @@ public boolean move(int x, int y, int pointer) { return true; } + public void set(float start, float end) { + pickerStart = start; + pickerEnd = end; + view.onPickerDataChanged(); + } + public boolean uncapture(MotionEvent event, int pointerIndex) { if (pointerIndex == 0) { if (tryMoveTo) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/PieChartView.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/PieChartView.java index 3976f658c8..718a5e02bd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/PieChartView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/PieChartView.java @@ -312,13 +312,14 @@ void drawBottomSignature(Canvas canvas) { @Override - public void setData(StackLinearChartData chartData) { - super.setData(chartData); + public boolean setData(StackLinearChartData chartData) { + boolean u = super.setData(chartData); if (chartData != null) { values = new float[chartData.lines.size()]; darawingValuesPercentage = new float[chartData.lines.size()]; onPickerDataChanged(false, true, false); } + return u; } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 7fa6e8e1fe..cb68f283dc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -938,6 +938,7 @@ public int getColor(int key) { private boolean premiumInvoiceBot; private boolean showScrollToMessageError; private int startLoadFromMessageId; + private int startReplyTo; private int startLoadFromDate; private int startLoadFromMessageIdSaved; private int startLoadFromMessageOffset = Integer.MAX_VALUE; @@ -2574,6 +2575,7 @@ public boolean onFragmentCreate() { textToSet = arguments.getString("start_text"); premiumInvoiceBot = arguments.getBoolean("premium_bot", false); startLoadFromMessageId = arguments.getInt("message_id", 0); + startReplyTo = arguments.getInt("reply_to", 0); startLoadFromDate = arguments.getInt("start_from_date", 0); startFromVideoTimestamp = arguments.getInt("video_timestamp", -1); threadUnreadMessagesCount = arguments.getInt("unread_count", 0); @@ -20363,6 +20365,13 @@ public void didReceivedNotification(int id, int account, final Object... args) { if (chatMode == MODE_SEARCH) { updateSearchUpDownButtonVisibility(true); } + if (startReplyTo != 0) { + MessageObject msg = messagesDict[0].get(startReplyTo); + if (msg != null) { + showFieldPanelForReply(msg); + startReplyTo = 0; + } + } } else if (id == NotificationCenter.invalidateMotionBackground) { if (chatListView != null) { chatListView.invalidateViews(); @@ -37431,7 +37440,7 @@ public void didPressImage(ChatMessageCell cell, float x, float y) { } if (!handled) { try { - AndroidUtilities.openForView(message, getParentActivity(), themeDelegate); + AndroidUtilities.openForView(message, getParentActivity(), themeDelegate, false); } catch (Exception e) { FileLog.e(e); alertUserOpenError(message); @@ -40203,7 +40212,22 @@ public void didLongPressLink(ChatMessageCell cell, MessageObject messageObject, dialog.setItemOptions(options); if (span instanceof URLSpanReplacement) { - SpannableString s = new SpannableString(((URLSpanReplacement) span).getURL()); + String formattedUrl = ((URLSpanReplacement) span).getURL(); + try { + try { + Uri uri = Uri.parse(formattedUrl); + formattedUrl = Browser.replaceHostname(uri, IDN.toUnicode(uri.getHost(), IDN.ALLOW_UNASSIGNED)); + } catch (Exception e) { + FileLog.e(e, false); + } + formattedUrl = URLDecoder.decode(formattedUrl.replaceAll("\\+", "%2b"), "UTF-8"); + } catch (Exception e) { + FileLog.e(e); + } + if (formattedUrl.length() > 204) { + formattedUrl = formattedUrl.substring(0, 204) + "…"; + } + SpannableString s = new SpannableString(formattedUrl); s.setSpan(span, 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); dialog.setScrim(cell, span, s); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ThanosEffect.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ThanosEffect.java index cc7fa843f7..38d05ef370 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ThanosEffect.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ThanosEffect.java @@ -402,8 +402,10 @@ private void resizeInternal(int width, int height) { public void kill() { if (!alive) { + FileLog.d("ThanosEffect: kill failed, already dead"); return; } + FileLog.d("ThanosEffect: kill"); try { Handler handler = getHandler(); if (handler != null) { @@ -414,8 +416,10 @@ public void kill() { private void killInternal() { if (!alive) { + FileLog.d("ThanosEffect: killInternal failed, already dead"); return; } + FileLog.d("ThanosEffect: killInternal"); alive = false; for (int i = 0; i < pendingAnimations.size(); ++i) { Animation animation = pendingAnimations.get(i); @@ -468,11 +472,13 @@ private void init() { eglDisplay = egl.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); if (eglDisplay == egl.EGL_NO_DISPLAY) { + FileLog.e("ThanosEffect: eglDisplay == egl.EGL_NO_DISPLAY"); killInternal(); return; } int[] version = new int[2]; if (!egl.eglInitialize(eglDisplay, version)) { + FileLog.e("ThanosEffect: failed eglInitialize"); killInternal(); return; } @@ -488,6 +494,7 @@ private void init() { EGLConfig[] eglConfigs = new EGLConfig[1]; int[] numConfigs = new int[1]; if (!egl.eglChooseConfig(eglDisplay, configAttributes, eglConfigs, 1, numConfigs)) { + FileLog.e("ThanosEffect: failed eglChooseConfig"); kill(); return; } @@ -499,17 +506,20 @@ private void init() { }; eglContext = egl.eglCreateContext(eglDisplay, eglConfig, egl.EGL_NO_CONTEXT, contextAttributes); if (eglContext == null) { + FileLog.e("ThanosEffect: eglContext == null"); killInternal(); return; } eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, surfaceTexture, null); if (eglSurface == null) { + FileLog.e("ThanosEffect: eglSurface == null"); killInternal(); return; } if (!egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) { + FileLog.e("ThanosEffect: failed eglMakeCurrent"); killInternal(); return; } @@ -517,6 +527,7 @@ private void init() { int vertexShader = GLES31.glCreateShader(GLES31.GL_VERTEX_SHADER); int fragmentShader = GLES31.glCreateShader(GLES31.GL_FRAGMENT_SHADER); if (vertexShader == 0 || fragmentShader == 0) { + FileLog.e("ThanosEffect: vertexShader == 0 || fragmentShader == 0"); killInternal(); return; } @@ -541,6 +552,7 @@ private void init() { } drawProgram = GLES31.glCreateProgram(); if (drawProgram == 0) { + FileLog.e("ThanosEffect: drawProgram == 0"); killInternal(); return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index f4c9c37e81..2350248066 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -2017,6 +2017,7 @@ public interface PageBlocksAdapter { private final static int gallery_menu_translate = 91; private final static int gallery_menu_paint = 20; + private final static int gallery_menu_reply = 23; private static DecelerateInterpolator decelerateInterpolator; private static Paint progressPaint; @@ -4886,7 +4887,7 @@ public void onItemClick(int id) { ((LaunchActivity) parentActivity).presentFragment(mediaActivity, false, true); } } - } else if (id == gallery_menu_showinchat) { + } else if (id == gallery_menu_showinchat || id == gallery_menu_reply) { if (currentMessageObject == null) { return; } @@ -4908,6 +4909,9 @@ public void onItemClick(int id) { args.putLong("chat_id", -dialogId); } args.putInt("message_id", currentMessageObject.getId()); + if (id == gallery_menu_reply) { + args.putInt("reply_to", currentMessageObject.getId()); + } NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.closeChats); if (parentActivity instanceof LaunchActivity) { LaunchActivity launchActivity = (LaunchActivity) parentActivity; @@ -5239,7 +5243,7 @@ public void onItemClick(int id) { Browser.openUrl(parentActivity, MessageObject.getMedia(currentMessageObject.messageOwner).webpage.url); closePhoto(false, false); } else if (currentMessageObject != null) { - if (AndroidUtilities.openForView(currentMessageObject, parentActivity, resourcesProvider)) { + if (AndroidUtilities.openForView(currentMessageObject, parentActivity, resourcesProvider, currentMessageObject.isVideo() || currentMessageObject.isPhoto() || currentMessageObject.isSticker())) { closePhoto(false, false); } else { showDownloadAlert(); @@ -5511,6 +5515,7 @@ public void onSpeedSelected(float speed, boolean isFinal, boolean closeMenu) { menuItem.addSubItem(gallery_menu_savegif, R.drawable.msg_gif, LocaleController.getString("SaveToGIFs", R.string.SaveToGIFs)).setColors(0xfffafafa, 0xfffafafa); menuItem.addSubItem(gallery_menu_showinchat, R.drawable.msg_message, LocaleController.getString("ShowInChat", R.string.ShowInChat)).setColors(0xfffafafa, 0xfffafafa); menuItem.addSubItem(gallery_menu_masks2, R.drawable.msg_sticker, LocaleController.getString("ShowStickers", R.string.ShowStickers)).setColors(0xfffafafa, 0xfffafafa); + menuItem.addSubItem(gallery_menu_reply, R.drawable.menu_reply, LocaleController.getString(R.string.Reply)).setColors(0xfffafafa, 0xfffafafa); menuItem.addSubItem(gallery_menu_share, R.drawable.msg_shareout, LocaleController.getString("ShareFile", R.string.ShareFile)).setColors(0xfffafafa, 0xfffafafa); menuItem.addSubItem(gallery_menu_save, R.drawable.msg_gallery, LocaleController.getString("SaveToGallery", R.string.SaveToGallery)).setColors(0xfffafafa, 0xfffafafa); //menuItem.addSubItem(gallery_menu_edit_avatar, R.drawable.photo_paint, LocaleController.getString("EditPhoto", R.string.EditPhoto)).setColors(0xfffafafa, 0xfffafafa); @@ -9308,7 +9313,7 @@ public void onError(VideoPlayer player, Exception e) { builder.setMessage(LocaleController.getString("CantPlayVideo", R.string.CantPlayVideo)); builder.setPositiveButton(LocaleController.getString("Open", R.string.Open), (dialog, which) -> { try { - AndroidUtilities.openForView(currentMessageObject, parentActivity, resourcesProvider); + AndroidUtilities.openForView(currentMessageObject, parentActivity, resourcesProvider, true); closePhoto(false, false); } catch (Exception e1) { FileLog.e(e1); @@ -12477,6 +12482,7 @@ private void onPhotoShow(final MessageObject messageObject, final TLRPC.FileLoca dateOverride = 0; menuItem.hideSubItem(gallery_menu_showall); menuItem.hideSubItem(gallery_menu_showinchat); + menuItem.hideSubItem(gallery_menu_reply); menuItem.hideSubItem(gallery_menu_share); menuItem.hideSubItem(gallery_menu_openin); menuItem.hideSubItem(gallery_menu_savegif); @@ -12623,6 +12629,17 @@ private void onPhotoShow(final MessageObject messageObject, final TLRPC.FileLoca imagesByIds[0].put(messageObject.getId(), messageObject); if (parentChatActivity == null || !parentChatActivity.isThreadChat() && parentChatActivity.getChatMode() != ChatActivity.MODE_SAVED && parentChatActivity.getChatMode() != ChatActivity.MODE_QUICK_REPLIES) { menuItem.showSubItem(gallery_menu_showinchat); + boolean canWrite = true; + long dialogId = messageObject.getDialogId(); + if (dialogId < 0) { + TLRPC.Chat chat = MessagesController.getInstance(messageObject.currentAccount).getChat(-dialogId); + canWrite = ChatObject.canWriteToChat(chat); + } + if (canWrite) { + menuItem.showSubItem(gallery_menu_reply); + } else { + menuItem.hideSubItem(gallery_menu_reply); + } menuItem.showSubItem(gallery_menu_showall); } setItemVisible(sendItem, !noforwards, false); @@ -12693,6 +12710,17 @@ private void onPhotoShow(final MessageObject messageObject, final TLRPC.FileLoca startOffset = object.starOffset; } menuItem.showSubItem(gallery_menu_showinchat); + boolean canWrite = true; + long dialogId = openingObject.getDialogId(); + if (dialogId < 0) { + TLRPC.Chat chat = MessagesController.getInstance(openingObject.currentAccount).getChat(-dialogId); + canWrite = ChatObject.canWriteToChat(chat); + } + if (canWrite) { + menuItem.showSubItem(gallery_menu_reply); + } else { + menuItem.hideSubItem(gallery_menu_reply); + } if (openingObject.canForwardMessage() && !noforwards) { setItemVisible(sendItem, true, false); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java index c58c090aa6..119ef10611 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java @@ -30,6 +30,7 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.Space; import android.widget.TextView; import androidx.annotation.NonNull; @@ -116,7 +117,7 @@ public class BotStarsActivity extends BaseFragment implements NotificationCenter private boolean balanceEditTextAll = true; private long balanceEditTextValue; private EditTextBoldCursor balanceEditText; - private ButtonWithCounterView balanceButton; + private ButtonWithCounterView balanceButton, adsButton; private ColoredImageSpan[] starRef = new ColoredImageSpan[1]; private int shakeDp = 4; @@ -241,7 +242,7 @@ public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { - long balance = BotStarsController.getInstance(currentAccount).getBalance(bot_id); + long balance = BotStarsController.getInstance(currentAccount).getAvailableBalance(bot_id); balanceEditTextValue = TextUtils.isEmpty(s) ? 0 : Long.parseLong(s.toString()); if (balanceEditTextValue > balance) { balanceEditTextValue = balance; @@ -274,37 +275,46 @@ public void afterTextChanged(Editable s) { return false; }); balanceLayout.addView(balanceEditTextContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 18, 14, 18, 2)); + balanceEditTextContainer.setVisibility(View.GONE); - final CircularProgressDrawable circularProgressDrawable = new CircularProgressDrawable(dp(15), dpf2(2), Theme.getColor(Theme.key_featuredStickers_buttonText, getResourceProvider())) { - @Override - public int getIntrinsicWidth() { - return dp(24); - } - @Override - public int getIntrinsicHeight() { - return dp(24); - } - }; - circularProgressDrawable.setBounds(0, 0, dp(24), dp(24)); + LinearLayout balanceButtonsLayout = new LinearLayout(context); + balanceButtonsLayout.setOrientation(LinearLayout.HORIZONTAL); balanceButton = new ButtonWithCounterView(context, getResourceProvider()) { - @Override - protected boolean verifyDrawable(@NonNull Drawable who) { - return who == circularProgressDrawable || super.verifyDrawable(who); - } - @Override protected boolean subTextSplitToWords() { return false; } }; balanceButton.setEnabled(MessagesController.getInstance(currentAccount).channelRevenueWithdrawalEnabled); - circularProgressDrawable.setCallback(balanceButton); - balanceButton.setText(getString(R.string.BotStarsButtonWithdrawAll), false); + balanceButton.setText(getString(R.string.BotStarsButtonWithdrawShortAll), false); balanceButton.setOnClickListener(v -> { withdraw(); }); - balanceLayout.addView(balanceButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.FILL_HORIZONTAL, 18, 13, 18, 0)); + + adsButton = new ButtonWithCounterView(context, getResourceProvider()); + adsButton.setEnabled(true); + adsButton.setText(getString(R.string.MonetizationStarsAds), false); + adsButton.setOnClickListener(v -> { + if (!v.isEnabled() || adsButton.isLoading()) return; + + adsButton.setLoading(true); + TLRPC.TL_payments_getStarsRevenueAdsAccountUrl req = new TLRPC.TL_payments_getStarsRevenueAdsAccountUrl(); + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(bot_id); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_payments_starsRevenueAdsAccountUrl) { + Browser.openUrl(context, ((TLRPC.TL_payments_starsRevenueAdsAccountUrl) res).url); + } + AndroidUtilities.runOnUIThread(() -> { + adsButton.setLoading(false); + }, 1000); + })); + }); + + balanceButtonsLayout.addView(balanceButton, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, 1, Gravity.FILL)); + balanceButtonsLayout.addView(new Space(context), LayoutHelper.createLinear(8, 48, 0, Gravity.FILL)); + balanceButtonsLayout.addView(adsButton, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, 1, Gravity.FILL)); + balanceLayout.addView(balanceButtonsLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.FILL_HORIZONTAL, 18, 13, 18, 0)); listView = new UniversalRecyclerView(this, this::fillItems, this::onItemClick, this::onItemLongClick); @@ -330,7 +340,7 @@ private void withdraw() { Drawable starDrawable = getContext().getResources().getDrawable(R.drawable.star_small_inner).mutate(); BulletinFactory.of(this).createSimpleBulletin(starDrawable, AndroidUtilities.replaceSingleTag(LocaleController.formatPluralString("BotStarsWithdrawMinLimit", (int) getMessagesController().starsRevenueWithdrawalMin), () -> { Bulletin.hideVisible(); - long balance = BotStarsController.getInstance(currentAccount).getBalance(bot_id); + long balance = BotStarsController.getInstance(currentAccount).getAvailableBalance(bot_id); if (balance < getMessagesController().starsRevenueWithdrawalMin) { balanceEditTextAll = true; balanceEditTextValue = balance; @@ -407,6 +417,7 @@ private void setBalance(long crypto_amount, int blockedUntil) { } balanceTitle.setText(ssb); balanceSubtitle.setText("≈" + BillingController.getInstance().formatCurrency(amount, "USD")); + balanceEditTextContainer.setVisibility(amount > 0 ? View.VISIBLE : View.GONE); if (balanceEditTextAll) { balanceEditTextIgnore = true; balanceEditText.setText(Long.toString(balanceEditTextValue = crypto_amount)); @@ -426,7 +437,7 @@ private void setBalance(long crypto_amount, int blockedUntil) { final int now = getConnectionsManager().getCurrentTime(); balanceButton.setEnabled(balanceEditTextValue > 0 || balanceBlockedUntil > now); if (now < balanceBlockedUntil) { - balanceButton.setText(getString(R.string.BotStarsButtonWithdrawUntil), true); + balanceButton.setText(getString(R.string.BotStarsButtonWithdrawShortUntil), true); if (lock == null) { lock = new SpannableStringBuilder("l"); @@ -446,7 +457,7 @@ private void setBalance(long crypto_amount, int blockedUntil) { AndroidUtilities.runOnUIThread(this.setBalanceButtonText, 1000); } else { balanceButton.setSubText(null, true); - balanceButton.setText(StarsIntroActivity.replaceStars(balanceEditTextAll ? getString(R.string.BotStarsButtonWithdrawAll) : LocaleController.formatPluralStringComma("BotStarsButtonWithdraw", (int) balanceEditTextValue, ' '), starRef), true); + balanceButton.setText(StarsIntroActivity.replaceStars(balanceEditTextAll ? getString(R.string.BotStarsButtonWithdrawShortAll) : LocaleController.formatPluralStringComma("BotStarsButtonWithdrawShort", (int) balanceEditTextValue, ' '), starRef), true); } }; @@ -492,7 +503,8 @@ private void checkStats() { rate = stats.usd_rate; revenueChartData = StatisticActivity.createViewData(stats.revenue_graph, getString(R.string.BotStarsChartRevenue), 2); if (revenueChartData != null && revenueChartData.chartData != null && revenueChartData.chartData.lines != null && !revenueChartData.chartData.lines.isEmpty() && revenueChartData.chartData.lines.get(0) != null) { - revenueChartData.chartData.lines.get(0).colorKey = Theme.key_statisticChartLine_golden; + revenueChartData.showAll = true; + revenueChartData.chartData.lines.get(0).colorKey = Theme.key_color_yellow; revenueChartData.chartData.yRate = (float) (1.0 / rate / 100.0); } setBalance(stats.status.available_balance, stats.status.next_withdrawal_at); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsController.java b/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsController.java index f813d04358..ddfd69ba3d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsController.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsController.java @@ -79,6 +79,11 @@ public long getBalance(long bot_id) { return botStats == null ? 0 : botStats.status.current_balance; } + public long getAvailableBalance(long bot_id) { + TLRPC.TL_payments_starsRevenueStats botStats = getRevenueStats(bot_id); + return botStats == null ? 0 : botStats.status.available_balance; + } + public boolean isBalanceAvailable(long bot_id) { return getRevenueStats(bot_id) != null; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsController.java b/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsController.java index 534a9df696..4d0e7dec99 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsController.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsController.java @@ -668,7 +668,7 @@ private void payAfterConfirmed(MessageObject messageObject, TLRPC.InputInvoice i b.createSimpleBulletin(starDrawable, getString(R.string.StarsPurchaseCompleted), AndroidUtilities.replaceTags(formatPluralString("StarsPurchaseCompletedInfo", (int) stars, product, bot))).show(); } if (LaunchActivity.instance != null && LaunchActivity.instance.getFireworksOverlay() != null) { - LaunchActivity.instance.getFireworksOverlay().start(); + LaunchActivity.instance.getFireworksOverlay().start(true); } invalidateTransactions(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java index e8106ecae0..9abad43c63 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java @@ -1636,7 +1636,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } currentW += getChildAt(i).getMeasuredWidth(); } - setMeasuredDimension(getMeasuredWidth(), firstH + currentH + dp(16)); + setMeasuredDimension(getMeasuredWidth(), getChildCount() == 0 ? 0 : firstH + currentH + dp(16)); } @Override @@ -1999,7 +1999,11 @@ public void updateData(ChartViewData viewData, boolean enterTransition) { progressView.setVisibility(View.GONE); } - chartView.setData(viewData.chartData); + if (chartView.setData(viewData.chartData)) { + if (viewData.showAll) { + chartView.pickerDelegate.set(0f, 1f); + } + } chartHeaderView.setUseWeekInterval(viewData.useWeekFormat); chartView.legendSignatureView.setUseWeek(viewData.useWeekFormat); @@ -2191,6 +2195,7 @@ public static class ChartViewData { ChartData childChartData; String token; String zoomToken; + public boolean showAll; final int graphType; final String title; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java index 38c87082a6..c384d929a0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java @@ -2202,21 +2202,27 @@ private void startOpenAnimation() { openCloseAnimator = ValueAnimator.ofFloat(0, 1f); openCloseAnimator.addUpdateListener(animation -> { progressToOpen = (float) animation.getAnimatedValue(); - containerView.checkHwAcceleration(progressToOpen); + if (containerView != null) { + containerView.checkHwAcceleration(progressToOpen); + } checkNavBarColor(); if (windowView != null) { windowView.invalidate(); } }); locker.lock(); - containerView.enableHwAcceleration(); + if (containerView != null) { + containerView.enableHwAcceleration(); + } openCloseAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { progressToOpen = 1f; checkNavBarColor(); animationInProgress = false; - containerView.disableHwAcceleration(); + if (containerView != null) { + containerView.disableHwAcceleration(); + } if (windowView != null) { windowView.invalidate(); } @@ -2238,42 +2244,43 @@ public void onAnimationEnd(Animator animation) { showViewsAfterOpening = false; openViews(); } else if (!SharedConfig.storiesIntroShown) { - if (storiesIntro == null) { + if (storiesIntro == null && containerView != null) { storiesIntro = new StoriesIntro(containerView.getContext(), windowView); storiesIntro.setAlpha(0f); containerView.addView(storiesIntro); } - - storiesIntro.setOnClickListener(v -> { + if (storiesIntro != null) { + storiesIntro.setOnClickListener(v -> { + storiesIntro.animate() + .alpha(0f) + .setDuration(150L) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + if (storiesIntro != null) { + storiesIntro.stopAnimation(); + containerView.removeView(storiesIntro); + } + storiesIntro = null; + updatePlayingMode(); + } + }) + .start(); + }); storiesIntro.animate() - .alpha(0f) + .alpha(1f) .setDuration(150L) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); if (storiesIntro != null) { - storiesIntro.stopAnimation(); - containerView.removeView(storiesIntro); + storiesIntro.startAnimation(true); } - storiesIntro = null; - updatePlayingMode(); } - }) - .start(); - }); - storiesIntro.animate() - .alpha(1f) - .setDuration(150L) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - if (storiesIntro != null) { - storiesIntro.startAnimation(true); - } - } - }).start(); + }).start(); + } SharedConfig.setStoriesIntroShown(true); } @@ -2314,7 +2321,9 @@ public void instantClose() { } transitionViewHolder.storyImage = null; transitionViewHolder.avatarImage = null; - containerView.disableHwAcceleration(); + if (containerView != null) { + containerView.disableHwAcceleration(); + } locker.unlock(); if (currentPlayerScope != null) { currentPlayerScope.invalidate(); @@ -2366,17 +2375,21 @@ private void startCloseAnimation(boolean backAnimation) { if (openCloseAnimator == null) { return; } - containerView.enableHwAcceleration(); + if (containerView != null) { + containerView.enableHwAcceleration(); + } openCloseAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - containerView.disableHwAcceleration(); + if (containerView != null) { + containerView.disableHwAcceleration(); + } checkNavBarColor(); locker.unlock(); if (storiesIntro != null) { storiesIntro.stopAnimation(); - containerView.removeView(storiesIntro); + AndroidUtilities.removeFromParent(storiesIntro); storiesIntro = null; } if (transitionViewHolder.avatarImage != null) { @@ -2638,7 +2651,9 @@ public void setSelfStoriesViewsOffset(float currentTranslation) { if (peerStoriesView != null) { peerStoriesView.invalidate(); } - containerView.invalidate(); + if (containerView != null) { + containerView.invalidate(); + } } public void openViews() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java index 3d399fcdd1..77a916886e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java @@ -146,7 +146,7 @@ public void requestToken(String reason, Utilities.Callback2 whe public void updateToken(String reason, String token, Utilities.Callback whenDone) { prompt(reason, false, token, result -> { - boolean success = true; + boolean success = result != null; if (result != null) { try { BiometricPrompt.CryptoObject cryptoObject = result.getCryptoObject(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewAttachedSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewAttachedSheet.java index 41264821f6..c53e405627 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewAttachedSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewAttachedSheet.java @@ -250,9 +250,6 @@ public boolean restoreState(BaseFragment fragment, BottomSheetTabs.WebTabData ta if (backDrawable != null) { backDrawable.setRotation(backButtonShown ? 0f : 1f, false); } - if (settingsItem != null) { - settingsItem.setVisibility(tab.settings ? View.VISIBLE : View.GONE); - } if (tab.main != null) { setMainButton(tab.main); } @@ -288,6 +285,9 @@ public boolean restoreState(BaseFragment fragment, BottomSheetTabs.WebTabData ta tab.props.responseTime = 0; } requestWebView(fragment, tab.props); + if (settingsItem != null) { + settingsItem.setVisibility(tab.settings ? View.VISIBLE : View.GONE); + } return true; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java index 620f5e82c0..6132a7b38c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java @@ -249,6 +249,7 @@ public BottomSheetTabs.WebTabData saveState() { tab.backButton = backButtonShown; tab.main = mainButtonSettings; tab.confirmDismiss = needCloseConfirmation; + tab.settings = settingsItem != null && settingsItem.getVisibility() == View.VISIBLE; BotWebViewContainer.MyWebView webView = webViewContainer == null ? null : webViewContainer.getWebView(); if (webView != null) { webViewContainer.preserveWebView(); @@ -312,6 +313,9 @@ public boolean restoreState(BaseFragment fragment, BottomSheetTabs.WebTabData ta tab.props.responseTime = 0; } requestWebView(fragment, tab.props); + if (settingsItem != null) { + settingsItem.setVisibility(tab.settings ? View.VISIBLE : View.GONE); + } return true; } diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 995267ee84..f77d3a6827 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -9043,6 +9043,10 @@ https://telegram.org/privacy Withdraw via Fragment Withdraw all via Fragment + Withdraw all + Withdraw ⭐️%d + Withdraw ⭐️%d + Withdraw Enter amount to withdraw Withdraw ⭐️%d via Fragment Withdraw ⭐️%d via Fragment diff --git a/buildSrc/src/main/kotlin/Version.kt b/buildSrc/src/main/kotlin/Version.kt index dfd7dce409..60144dd794 100644 --- a/buildSrc/src/main/kotlin/Version.kt +++ b/buildSrc/src/main/kotlin/Version.kt @@ -25,8 +25,8 @@ object Version { val java = JavaVersion.VERSION_17 @JvmStatic - val officialVersionName = "10.14.3" + val officialVersionName = "10.14.5" @JvmStatic - val isStable = false + val isStable = true }