From e1f250d08953693c9665f0ad3c5c406957056b29 Mon Sep 17 00:00:00 2001 From: waifucon Date: Wed, 7 Oct 2026 20:46:23 +0330 Subject: [PATCH 1/2] feat: show icon instead of channel alias --- .../telegram/ui/Cells/ChatMessageCell.java | 26 ++++++++++++++----- .../nekogram/helpers/TimeStringHelper.java | 8 ++++++ .../NekoExperimentalSettingsActivity.java | 8 ++++++ .../kotlin/xyz/nextalone/nagram/NaConfig.kt | 6 +++++ .../src/main/res/values/strings_na.xml | 1 + 5 files changed, 42 insertions(+), 7 deletions(-) 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 3363ad1510..44ea774f7d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -19074,17 +19074,29 @@ private void setMessageObjectInternal(MessageObject messageObject) { } else if (NekoConfig.labelChannelUser.Bool() && isMegagroup && currentChat != null && currentMessageObject.isSenderChannel()) { final String channelStr = NaConfig.INSTANCE.getCustomChannelLabel().String(); adminString = new SpannableStringBuilder(); - if (NekoConfig.channelAlias.Bool()) { - String aliasName = NekoXConfig.getChannelAlias(currentMessageObject.messageOwner.from_id.channel_id); - if (aliasName != null) { - adminString.append(aliasName + " ★"); + if (NaConfig.INSTANCE.getShowChannelIcon().Bool()) { + Drawable d = TimeStringHelper.getChannelDrawable(); + if (d != null) { + ColoredImageSpan span = new ColoredImageSpan(d, ColoredImageSpan.ALIGN_CENTER); + span.setSize((int) Math.ceil(Theme.chat_adminPaint.getTextSize())); + adminString.append(" "); + adminString.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + if (!NaConfig.INSTANCE.getShowChannelIcon().Bool()) { + if (NekoConfig.channelAlias.Bool()) { + String aliasName = NekoXConfig.getChannelAlias(currentMessageObject.messageOwner.from_id.channel_id); + if (aliasName != null) { + adminString.append(aliasName + " ★"); + } else { + adminString.append(channelStr); + } } else { adminString.append(channelStr); } - } else { - adminString.append(channelStr); } - adminWidth = (int) Math.ceil(Theme.chat_adminPaint.measureText(adminString.toString())); + StaticLayout staticLayout = new StaticLayout(adminString, Theme.chat_adminPaint, dp(300), Layout.Alignment.ALIGN_NORMAL, 0f, 0f, false); + adminWidth = (int) Math.ceil(staticLayout.getLineWidth(0)); nameWidth -= adminWidth; } else { adminString = null; diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/TimeStringHelper.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/TimeStringHelper.java index 24b9b26786..4835f145cc 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/TimeStringHelper.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/TimeStringHelper.java @@ -11,6 +11,7 @@ public class TimeStringHelper { public static Drawable forwardsDrawable; + public static Drawable channelDrawable; public static Drawable getForwardsDrawable() { if (forwardsDrawable == null) { @@ -18,4 +19,11 @@ public static Drawable getForwardsDrawable() { } return forwardsDrawable; } + + public static Drawable getChannelDrawable() { + if (channelDrawable == null) { + channelDrawable = Objects.requireNonNull(ContextCompat.getDrawable(ApplicationLoader.applicationContext, R.drawable.menu_broadcast)).mutate(); + } + return channelDrawable; + } } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java index c8c2ed01df..83c50ffb49 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java @@ -72,6 +72,7 @@ public class NekoExperimentalSettingsActivity extends BaseNekoXSettingsActivity // private final AbstractConfigCell useCustomEmojiRow = cellGroup.appendCell(new ConfigCellTextCheck(NekoConfig.useCustomEmoji)); private final AbstractConfigCell localQuoteColorRow = cellGroup.appendCell(new ConfigCellTextCheck(NaConfig.INSTANCE.getUseLocalQuoteColor())); private final AbstractConfigCell channelAliasRow = cellGroup.appendCell(new ConfigCellTextCheck(NekoConfig.channelAlias)); + private final AbstractConfigCell showChannelIconRow = cellGroup.appendCell(new ConfigCellTextCheck(NaConfig.INSTANCE.getShowChannelIcon())); private final AbstractConfigCell externalGhostModeRow = cellGroup.appendCell(new ConfigCellText("GhostMode", () -> { presentFragment(new NekoGhostModeActivity()); })); @@ -336,6 +337,8 @@ public View createView(Context context) { tooltip.showWithAction(0, UndoView.ACTION_NEED_RESATRT, null, null); } else if (key.equals(NaConfig.INSTANCE.getDisableStories().getKey())) { tooltip.showWithAction(0, UndoView.ACTION_NEED_RESATRT, null, null); + } else if (key.equals(NaConfig.INSTANCE.getShowChannelIcon().getKey())) { + updateRows(); } }; @@ -546,6 +549,11 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, boole protected void setCanNotChange() { super.setCanNotChange(); + cellGroup.rows.remove(customCustomChannelLabelRow); + if (!NaConfig.INSTANCE.getShowChannelIcon().Bool()) { + cellGroup.rows.add(cellGroup.rows.indexOf(showChannelIconRow) + 1, customCustomChannelLabelRow); + } + if (!NaConfig.INSTANCE.getShowHiddenFeature().Bool()) { cellGroup.rows.remove(localPremiumRow); cellGroup.rows.remove(localQuoteColorRow); diff --git a/TMessagesProj/src/main/kotlin/xyz/nextalone/nagram/NaConfig.kt b/TMessagesProj/src/main/kotlin/xyz/nextalone/nagram/NaConfig.kt index 96eb3e5e69..face4aca94 100644 --- a/TMessagesProj/src/main/kotlin/xyz/nextalone/nagram/NaConfig.kt +++ b/TMessagesProj/src/main/kotlin/xyz/nextalone/nagram/NaConfig.kt @@ -1425,6 +1425,12 @@ object NaConfig { ConfigItem.configTypeBool, false ) + val showChannelIcon = + addConfig( + "ShowChannelIcon", + ConfigItem.configTypeBool, + false + ) private fun addConfig( k: String, diff --git a/TMessagesProj/src/main/res/values/strings_na.xml b/TMessagesProj/src/main/res/values/strings_na.xml index a858832b3a..1e62d3352e 100644 --- a/TMessagesProj/src/main/res/values/strings_na.xml +++ b/TMessagesProj/src/main/res/values/strings_na.xml @@ -389,4 +389,5 @@ Older than %s Newer than %s Always send videos in HD + Show icon instead of channel alias From b6fd9a63eafbd526b691de7c6fd8dd7ff57a1e29 Mon Sep 17 00:00:00 2001 From: xtaodada Date: Thu, 8 Oct 2026 11:15:30 +0800 Subject: [PATCH 2/2] fix --- .../telegram/ui/Cells/ChatMessageCell.java | 24 ++++++++++--------- .../NekoExperimentalSettingsActivity.java | 6 ++--- 2 files changed, 16 insertions(+), 14 deletions(-) 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 44ea774f7d..cfc77b33fd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -19072,26 +19072,28 @@ private void setMessageObjectInternal(MessageObject messageObject) { if (isAdmin || isOwner) adminWidth += dp(12); nameWidth -= adminWidth; } else if (NekoConfig.labelChannelUser.Bool() && isMegagroup && currentChat != null && currentMessageObject.isSenderChannel()) { - final String channelStr = NaConfig.INSTANCE.getCustomChannelLabel().String(); adminString = new SpannableStringBuilder(); + String aliasName = null; + if (NekoConfig.channelAlias.Bool()) { + aliasName = NekoXConfig.getChannelAlias(currentMessageObject.messageOwner.from_id.channel_id); + if (aliasName != null) { + adminString.append(aliasName + " "); + } + } if (NaConfig.INSTANCE.getShowChannelIcon().Bool()) { Drawable d = TimeStringHelper.getChannelDrawable(); if (d != null) { ColoredImageSpan span = new ColoredImageSpan(d, ColoredImageSpan.ALIGN_CENTER); span.setSize((int) Math.ceil(Theme.chat_adminPaint.getTextSize())); adminString.append(" "); - adminString.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + var length = adminString.length(); + adminString.setSpan(span, length - 1, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } - } - if (!NaConfig.INSTANCE.getShowChannelIcon().Bool()) { - if (NekoConfig.channelAlias.Bool()) { - String aliasName = NekoXConfig.getChannelAlias(currentMessageObject.messageOwner.from_id.channel_id); - if (aliasName != null) { - adminString.append(aliasName + " ★"); - } else { - adminString.append(channelStr); - } + } else { + if (aliasName != null) { + adminString.append("★"); } else { + final String channelStr = NaConfig.INSTANCE.getCustomChannelLabel().String(); adminString.append(channelStr); } } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java index 83c50ffb49..9c8dc1ad3f 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java @@ -73,12 +73,12 @@ public class NekoExperimentalSettingsActivity extends BaseNekoXSettingsActivity private final AbstractConfigCell localQuoteColorRow = cellGroup.appendCell(new ConfigCellTextCheck(NaConfig.INSTANCE.getUseLocalQuoteColor())); private final AbstractConfigCell channelAliasRow = cellGroup.appendCell(new ConfigCellTextCheck(NekoConfig.channelAlias)); private final AbstractConfigCell showChannelIconRow = cellGroup.appendCell(new ConfigCellTextCheck(NaConfig.INSTANCE.getShowChannelIcon())); - private final AbstractConfigCell externalGhostModeRow = cellGroup.appendCell(new ConfigCellText("GhostMode", () -> { - presentFragment(new NekoGhostModeActivity()); - })); private final AbstractConfigCell customCustomChannelLabelRow = cellGroup.appendCell(new ConfigCellTextInput(null, NaConfig.INSTANCE.getCustomChannelLabel(), null, null, (input) -> input.isEmpty() ? (String) NaConfig.INSTANCE.getCustomChannelLabel().defaultValue : input)); + private final AbstractConfigCell externalGhostModeRow = cellGroup.appendCell(new ConfigCellText("GhostMode", () -> { + presentFragment(new NekoGhostModeActivity()); + })); // private final AbstractConfigCell smoothKeyboardRow = cellGroup.appendCell(new ConfigCellTextCheck(NekoConfig.smoothKeyboard)); private final AbstractConfigCell enhancedFileLoaderRow = cellGroup.appendCell(new ConfigCellTextCheck(NekoConfig.enhancedFileLoader));