diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java index efd0a2078..2129c0c3c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java @@ -30,11 +30,14 @@ import android.view.ViewGroup; import android.widget.TextView; import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Locale; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; import tw.nekomimi.nekogram.EmojiProvider; import tw.nekomimi.nekogram.NekoConfig; @@ -129,7 +132,14 @@ public class Emoji { } Bitmap bitmap = null; try { - InputStream is = ApplicationLoader.applicationContext.getAssets().open("emoji/" + String.format(Locale.US, "%d_%d.png", page, page2)); + InputStream is; + String entry = "emoji/" + String.format(Locale.US, "%d_%d.png", page, page2); + if (NekomuraConfig.useCustomEmoji.Bool()) { + entry = "custom_emoji/" + entry; + is = new FileInputStream(new File(ApplicationLoader.applicationContext.getFilesDir(), entry)); + } else { + is = ApplicationLoader.applicationContext.getAssets().open(entry); + } BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = false; opts.inSampleSize = imageResize; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java index 4450e1752..ef0170549 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java @@ -149,7 +149,6 @@ public class SharedConfig { public static boolean showNotificationsForAllAccounts = true; public static int repeatMode; public static boolean allowBigEmoji; - public static boolean useSystemEmoji; public static int fontSize = 12; public static int bubbleRadius = 3; public static int ivFontSize = 12; @@ -1206,7 +1205,6 @@ public class SharedConfig { bubbleRadius = preferences.getInt("bubbleRadius", 3); ivFontSize = preferences.getInt("iv_font_size", fontSize); allowBigEmoji = preferences.getBoolean("allowBigEmoji", true); - useSystemEmoji = preferences.getBoolean("useSystemEmoji", false); streamMedia = preferences.getBoolean("streamMedia", true); saveStreamMedia = preferences.getBoolean("saveStreamMedia", true); smoothKeyboard = preferences.getBoolean("smoothKeyboard2", true); @@ -1821,6 +1819,13 @@ public class SharedConfig { editor.commit(); } + public static void setSmoothKeyboard(boolean smoothKeyboard) { + SharedPreferences preferences = MessagesController.getGlobalMainSettings(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("smoothKeyboard2", smoothKeyboard); + editor.commit(); + } + public static void togglePauseMusicOnRecord() { pauseMusicOnRecord = !pauseMusicOnRecord; SharedPreferences preferences = MessagesController.getGlobalMainSettings(); 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 36c93ec48..a54a25b57 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java @@ -4,18 +4,28 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.os.Parcelable; +import android.provider.DocumentsContract; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; +import android.widget.Toast; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaController; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.tgnet.TLRPC; @@ -37,12 +47,16 @@ import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.UndoView; +import java.io.File; +import java.io.FileInputStream; import java.util.ArrayList; import kotlin.Unit; import tw.nekomimi.nekogram.PopupBuilder; +import tw.nekomimi.nekogram.utils.ZipUtil; import tw.nekomimi.nkmr.NekomuraConfig; import tw.nekomimi.nkmr.CellGroup; +import tw.nekomimi.nkmr.NekomuraUtil; import tw.nekomimi.nkmr.cells.AbstractCell; import tw.nekomimi.nkmr.cells.*; @@ -59,6 +73,8 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { private final CellGroup cellGroup = new CellGroup(this); private final AbstractCell header1 = cellGroup.appendCell(new NekomuraTGHeader(LocaleController.getString("Experiment"))); + private final AbstractCell useSystemEmojiRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.useSystemEmoji)); + private final AbstractCell useCustomEmojiRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.useCustomEmoji)); private final AbstractCell smoothKeyboardRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.smoothKeyboard)); private final AbstractCell increaseVoiceMessageQualityRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.increaseVoiceMessageQuality)); private final AbstractCell mediaPreviewRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.mediaPreview)); @@ -188,9 +204,7 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { // Cells: Set OnSettingChanged Callbacks cellGroup.callBackSettingsChanged = (key, newValue) -> { if (key.equals(NekomuraConfig.smoothKeyboard.getKey())) { - if ((boolean) newValue != NekomuraConfig.smoothKeyboard.Bool()) { - SharedConfig.toggleSmoothKeyboard(); - } + SharedConfig.setSmoothKeyboard((boolean) newValue); if (SharedConfig.smoothKeyboard && getParentActivity() != null) { getParentActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); } @@ -208,8 +222,18 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { tooltip.setInfoText(AndroidUtilities.replaceTags(LocaleController.formatString("EnableStickerPinTip", R.string.EnableStickerPinTip))); tooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null); } - } + } else if (key.equals(NekomuraConfig.useCustomEmoji.getKey())) { + // Check + if (!(boolean) newValue) return; + NekomuraConfig.useCustomEmoji.setConfigBool(false); + // Open picker + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("application/zip"); + Activity act = getParentActivity(); + act.startActivityFromChild(act, intent, 114); + } }; //Cells: Set ListAdapter @@ -221,6 +245,40 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { return fragmentView; } + @Override + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { + if (requestCode == 114 && resultCode == Activity.RESULT_OK) { + try { + // copy emoji zip + Uri uri = data.getData(); + String zipPath = MediaController.copyFileToCache(uri, "file"); + + if (zipPath == null || zipPath.isEmpty()) { + throw new Exception("zip copy failed"); + } + + //dirs + File dir = new File(ApplicationLoader.applicationContext.getFilesDir(), "custom_emoji"); + if (dir.exists()) { + NekomuraUtil.deleteDirectory(dir); + } + dir.mkdir(); + + //process zip + ZipUtil.unzip(new FileInputStream(zipPath), dir); + if (!new File(ApplicationLoader.applicationContext.getFilesDir(), "custom_emoji/emoji/0_0.png").exists()) { + throw new Exception(LocaleController.getString("useCustomEmojiInvalid")); + } + NekomuraConfig.useCustomEmoji.setConfigBool(true); + } catch (Exception e) { + FileLog.e(e); + NekomuraConfig.useCustomEmoji.setConfigBool(false); + Toast.makeText(ApplicationLoader.applicationContext, "Failed: " + e.toString(), Toast.LENGTH_LONG).show(); + } + listAdapter.notifyItemChanged(cellGroup.rows.indexOf(useCustomEmojiRow)); + } + } + @Override public void onResume() { super.onResume(); diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java index e3f8fa393..fce65c66f 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoGeneralSettingsActivity.java @@ -126,7 +126,6 @@ public class NekoGeneralSettingsActivity extends BaseFragment { private final AbstractCell header5 = cellGroup.appendCell(new NekomuraTGHeader(LocaleController.getString("Appearance"))); private final AbstractCell typefaceRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.typeface)); private final AbstractCell useDefaultThemeRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.useDefaultTheme)); - private final AbstractCell useSystemEmojiRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.useSystemEmoji)); private final AbstractCell transparentStatusBarRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.transparentStatusBar)); private final AbstractCell appBarShadowRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.disableAppBarShadow)); private final AbstractCell newYearRow = cellGroup.appendCell(new NekomuraTGTextCheck(NekomuraConfig.newYear)); diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraConfig.java b/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraConfig.java index 2d0105fa2..300311906 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraConfig.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraConfig.java @@ -43,6 +43,7 @@ public class NekomuraConfig { public static ConfigItem unreadBadgeOnBackButton = addConfig("unreadBadgeOnBackButton", configTypeBool, false); public static ConfigItem customPublicProxyIP = addConfig("customPublicProxyIP", configTypeString, ""); public static ConfigItem update_download_soucre = addConfig("update_download_soucre", configTypeInt, 0); // 0: Github 1: Channel 2:CDNDrive + public static ConfigItem useCustomEmoji = addConfig("useCustomEmoji", configTypeBool, false); // From NekoConfig // TODO sort diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraUtil.java b/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraUtil.java index fb598fde4..4b080613b 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraUtil.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nkmr/NekomuraUtil.java @@ -166,4 +166,14 @@ public class NekomuraUtil { return out.toByteArray(); } + public static boolean deleteDirectory(File directoryToBeDeleted) { + File[] allContents = directoryToBeDeleted.listFiles(); + if (allContents != null) { + for (File file : allContents) { + deleteDirectory(file); + } + } + return directoryToBeDeleted.delete(); + } + } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nkmr/cells/NekomuraTGTextCheck.java b/TMessagesProj/src/main/java/tw/nekomimi/nkmr/cells/NekomuraTGTextCheck.java index 374f785bb..72e9cc7ed 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nkmr/cells/NekomuraTGTextCheck.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nkmr/cells/NekomuraTGTextCheck.java @@ -27,6 +27,12 @@ public class NekomuraTGTextCheck extends AbstractCell { this.subtitle = subtitle; } + public NekomuraTGTextCheck(ConfigItem bind, String subtitle, String customTitle) { + this.bindConfig = bind; + this.title = customTitle; + this.subtitle = subtitle; + } + public int getType() { return CellGroup.ITEM_TYPE_TEXT_CHECK; } diff --git a/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml b/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml index c31028cce..ea34e8dca 100644 --- a/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml @@ -257,6 +257,8 @@ 已删除 外部文件被跳过。 选择更新源 + 使用自定义 emoji + 不是有效的 emoji zip 文件 Telegram 默认\n使用头像作为背景\n使用大只头像作为背景 \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/strings_nekox.xml b/TMessagesProj/src/main/res/values/strings_nekox.xml index 30b346043..4faece81d 100644 --- a/TMessagesProj/src/main/res/values/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values/strings_nekox.xml @@ -254,6 +254,8 @@ Deleted External file is skipped. Select download soucre + Use Custom Emoji + Not a vaild emoji zip. Telegram Default\nAvatar as background\nBig avatar as background Hide sponsored messages