From 4989e90a1a4b554a3ca73946d67784a965ae14da Mon Sep 17 00:00:00 2001
From: NekoInverter <42698724+NekoInverter@users.noreply.github.com>
Date: Sat, 18 Jan 2020 19:57:04 +0800
Subject: [PATCH] view message details
---
TMessagesProj/build.gradle | 1 +
.../java/org/telegram/ui/ChatActivity.java | 27 +-
.../nekogram/MessageDetailsActivity.java | 423 ++++++++++++++++++
.../java/tw/nekomimi/nekogram/NekoConfig.java | 10 +
.../nekogram/NekoSettingsActivity.java | 15 +-
.../src/main/res/values/strings_neko.xml | 2 +
6 files changed, 464 insertions(+), 14 deletions(-)
create mode 100644 TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageDetailsActivity.java
diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle
index bb49599d0..9a0583cbd 100644
--- a/TMessagesProj/build.gradle
+++ b/TMessagesProj/build.gradle
@@ -31,6 +31,7 @@ dependencies {
implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.googlecode.mp4parser:isoparser:1.0.6'
implementation 'com.stripe:stripe-android:2.0.2'
+ implementation 'com.google.code.gson:gson:2.8.6'
implementation files('libs/libgsaverification-client.aar')
}
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
index 09a5f32c7..2a8dddd7e 100644
--- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
+++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
@@ -196,6 +196,7 @@ import org.telegram.ui.Components.URLSpanUserMention;
import org.telegram.ui.Components.UndoView;
import org.telegram.ui.Components.voip.VoIPHelper;
+import tw.nekomimi.nekogram.MessageDetailsActivity;
import tw.nekomimi.nekogram.MessageHelper;
import tw.nekomimi.nekogram.NekoConfig;
@@ -13723,17 +13724,18 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
boolean allowRepeat = currentUser != null
|| (currentChat != null && ChatObject.canSendMessages(currentChat));
- boolean allowPrpr = currentUser != null
- || (currentChat != null && ChatObject.canSendMessages(currentChat) && !currentChat.broadcast &&
- message.isFromUser());
- boolean allowViewHistory = currentUser == null
- && (currentChat != null && !currentChat.broadcast && message.isFromUser());
-
if (allowRepeat) {
items.add(LocaleController.getString("Repeat", R.string.Repeat));
options.add(94);
icons.add(R.drawable.msg_repeat);
}
+ }
+ if (!inScheduleMode) {
+ boolean allowPrpr = currentUser != null
+ || (currentChat != null && ChatObject.canSendMessages(currentChat) && !currentChat.broadcast &&
+ message.isFromUser());
+ boolean allowViewHistory = currentUser == null
+ && (currentChat != null && !currentChat.broadcast && message.isFromUser());
if (allowPrpr && NekoConfig.showPrPr) {
items.add(LocaleController.getString("Prpr", R.string.Prpr));
options.add(92);
@@ -13744,6 +13746,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
options.add(90);
icons.add(R.drawable.menu_recent);
}
+ if (NekoConfig.showMessageDetails) {
+ items.add(LocaleController.getString("MessageDetails", R.string.MessageDetails));
+ options.add(89);
+ icons.add(R.drawable.menu_info);
+ }
}
if (allowUnpin) {
items.add(LocaleController.getString("UnpinMessage", R.string.UnpinMessage));
@@ -13805,11 +13812,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads));
options.add(10);
icons.add(R.drawable.msg_download);
- if (NekoConfig.showDeleteDownloadedFile) {
- items.add(LocaleController.getString("DeleteDownloadedFile", R.string.DeleteDownloadedFile));
- options.add(91);
- icons.add(R.drawable.menu_clearcache);
- }
items.add(LocaleController.getString("ShareFile", R.string.ShareFile));
options.add(6);
icons.add(R.drawable.msg_shareout);
@@ -14705,6 +14707,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
showDialog(builder.create());
break;
+ } case 89: {
+ presentFragment(new MessageDetailsActivity(selectedObject));
+ break;
} case 90: {
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(selectedObject.messageOwner.from_id);
getMediaDataController().searchMessagesInChat("", dialog_id, mergeDialogId, classGuid, 0, user);
diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageDetailsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageDetailsActivity.java
new file mode 100644
index 000000000..1886ec2f9
--- /dev/null
+++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageDetailsActivity.java
@@ -0,0 +1,423 @@
+package tw.nekomimi.nekogram;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.Toast;
+
+import androidx.core.content.FileProvider;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.gson.Gson;
+
+import org.telegram.messenger.AndroidUtilities;
+import org.telegram.messenger.BuildConfig;
+import org.telegram.messenger.ContactsController;
+import org.telegram.messenger.FileLoader;
+import org.telegram.messenger.FileLog;
+import org.telegram.messenger.LocaleController;
+import org.telegram.messenger.MessageObject;
+import org.telegram.messenger.R;
+import org.telegram.tgnet.TLRPC;
+import org.telegram.ui.ActionBar.ActionBar;
+import org.telegram.ui.ActionBar.BaseFragment;
+import org.telegram.ui.ActionBar.Theme;
+import org.telegram.ui.ActionBar.ThemeDescription;
+import org.telegram.ui.Cells.EmptyCell;
+import org.telegram.ui.Cells.HeaderCell;
+import org.telegram.ui.Cells.NotificationsCheckCell;
+import org.telegram.ui.Cells.ShadowSectionCell;
+import org.telegram.ui.Cells.TextCheckCell;
+import org.telegram.ui.Cells.TextDetailSettingsCell;
+import org.telegram.ui.Cells.TextSettingsCell;
+import org.telegram.ui.Components.LayoutHelper;
+import org.telegram.ui.Components.RecyclerListView;
+import org.telegram.ui.ProfileActivity;
+
+import java.io.File;
+import java.util.Date;
+
+public class MessageDetailsActivity extends BaseFragment {
+
+ private RecyclerListView listView;
+ private ListAdapter listAdapter;
+
+ private MessageObject messageObject;
+ private TLRPC.Chat fromChat;
+ private TLRPC.User fromUser;
+ private String filePath;
+ private String fileName;
+
+ private int rowCount;
+
+ private int idRow;
+ private int messageRow;
+ private int captionRow;
+ private int groupRow;
+ private int channelRow;
+ private int fromRow;
+ private int botRow;
+ private int dateRow;
+ private int editedRow;
+ private int forwardRow;
+ private int fileNameRow;
+ private int filePathRow;
+ private int fileSizeRow;
+ private int emptyRow;
+ private int exportRow;
+ private int endRow;
+
+ public MessageDetailsActivity(MessageObject messageObject) {
+ this.messageObject = messageObject;
+ if (messageObject.messageOwner.to_id != null && messageObject.messageOwner.to_id.channel_id != 0) {
+ fromChat = getMessagesController().getChat(messageObject.messageOwner.to_id.channel_id);
+ } else if (messageObject.messageOwner.to_id != null && messageObject.messageOwner.to_id.chat_id != 0) {
+ fromChat = getMessagesController().getChat(messageObject.messageOwner.to_id.chat_id);
+ }
+ if (messageObject.messageOwner.from_id != 0) {
+ fromUser = getMessagesController().getUser(messageObject.messageOwner.from_id);
+ }
+ filePath = messageObject.messageOwner.attachPath;
+ if (filePath != null && filePath.length() > 0) {
+ File temp = new File(filePath);
+ if (!temp.exists()) {
+ filePath = null;
+ }
+ }
+ if (filePath == null || filePath.length() == 0) {
+ filePath = FileLoader.getPathToMessage(messageObject.messageOwner).toString();
+ }
+ if (messageObject.messageOwner.media != null && messageObject.messageOwner.media.document != null) {
+ if (TextUtils.isEmpty(messageObject.messageOwner.media.document.file_name)) {
+ for (int a = 0; a < messageObject.messageOwner.media.document.attributes.size(); a++) {
+ if (messageObject.messageOwner.media.document.attributes.get(a) instanceof TLRPC.TL_documentAttributeFilename) {
+ fileName = messageObject.messageOwner.media.document.attributes.get(a).file_name;
+ }
+ }
+ } else {
+ fileName = messageObject.messageOwner.media.document.file_name;
+ }
+ }
+
+ }
+
+ @Override
+ public boolean onFragmentCreate() {
+ super.onFragmentCreate();
+
+ updateRows(false);
+
+ return true;
+ }
+
+ @SuppressLint("NewApi")
+ @Override
+ public View createView(Context context) {
+ actionBar.setBackButtonImage(R.drawable.ic_ab_back);
+ actionBar.setTitle(LocaleController.getString("MessageDetails", R.string.MessageDetails));
+
+ if (AndroidUtilities.isTablet()) {
+ actionBar.setOccupyStatusBar(false);
+ }
+ actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
+ @Override
+ public void onItemClick(int id) {
+ if (id == -1) {
+ finishFragment();
+ }
+ }
+ });
+
+ listAdapter = new ListAdapter(context);
+
+ fragmentView = new FrameLayout(context);
+ fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray));
+ FrameLayout frameLayout = (FrameLayout) fragmentView;
+
+ listView = new RecyclerListView(context);
+ listView.setVerticalScrollBarEnabled(false);
+ listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) {
+ @Override
+ public boolean supportsPredictiveItemAnimations() {
+ return false;
+ }
+ });
+ listView.setGlowColor(Theme.getColor(Theme.key_avatar_backgroundActionBarBlue));
+ listView.setAdapter(listAdapter);
+ listView.setItemAnimator(null);
+ listView.setLayoutAnimation(null);
+ frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT));
+ listView.setOnItemClickListener((view, position, x, y) -> {
+ if (position == exportRow) {
+ Gson gson = new Gson();
+ try {
+ AndroidUtilities.addToClipboard(gson.toJson(messageObject));
+ Toast.makeText(getParentActivity(), LocaleController.getString("TextCopied", R.string.TextCopied), Toast.LENGTH_SHORT).show();
+ } catch (Exception e) {
+ FileLog.e(e);
+ }
+ } else if (position != endRow && position != emptyRow) {
+ TextDetailSettingsCell textCell = (TextDetailSettingsCell) view;
+ try {
+ AndroidUtilities.addToClipboard(textCell.getValueTextView().getText());
+ Toast.makeText(getParentActivity(), LocaleController.getString("TextCopied", R.string.TextCopied), Toast.LENGTH_SHORT).show();
+ } catch (Exception e) {
+ FileLog.e(e);
+ }
+ }
+
+ });
+ listView.setOnItemLongClickListener((view, position) -> {
+ if (position == filePathRow) {
+ AndroidUtilities.runOnUIThread(() -> {
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType("application/octet-stream");
+ if (Build.VERSION.SDK_INT >= 24) {
+ try {
+ intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getParentActivity(), BuildConfig.APPLICATION_ID + ".provider", new File(filePath)));
+ intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ } catch (Exception ignore) {
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(filePath)));
+ }
+ } else {
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(filePath)));
+ }
+ startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500);
+ });
+ } else if (position == channelRow || position == groupRow) {
+ if (fromChat != null) {
+ Bundle args = new Bundle();
+ args.putInt("chat_id", fromChat.id);
+ ProfileActivity fragment = new ProfileActivity(args);
+ presentFragment(fragment);
+ }
+ } else if (position == fromRow) {
+ if (fromUser != null) {
+ Bundle args = new Bundle();
+ args.putInt("user_id", fromUser.id);
+ ProfileActivity fragment = new ProfileActivity(args);
+ presentFragment(fragment);
+ }
+ } else {
+ return false;
+ }
+ return true;
+ });
+ return fragmentView;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (listAdapter != null) {
+ listAdapter.notifyDataSetChanged();
+ }
+ }
+
+ private void updateRows(boolean notify) {
+ rowCount = 0;
+ idRow = rowCount++;
+ messageRow = TextUtils.isEmpty(messageObject.messageText) ? -1 : rowCount++;
+ captionRow = TextUtils.isEmpty(messageObject.caption) ? -1 : rowCount++;
+ groupRow = fromChat != null && !fromChat.broadcast ? rowCount++ : -1;
+ channelRow = fromChat != null && fromChat.broadcast ? rowCount++ : -1;
+ fromRow = fromUser != null || messageObject.messageOwner.post_author != null ? rowCount++ : -1;
+ botRow = fromUser != null && fromUser.bot ? rowCount++ : -1;
+ dateRow = messageObject.messageOwner.date != 0 ? rowCount++ : -1;
+ editedRow = messageObject.messageOwner.edit_date != 0 ? rowCount++ : -1;
+ forwardRow = messageObject.isForwarded() ? rowCount++ : -1;
+ fileNameRow = TextUtils.isEmpty(fileName) ? -1 : rowCount++;
+ filePathRow = TextUtils.isEmpty(filePath) ? -1 : rowCount++;
+ fileSizeRow = messageObject.getSize() != 0 ? rowCount++ : -1;
+ emptyRow = rowCount++;
+ exportRow = rowCount++;
+ endRow = rowCount++;
+ if (notify && listAdapter != null) {
+ listAdapter.notifyDataSetChanged();
+ }
+ }
+
+ @Override
+ public ThemeDescription[] getThemeDescriptions() {
+ return new ThemeDescription[]{
+ new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{EmptyCell.class, TextSettingsCell.class, TextCheckCell.class, HeaderCell.class, TextDetailSettingsCell.class, NotificationsCheckCell.class}, null, null, null, Theme.key_windowBackgroundWhite),
+ new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray),
+
+ new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_avatar_backgroundActionBarBlue),
+ new ThemeDescription(listView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_avatar_backgroundActionBarBlue),
+ new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_avatar_actionBarIconBlue),
+ new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle),
+ new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_avatar_actionBarSelectorBlue),
+ new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SUBMENUBACKGROUND, null, null, null, null, Theme.key_actionBarDefaultSubmenuBackground),
+ new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SUBMENUITEM, null, null, null, null, Theme.key_actionBarDefaultSubmenuItem),
+
+ new ThemeDescription(listView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector),
+
+ new ThemeDescription(listView, 0, new Class[]{View.class}, Theme.dividerPaint, null, null, Theme.key_divider),
+
+ new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow),
+
+ new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
+ new ThemeDescription(listView, 0, new Class[]{TextSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteValueText),
+
+ new ThemeDescription(listView, 0, new Class[]{TextDetailSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText),
+ new ThemeDescription(listView, 0, new Class[]{TextDetailSettingsCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2),
+ };
+ }
+
+ private class ListAdapter extends RecyclerListView.SelectionAdapter {
+
+ private Context mContext;
+
+ public ListAdapter(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public int getItemCount() {
+ return rowCount;
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ switch (holder.getItemViewType()) {
+ case 1: {
+ break;
+ }
+ case 2: {
+ TextDetailSettingsCell textCell = (TextDetailSettingsCell) holder.itemView;
+ textCell.setMultilineDetail(true);
+ boolean divider = position + 1 != emptyRow;
+ if (position == idRow) {
+ textCell.setTextAndValue("ID", String.valueOf(messageObject.messageOwner.id), divider);
+ } else if (position == messageRow) {
+ textCell.setTextWithEmojiAnd21Value("Message", messageObject.messageText, divider);
+ } else if (position == captionRow) {
+ textCell.setTextWithEmojiAnd21Value("Caption", messageObject.caption, divider);
+ } else if (position == channelRow || position == groupRow) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(fromChat.title);
+ builder.append("\n");
+ if (!TextUtils.isEmpty(fromChat.username)) {
+ builder.append("@");
+ builder.append(fromChat.username);
+ builder.append("\n");
+ }
+ builder.append(fromChat.id);
+ textCell.setTextWithEmojiAnd21Value(position == channelRow ? "Channel" : "Group", builder.toString(), divider);
+ } else if (position == fromRow) {
+ StringBuilder builder = new StringBuilder();
+ if (fromUser != null) {
+ builder.append(ContactsController.formatName(fromUser.first_name, fromUser.last_name));
+ builder.append("\n");
+ if (!TextUtils.isEmpty(fromUser.username)) {
+ builder.append("@");
+ builder.append(fromUser.username);
+ builder.append("\n");
+ }
+ builder.append(fromUser.id);
+ } else {
+ builder.append(messageObject.messageOwner.post_author);
+ }
+ textCell.setTextWithEmojiAnd21Value("From", builder.toString(), divider);
+ } else if (position == botRow) {
+ textCell.setTextWithEmojiAnd21Value("Bot", "Yes", divider);
+ } else if (position == dateRow) {
+ long date = (long) messageObject.messageOwner.date * 1000;
+ textCell.setTextWithEmojiAnd21Value("Date", LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.getInstance().formatterYear.format(new Date(date)), LocaleController.getInstance().formatterDay.format(new Date(date))), divider);
+ } else if (position == editedRow) {
+ long date = (long) messageObject.messageOwner.date * 1000;
+ textCell.setTextWithEmojiAnd21Value("Edited", LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.getInstance().formatterYear.format(new Date(date)), LocaleController.getInstance().formatterDay.format(new Date(date))), divider);
+ } else if (position == forwardRow) {
+ StringBuilder builder = new StringBuilder();
+ if (messageObject.messageOwner.fwd_from.channel_id != 0) {
+ TLRPC.Chat chat = getMessagesController().getChat(messageObject.messageOwner.fwd_from.channel_id);
+ builder.append(chat.title);
+ builder.append("\n");
+ if (!TextUtils.isEmpty(chat.username)) {
+ builder.append("@");
+ builder.append(chat.username);
+ builder.append("\n");
+ }
+ builder.append(chat.id);
+ } else if (messageObject.messageOwner.fwd_from.from_id != 0) {
+ TLRPC.User user = getMessagesController().getUser(messageObject.messageOwner.fwd_from.from_id);
+ builder.append(ContactsController.formatName(user.first_name, user.last_name));
+ builder.append("\n");
+ if (!TextUtils.isEmpty(user.username)) {
+ builder.append("@");
+ builder.append(user.username);
+ builder.append("\n");
+ }
+ builder.append(user.id);
+ } else if (!TextUtils.isEmpty(messageObject.messageOwner.fwd_from.from_name)) {
+ builder.append(messageObject.messageOwner.fwd_from.from_name);
+ }
+ textCell.setTextWithEmojiAnd21Value("Forward from", builder.toString(), divider);
+ } else if (position == fileNameRow) {
+ textCell.setTextWithEmojiAnd21Value("File name", fileName, divider);
+ } else if (position == filePathRow) {
+ textCell.setTextWithEmojiAnd21Value("File path", filePath, divider);
+ } else if (position == fileSizeRow) {
+ textCell.setTextWithEmojiAnd21Value("File size", AndroidUtilities.formatFileSize(messageObject.getSize()), divider);
+ }
+ break;
+ }
+ case 3: {
+ TextSettingsCell textCell = (TextSettingsCell) holder.itemView;
+ if (position == exportRow) {
+ textCell.setText(LocaleController.getString("ExportAsJson", R.string.ExportAsJson), false);
+ textCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText));
+ }
+ break;
+ }
+ }
+ }
+
+ @Override
+ public boolean isEnabled(RecyclerView.ViewHolder holder) {
+ int position = holder.getAdapterPosition();
+ return position != endRow && position != emptyRow;
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = null;
+ switch (viewType) {
+ case 1:
+ view = new ShadowSectionCell(mContext);
+ break;
+ case 2:
+ view = new TextDetailSettingsCell(mContext);
+ view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
+ break;
+ case 3:
+ view = new TextSettingsCell(mContext);
+ view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite));
+ break;
+ }
+ view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
+ return new RecyclerListView.Holder(view);
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ if (position == endRow || position == emptyRow) {
+ return 1;
+ } else if (position == exportRow) {
+ return 3;
+ } else {
+ return 2;
+ }
+ }
+ }
+}
diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java
index efd44111e..4ec9c30a1 100644
--- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java
+++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java
@@ -33,6 +33,7 @@ public class NekoConfig {
public static boolean showAdminActions = true;
public static boolean showChangePermissions = true;
public static boolean showDeleteDownloadedFile = true;
+ public static boolean showMessageDetails = false;
public static boolean xmas = false;
public static boolean newYear = false;
@@ -69,6 +70,7 @@ public class NekoConfig {
editor.putBoolean("showAdminActions", showAdminActions);
editor.putBoolean("showChangePermissions", showChangePermissions);
editor.putBoolean("showDeleteDownloadedFile", showDeleteDownloadedFile);
+ editor.putBoolean("showMessageDetails", showMessageDetails);
editor.putBoolean("xmas", xmas);
editor.putBoolean("newYear", newYear);
editor.putBoolean("newYearEve", newYearEve);
@@ -108,6 +110,7 @@ public class NekoConfig {
showAdminActions = preferences.getBoolean("showAdminActions", true);
showChangePermissions = preferences.getBoolean("showChangePermissions", true);
showDeleteDownloadedFile = preferences.getBoolean("showDeleteDownloadedFile", true);
+ showMessageDetails = preferences.getBoolean("showMessageDetails", false);
xmas = preferences.getBoolean("xmas", false);
newYear = preferences.getBoolean("newYear", false);
newYearEve = preferences.getBoolean("newYearEve", false);
@@ -175,6 +178,13 @@ public class NekoConfig {
editor.commit();
}
+ public static void toggleShowMessageDetails() {
+ showMessageDetails = !showMessageDetails;
+ SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("nekoconfig", Activity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putBoolean("showMessageDetails", showMessageDetails);
+ editor.commit();
+ }
public static void toggleIPv6() {
useIPv6 = !useIPv6;
diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java
index 27e2be49f..5a50b6a24 100644
--- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java
+++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java
@@ -74,6 +74,7 @@ public class NekoSettingsActivity extends BaseFragment {
private int showAdminActionsRow;
private int showChangePermissionsRow;
private int showDeleteDownloadedFileRow;
+ private int showMessageDetailsRow;
private int messageMenu2Row;
private int chatRow;
@@ -190,6 +191,11 @@ public class NekoSettingsActivity extends BaseFragment {
if (view instanceof TextCheckCell) {
((TextCheckCell) view).setChecked(NekoConfig.showDeleteDownloadedFile);
}
+ } else if (position == showMessageDetailsRow) {
+ NekoConfig.toggleShowMessageDetails();
+ if (view instanceof TextCheckCell) {
+ ((TextCheckCell) view).setChecked(NekoConfig.showMessageDetails);
+ }
} else if (position == showPrPrRow) {
NekoConfig.toggleShowPrPr();
if (view instanceof TextCheckCell) {
@@ -391,6 +397,7 @@ public class NekoSettingsActivity extends BaseFragment {
showAdminActionsRow = rowCount++;
showChangePermissionsRow = rowCount++;
showDeleteDownloadedFileRow = rowCount++;
+ showMessageDetailsRow = rowCount++;
messageMenu2Row = rowCount++;
settingsRow = rowCount++;
hidePhoneRow = rowCount++;
@@ -670,7 +677,9 @@ public class NekoSettingsActivity extends BaseFragment {
} else if (position == showChangePermissionsRow) {
textCell.setTextAndCheck(LocaleController.getString("ChangePermissions", R.string.ChangePermissions), NekoConfig.showChangePermissions, true);
} else if (position == showDeleteDownloadedFileRow) {
- textCell.setTextAndCheck(LocaleController.getString("DeleteDownloadedFile", R.string.DeleteDownloadedFile), NekoConfig.showDeleteDownloadedFile, false);
+ textCell.setTextAndCheck(LocaleController.getString("DeleteDownloadedFile", R.string.DeleteDownloadedFile), NekoConfig.showDeleteDownloadedFile, true);
+ } else if (position == showMessageDetailsRow) {
+ textCell.setTextAndCheck(LocaleController.getString("MessageDetails", R.string.MessageDetails), NekoConfig.showMessageDetails, false);
} else if (position == hidePhoneRow) {
textCell.setTextAndCheck(LocaleController.getString("HidePhone", R.string.HidePhone), NekoConfig.hidePhone, true);
} else if (position == inappCameraRow) {
@@ -742,7 +751,7 @@ public class NekoSettingsActivity extends BaseFragment {
position == newYearEveRow || position == fireworksRow || position == transparentStatusBarRow ||
position == hideProxySponsorChannelRow || position == saveCacheToPrivateDirectoryRow ||
(position == disableFilteringRow && sensitiveCanChange) || position == stickerSizeRow ||
- position == unlimitedFavedStickersRow;
+ position == unlimitedFavedStickersRow || position == showMessageDetailsRow;
}
@Override
@@ -794,7 +803,7 @@ public class NekoSettingsActivity extends BaseFragment {
position == ignoreBlockedRow || position == useSystemEmojiRow || position == typefaceRow ||
position == forceTabletRow || position == xmasRow || position == newYearRow || position == newYearEveRow ||
position == fireworksRow || position == saveCacheToPrivateDirectoryRow || position == unlimitedFavedStickersRow ||
- position == disableFilteringRow) {
+ position == disableFilteringRow || position == showMessageDetailsRow) {
return 3;
} else if (position == settingsRow || position == connectionRow || position == messageMenuRow || position == chatRow ||
position == experimentRow) {
diff --git a/TMessagesProj/src/main/res/values/strings_neko.xml b/TMessagesProj/src/main/res/values/strings_neko.xml
index 3de84c2b1..ababebe14 100644
--- a/TMessagesProj/src/main/res/values/strings_neko.xml
+++ b/TMessagesProj/src/main/res/values/strings_neko.xml
@@ -60,4 +60,6 @@
Experimental
Unlimited favored stickers
Add unlimited stickers to favorites. Stickers may not be synchronized to other devices.
+ Details
+ Export as JSON
\ No newline at end of file