diff --git a/app/src/main/java/cc/hicore/Utils/XLog.java b/app/src/main/java/cc/hicore/Utils/XLog.java index fd39bcaaf8..8e0f0002e6 100644 --- a/app/src/main/java/cc/hicore/Utils/XLog.java +++ b/app/src/main/java/cc/hicore/Utils/XLog.java @@ -28,6 +28,9 @@ public class XLog { public static void e(String TAG,Throwable msg){ Log.e("[QAuxv]"+"("+TAG+")"+Log.getStackTraceString(msg)); } + public static void e(String TAG,String TAG2,Throwable msg){ + e(TAG+"."+TAG2,msg); + } public static void e(String TAG,String msg){ Log.e("[QAuxv]"+"("+TAG+")"+msg); } diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/EmoOnlineLoader.java b/app/src/main/java/cc/hicore/hook/stickerPanel/EmoOnlineLoader.java index 92a4e77842..ee7a19beb4 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/EmoOnlineLoader.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/EmoOnlineLoader.java @@ -10,8 +10,6 @@ import java.util.concurrent.Executors; public class EmoOnlineLoader { - static ExecutorService savePool = Executors.newFixedThreadPool(16); - static ExecutorService savePoolSingle = Executors.newSingleThreadExecutor(); public static ExecutorService syncThread = Executors.newFixedThreadPool(16); public static void submit(EmoPanel.EmoInfo info, Runnable run) { @@ -34,25 +32,4 @@ public static void submit(EmoPanel.EmoInfo info, Runnable run) { }); } - - public static void submit2(EmoPanel.EmoInfo info, Runnable run) { - savePool.submit(() -> { - try { - String CacheDir = Env.app_save_path+ "/Cache/img_" + info.MD5; - if (info.MD5.equals(DataUtils.getFileMD5(new File(CacheDir)))) { - info.Path = CacheDir; - new Handler(Looper.getMainLooper()).post(run); - return; - } - new File(CacheDir).delete(); - - HttpUtils.DownloadToFile(info.URL, CacheDir); - info.Path = CacheDir; - new Handler(Looper.getMainLooper()).post(run); - } catch (Throwable th) { - new Handler(Looper.getMainLooper()).post(run); - } - - }); - } } diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/EmoPanel.java b/app/src/main/java/cc/hicore/hook/stickerPanel/EmoPanel.java index ab6b6944ef..530ad3a8f4 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/EmoPanel.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/EmoPanel.java @@ -4,11 +4,9 @@ public class EmoPanel { public static class EmoInfo { public String Path; - public String OCR; public int type; public String MD5; public String URL; - public String thumb; } diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/Hooker/StickerPanelEntryHooker.java b/app/src/main/java/cc/hicore/hook/stickerPanel/Hooker/StickerPanelEntryHooker.java index 0d5ec50aca..ffe6bcd9e2 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/Hooker/StickerPanelEntryHooker.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/Hooker/StickerPanelEntryHooker.java @@ -23,6 +23,7 @@ package cc.hicore.hook.stickerPanel.Hooker; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import androidx.annotation.NonNull; @@ -56,6 +57,7 @@ import io.github.qauxv.util.dexkit.ChatPanel_InitPanel_QQNT; import io.github.qauxv.util.dexkit.DexKit; import io.github.qauxv.util.dexkit.DexKitTarget; +import io.github.qauxv.util.dexkit.Guild_Emo_Btn_Create_QQNT; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; @@ -70,7 +72,8 @@ public class StickerPanelEntryHooker extends CommonSwitchFunctionHook implements private StickerPanelEntryHooker() { super(new DexKitTarget[]{ ChatPanel_InitPanel_QQNT.INSTANCE, - AbstractQQCustomMenuItem.INSTANCE + AbstractQQCustomMenuItem.INSTANCE, + Guild_Emo_Btn_Create_QQNT.INSTANCE }); } @@ -103,6 +106,19 @@ protected boolean initOnce() throws Exception { } }); + HookUtils.hookAfterIfEnabled(this,DexKit.loadMethodFromCache(Guild_Emo_Btn_Create_QQNT.INSTANCE),param -> { + ViewGroup vg = (ViewGroup) param.getResult(); + for (int i = 0; i < vg.getChildCount(); i++) { + View v = vg.getChildAt(i); + if (v instanceof ImageView) { + v.setOnLongClickListener(v1 -> { + ICreator.createPanel(v1.getContext()); + return true; + }); + } + } + }); + HookUtils.hookAfterIfEnabled(this, MMethod.FindMethod(Initiator.loadClass("com.tencent.qqnt.aio.shortcutbar.PanelIconLinearLayout"), null, ImageView.class, diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/ICreator.java b/app/src/main/java/cc/hicore/hook/stickerPanel/ICreator.java index cabc639c17..d59d2d94fd 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/ICreator.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/ICreator.java @@ -34,11 +34,8 @@ public class ICreator extends BottomPopupView implements AbsListView.OnScrollListener { private static BasePopupView popupView; MainPanelAdapter adapter = new MainPanelAdapter(); - int IdOfShareGroup; LinearLayout topSelectBar; - int myLovePos = 0; int recentUsePos = 0; - int IdOfConvertFromTg; int IdOfInputPic; private final List newTabView = new ArrayList<>(); @@ -89,18 +86,6 @@ private void initStickerPacks() { } private void initDefItemsBefore() { - /* - ViewGroup likeTab = (ViewGroup) createPicImage(R.drawable.sticker_like,"收藏表情", v->{ - listView.setSelection(myLovePos); - listView.smoothScrollToPositionFromTop(myLovePos,-5); - }); - myLovePos = adapter.addItemData(new MyLoveStickerImpl()); - likeTab.setTag(myLovePos); - topSelectBar.addView(likeTab); - - */ - - ViewGroup recentUse = (ViewGroup) createPicImage(R.drawable.sticker_recent, "最近使用", v -> { listView.setSelection(recentUsePos); listView.smoothScrollToPositionFromTop(recentUsePos, -5); diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/LocalDataHelper.java b/app/src/main/java/cc/hicore/hook/stickerPanel/LocalDataHelper.java index 58cb5f50b7..6684f86e41 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/LocalDataHelper.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/LocalDataHelper.java @@ -24,9 +24,7 @@ public static List readPaths() { localPath.Name = path.getString("Name"); localPath.storePath = path.getString("storePath"); paths.add(localPath); - } catch (Exception e) { - - } + } catch (Exception ignored) { } } return paths; } catch (Exception e) { @@ -54,9 +52,7 @@ public synchronized static List getPicItems(String pathName) { localPath.thumbUrl = path.optString("thumbUrl"); localPath.ocr = path.optString("ocr"); items.add(localPath); - } catch (Exception e) { - - } + } catch (Exception ignored) { } } return items; diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/InputFromLocalImpl.java b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/InputFromLocalImpl.java index 7ff7e409cb..991908b747 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/InputFromLocalImpl.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/InputFromLocalImpl.java @@ -1,7 +1,6 @@ package cc.hicore.hook.stickerPanel.MainItemImpl; import android.app.AlertDialog; -import android.app.ProgressDialog; import android.content.Context; import android.graphics.BitmapFactory; import android.text.TextUtils; @@ -9,6 +8,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import cc.hicore.Utils.ContextUtils; import cc.hicore.Utils.DataUtils; import cc.hicore.Utils.FileUtils; import cc.hicore.Utils.RandomUtils; @@ -16,6 +16,8 @@ import cc.hicore.hook.stickerPanel.LocalDataHelper; import cc.hicore.hook.stickerPanel.MainPanelAdapter; import cc.ioctl.util.ui.FaultyDialog; +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.impl.LoadingPopupView; import io.github.qauxv.R; import io.github.qauxv.ui.CommonContextWrapper; import io.github.qauxv.util.SyncUtils; @@ -39,9 +41,8 @@ public View getView(ViewGroup parent) { new AlertDialog.Builder(CommonContextWrapper.createAppCompatContext(parent.getContext())) .setTitle("输入分组名称") .setView(ed) - .setPositiveButton("确定导入", (dialog, which) -> { - inputWorker(parent.getContext(), path, ed.getText().toString()); - }).setNeutralButton("取消", null) + .setPositiveButton("确定导入", (dialog, which) -> inputWorker(parent.getContext(), path, ed.getText().toString())) + .setNeutralButton("取消", null) .show(); } @@ -54,16 +55,18 @@ private static void inputWorker(Context context, String path, String name) { FaultyDialog.show(context, "错误", "名称不能为空"); return; } - ProgressDialog progressDialog = new ProgressDialog(CommonContextWrapper.createAppCompatContext(context)); - progressDialog.setTitle("正在导入..."); - progressDialog.setCancelable(false); - progressDialog.show(); + LoadingPopupView progress = new XPopup.Builder(ContextUtils.getFixContext(CommonContextWrapper.createAppCompatContext(context))) + .dismissOnBackPressed(false) + .dismissOnTouchOutside(false) + .asLoading("正在导入..."); + + progress.show(); SyncUtils.async(() -> { File[] f = new File(path).listFiles(); if (f == null) { SyncUtils.runOnUiThread(() -> { - progressDialog.dismiss(); + progress.dismiss(); FaultyDialog.show(context, "错误", "路径无效"); }); return; @@ -101,9 +104,7 @@ private static void inputWorker(Context context, String path, String name) { finish++; int finalFinish = finish; int finalAvailable = available; - SyncUtils.runOnUiThread(() -> { - progressDialog.setMessage("已完成" + finalFinish + "/" + size + "个文件,有效文件" + finalAvailable + "个"); - }); + SyncUtils.runOnUiThread(() -> progress.setTitle("已完成" + finalFinish + "/" + size + "个文件,有效文件" + finalAvailable + "个")); } List list = LocalDataHelper.getPicItems(ID); @@ -111,20 +112,13 @@ private static void inputWorker(Context context, String path, String name) { LocalDataHelper.setPathCover(newPath, list.get(0)); } SyncUtils.runOnUiThread(() -> { - progressDialog.dismiss(); + progress.dismiss(); FaultyDialog.show(context, "导入完成", "导入完成"); ICreator.dismissAll(); }); }); } - private static boolean isImageFile(String filePath) { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inJustDecodeBounds = true; - BitmapFactory.decodeFile(filePath, options); - return options.outWidth != -1; - } - @Override public void onViewDestroy(ViewGroup parent) { diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/LocalStickerImpl.java b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/LocalStickerImpl.java index b5e78a4161..ea80f261b3 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/LocalStickerImpl.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/LocalStickerImpl.java @@ -1,7 +1,6 @@ package cc.hicore.hook.stickerPanel.MainItemImpl; import android.app.AlertDialog; -import android.app.ProgressDialog; import android.content.Context; import android.text.TextUtils; import android.util.Log; @@ -11,6 +10,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import cc.hicore.Env; +import cc.hicore.Utils.ContextUtils; import cc.hicore.Utils.HttpUtils; import cc.hicore.hook.stickerPanel.Hooker.StickerPanelEntryHooker; import cc.hicore.hook.stickerPanel.ICreator; @@ -23,14 +23,15 @@ import cc.ioctl.util.LayoutHelper; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.impl.LoadingPopupView; +import com.tencent.qqnt.kernel.nativeinterface.Contact; import de.robv.android.xposed.XposedBridge; import io.github.qauxv.R; import io.github.qauxv.ui.CommonContextWrapper; import io.github.qauxv.util.SyncUtils; import io.github.qauxv.util.Toasts; import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; import java.util.HashSet; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -68,7 +69,7 @@ public LocalStickerImpl(LocalDataHelper.LocalPath pathInfo, List { try { ExecutorService threadPool = Executors.newFixedThreadPool(8); @@ -142,16 +144,16 @@ private void updateAllResToLocal() { XposedBridge.log(Log.getStackTraceString(e)); } finally { latch.countDown(); - SyncUtils.runOnUiThread(() -> progressDialog.setMessage("正在更新表情包,请稍等...(" + finishCount.getAndIncrement() + "/" + mPicItems.size() + ")")); + SyncUtils.runOnUiThread(() -> progress.setTitle("正在更新表情包,请稍等...(" + finishCount.getAndIncrement() + "/" + mPicItems.size() + ")")); } }); } latch.await(); - SyncUtils.runOnUiThread(progressDialog::dismiss); + SyncUtils.runOnUiThread(progress::dismiss); Toasts.info(mContext,"已更新完成"); SyncUtils.runOnUiThread(ICreator::dismissAll); - } catch (Exception e) { + } catch (Exception ignored) { } }).start(); @@ -164,8 +166,8 @@ public View getView(ViewGroup parent) { } private View getItemContainer(Context context, String coverView, int count, LocalDataHelper.LocalPicItems item) { - int width_item = LayoutHelper.getScreenWidth(context) / 6; - int item_distance = (LayoutHelper.getScreenWidth(context) - width_item * 5) / 4; + int sizeLength = LayoutHelper.getScreenWidth(context) / 6; + int item_distance = (LayoutHelper.getScreenWidth(context) - sizeLength * 5) / 4; ImageView img = new ImageView(context); ViewInfo info = new ViewInfo(); @@ -174,7 +176,7 @@ private View getItemContainer(Context context, String coverView, int count, Loca cacheImageView.add(info); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width_item, width_item); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(sizeLength, sizeLength); if (count > 0) params.leftMargin = item_distance; img.setLayoutParams(params); @@ -182,16 +184,20 @@ private View getItemContainer(Context context, String coverView, int count, Loca img.setOnClickListener(v -> { if (coverView.startsWith("http://") || coverView.startsWith("https://")) { HttpUtils.ProgressDownload(coverView, Env.app_save_path + "Cache/" + coverView.substring(coverView.lastIndexOf("/")), () -> { - MsgSender.send_pic(SessionUtils.AIOParam2CommonChat(StickerPanelEntryHooker.AIOParam), Env.app_save_path + "Cache/" + coverView.substring(coverView.lastIndexOf("/"))); + MsgSender.send_pic_by_contact(SessionUtils.AIOParam2Contact(StickerPanelEntryHooker.AIOParam), Env.app_save_path + "Cache/" + coverView.substring(coverView.lastIndexOf("/"))); RecentStickerHelper.addPicItemToRecentRecord(mPathInfo, item); }, mContext); ICreator.dismissAll(); } else { - MsgSender.send_pic(SessionUtils.AIOParam2CommonChat(StickerPanelEntryHooker.AIOParam), - LocalDataHelper.getLocalItemPath(mPathInfo, item)); - RecentStickerHelper.addPicItemToRecentRecord(mPathInfo, item); - ICreator.dismissAll(); + Contact contact = SessionUtils.AIOParam2Contact(StickerPanelEntryHooker.AIOParam); + if (contact != null){ + MsgSender.send_pic_by_contact(contact, + LocalDataHelper.getLocalItemPath(mPathInfo, item)); + RecentStickerHelper.addPicItemToRecentRecord(mPathInfo, item); + ICreator.dismissAll(); + } + } }); @@ -200,20 +206,14 @@ private View getItemContainer(Context context, String coverView, int count, Loca preView.setScaleType(ImageView.ScaleType.FIT_CENTER); preView.setLayoutParams(new ViewGroup.LayoutParams(LayoutHelper.getScreenWidth(v.getContext()) / 2, LayoutHelper.getScreenWidth(v.getContext()) / 2)); if (coverView.startsWith("http://") || coverView.startsWith("https://")) { - try { - Glide.with(HostInfo.getApplication()).load(new URL(coverView)).override(LayoutHelper.getScreenWidth(v.getContext()) / 2, LayoutHelper.getScreenWidth(v.getContext()) / 2).into(preView); - } catch (MalformedURLException e) { - e.printStackTrace(); - } + Glide.with(HostInfo.getApplication()).load(coverView).override(LayoutHelper.getScreenWidth(v.getContext()) / 2, LayoutHelper.getScreenWidth(v.getContext()) / 2).into(preView); } else { Glide.with(HostInfo.getApplication()).load(coverView).fitCenter().diskCacheStrategy(DiskCacheStrategy.RESOURCE).override(LayoutHelper.getScreenWidth(v.getContext()) / 2, LayoutHelper.getScreenWidth(v.getContext()) / 2).into(preView); } new AlertDialog.Builder(CommonContextWrapper.createAppCompatContext(mContext)) .setTitle("选择你对该表情的操作") .setView(preView) - .setOnDismissListener(dialog -> { - Glide.with(HostInfo.getApplication()).clear(preView); - }).setNegativeButton("删除该表情", (dialog, which) -> { + .setOnDismissListener(dialog -> Glide.with(HostInfo.getApplication()).clear(preView)).setNegativeButton("删除该表情", (dialog, which) -> { LocalDataHelper.deletePicItem(mPathInfo, item); ICreator.dismissAll(); }).setNeutralButton("设置为标题预览", (dialog, which) -> { @@ -246,21 +246,16 @@ public void notifyViewUpdate0() { if (LayoutHelper.isSmallWindowNeedPlay(v.view)) { if (v.status != 1) { v.status = 1; - int width_item = LayoutHelper.getScreenWidth(mContext) / 6; + int item_size = LayoutHelper.getScreenWidth(mContext) / 6; String coverView = (String) v.view.getTag(); - try { - if (coverView.startsWith("http://") || coverView.startsWith("https://")) { - Glide.with(HostInfo.getApplication()).load(new URL(coverView)).override(width_item, width_item).into(v.view); - } else { - if(new File(coverView + "_thumb").exists()){ - Glide.with(HostInfo.getApplication()).load(coverView + "_thumb").fitCenter().diskCacheStrategy(DiskCacheStrategy.RESOURCE).override(width_item, width_item).into(v.view); - }else { - Glide.with(HostInfo.getApplication()).load(coverView).fitCenter().diskCacheStrategy(DiskCacheStrategy.RESOURCE).override(width_item, width_item).into(v.view); - } - + if (coverView.startsWith("http://") || coverView.startsWith("https://")) { + Glide.with(HostInfo.getApplication()).load(coverView).override(item_size, item_size).into(v.view); + } else { + if(new File(coverView + "_thumb").exists()){ + Glide.with(HostInfo.getApplication()).load(coverView + "_thumb").fitCenter().diskCacheStrategy(DiskCacheStrategy.RESOURCE).override(item_size, item_size).into(v.view); + }else { + Glide.with(HostInfo.getApplication()).load(coverView).fitCenter().diskCacheStrategy(DiskCacheStrategy.RESOURCE).override(item_size, item_size).into(v.view); } - } catch (MalformedURLException e) { - e.printStackTrace(); } } diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/RecentStickerImpl.java b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/RecentStickerImpl.java index 0108310237..db285f06c2 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/RecentStickerImpl.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/RecentStickerImpl.java @@ -8,6 +8,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import cc.hicore.Env; +import cc.hicore.Utils.ContextUtils; import cc.hicore.Utils.HttpUtils; import cc.hicore.hook.stickerPanel.Hooker.StickerPanelEntryHooker; import cc.hicore.hook.stickerPanel.ICreator; @@ -19,6 +20,8 @@ import cc.ioctl.util.HostInfo; import cc.ioctl.util.LayoutHelper; import com.bumptech.glide.Glide; +import com.lxj.xpopup.XPopup; +import com.tencent.qqnt.kernel.nativeinterface.Contact; import de.robv.android.xposed.XposedBridge; import io.github.qauxv.R; import java.io.File; @@ -44,6 +47,9 @@ public RecentStickerImpl(Context mContext) { tv_title.setText("最近使用"); View setButton = cacheView.findViewById(R.id.Sticker_Panel_Set_Item); + setButton.setOnClickListener(v-> new XPopup.Builder(ContextUtils.getFixContext(mContext)) + .asConfirm("提示", "是否要清楚最近的表情记录?", RecentStickerHelper::cleanAllRecentRecord) + .show()); try { LinearLayout itemLine = null; @@ -52,7 +58,7 @@ public RecentStickerImpl(Context mContext) { if (i % 5 == 0) { itemLine = new LinearLayout(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - params.bottomMargin = (int) LayoutHelper.dip2px(mContext, 16); + params.bottomMargin = LayoutHelper.dip2px(mContext, 16); panelContainer.addView(itemLine, params); } if (item.type == 2) { @@ -92,13 +98,13 @@ private void notifyDataSetChanged() { } private View getItemContainer(Context context, String coverView, int count, RecentStickerHelper.RecentItemInfo item) { - int width_item = LayoutHelper.getScreenWidth(context) / 6; - int item_distance = (LayoutHelper.getScreenWidth(context) - width_item * 5) / 4; + int item_size = LayoutHelper.getScreenWidth(context) / 6; + int item_distance = (LayoutHelper.getScreenWidth(context) - item_size * 5) / 4; ImageView img = new ImageView(context); cacheImageView.add(img); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width_item, width_item); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(item_size, item_size); if (count > 0) params.leftMargin = item_distance; img.setLayoutParams(params); @@ -106,18 +112,27 @@ private View getItemContainer(Context context, String coverView, int count, Rece img.setOnClickListener(v -> { if (coverView.startsWith("http://") || coverView.startsWith("https://")) { HttpUtils.ProgressDownload(coverView, Env.app_save_path + "Cache/" + coverView.substring(coverView.lastIndexOf("/")), () -> { - MsgSender.send_pic(SessionUtils.AIOParam2CommonChat(StickerPanelEntryHooker.AIOParam), - Env.app_save_path + "Cache/" + coverView.substring(coverView.lastIndexOf("/"))); + Contact contact = SessionUtils.AIOParam2Contact(StickerPanelEntryHooker.AIOParam); + if (contact != null){ + MsgSender.send_pic_by_contact(contact, + Env.app_save_path + "Cache/" + coverView.substring(coverView.lastIndexOf("/"))); + + RecentStickerHelper.addPicItemToRecentRecord(item); + } - RecentStickerHelper.addPicItemToRecentRecord(item); }, mContext); ICreator.dismissAll(); } else { - MsgSender.send_pic(SessionUtils.AIOParam2CommonChat(StickerPanelEntryHooker.AIOParam), - coverView); - RecentStickerHelper.addPicItemToRecentRecord(item); - ICreator.dismissAll(); + + Contact contact = SessionUtils.AIOParam2Contact(StickerPanelEntryHooker.AIOParam); + if (contact != null){ + MsgSender.send_pic_by_contact(contact, + coverView); + RecentStickerHelper.addPicItemToRecentRecord(item); + ICreator.dismissAll(); + } + } }); diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/SearchStickerImpl.java b/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/SearchStickerImpl.java deleted file mode 100644 index f5282c51d8..0000000000 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/MainItemImpl/SearchStickerImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package cc.hicore.hook.stickerPanel.MainItemImpl; - -import android.view.View; -import android.view.ViewGroup; -import cc.hicore.hook.stickerPanel.MainPanelAdapter; - -public class SearchStickerImpl implements MainPanelAdapter.IMainPanelItem{ - @Override - public View getView(ViewGroup parent) { - return null; - } - - @Override - public void onViewDestroy(ViewGroup parent) { - - } - - @Override - public long getID() { - return 0; - } - - @Override - public void notifyViewUpdate0() { - - } -} diff --git a/app/src/main/java/cc/hicore/hook/stickerPanel/PanelUtils.java b/app/src/main/java/cc/hicore/hook/stickerPanel/PanelUtils.java index 623034ba15..02a5b8c94e 100644 --- a/app/src/main/java/cc/hicore/hook/stickerPanel/PanelUtils.java +++ b/app/src/main/java/cc/hicore/hook/stickerPanel/PanelUtils.java @@ -41,12 +41,10 @@ public static void PreSavePicToList(String URL, String MD5, Context context) { NewInfo.MD5 = MD5.toUpperCase(Locale.ROOT); if (URL.startsWith("http")) { - EmoOnlineLoader.submit(NewInfo, () -> { - Glide.with(HostInfo.getApplication()) - .load(new File(NewInfo.Path)) - .fitCenter() - .into(preView); - }); + EmoOnlineLoader.submit(NewInfo, () -> Glide.with(HostInfo.getApplication()) + .load(new File(NewInfo.Path)) + .fitCenter() + .into(preView)); } else { NewInfo.Path = URL; Glide.with(HostInfo.getApplication()) @@ -130,18 +128,16 @@ public static void PreSavePicToList(String URL, String MD5, Context context) { Toasts.info(context,"已保存到:" + Env.app_save_path + "本地表情包/" + choicePath.storePath + "/" + MD5); } }).setNeutralButton("取消", null) - .setOnDismissListener(dialog -> { - Glide.with(HostInfo.getApplication()).clear(preView); - }).show(); + .setOnDismissListener(dialog -> Glide.with(HostInfo.getApplication()).clear(preView)) + .show(); } //如果要保存的是多张图片则弹出MD5选择,选择后才弹出确认图片保存框 public static void PreSaveMultiPicList(ArrayList url, ArrayList MD5, Context context) { new AlertDialog.Builder(context) .setTitle("选择需要保存的图片") - .setItems(MD5.toArray(new String[0]), (dialog, which) -> { - PreSavePicToList(url.get(which), MD5.get(which), context); - }).setOnDismissListener(dialog -> { + .setItems(MD5.toArray(new String[0]), (dialog, which) -> PreSavePicToList(url.get(which), MD5.get(which), context)) + .setOnDismissListener(dialog -> { }).show(); } diff --git a/app/src/main/java/cc/hicore/message/chat/ChatBuilder.java b/app/src/main/java/cc/hicore/message/chat/ChatBuilder.java deleted file mode 100644 index 722a7a519a..0000000000 --- a/app/src/main/java/cc/hicore/message/chat/ChatBuilder.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * QAuxiliary - An Xposed module for QQ/TIM - * Copyright (C) 2019-2023 QAuxiliary developers - * https://github.com/cinit/QAuxiliary - * - * This software is non-free but opensource software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * as published by the Free Software Foundation; either - * version 3 of the License, or any later version and our eula as published - * by QAuxiliary contributors. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * and eula along with this software. If not, see - * - * . - */ - -package cc.hicore.message.chat; - -public class ChatBuilder { - private final CommonChat chat; - public static ChatBuilder group(){ - return new ChatBuilder(0); - } - public static ChatBuilder user(){ - return new ChatBuilder(1); - } - public static ChatBuilder pri(){ - return new ChatBuilder(2); - } - private ChatBuilder(){ - chat = new CommonChat(); - } - private ChatBuilder(int type){ - this(); - chat.type = type; - } - public ChatBuilder uid(String uid){ - chat.uid = uid; - return this; - } - public ChatBuilder groupUin(String groupUin){ - chat.groupUin = groupUin; - return this; - } - public ChatBuilder userUin(String userUin){ - chat.userUin = userUin; - return this; - } - public CommonChat build(){ - return chat; - } -} diff --git a/app/src/main/java/cc/hicore/message/chat/CommonChat.java b/app/src/main/java/cc/hicore/message/chat/CommonChat.java deleted file mode 100644 index c1e9ca959b..0000000000 --- a/app/src/main/java/cc/hicore/message/chat/CommonChat.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * QAuxiliary - An Xposed module for QQ/TIM - * Copyright (C) 2019-2023 QAuxiliary developers - * https://github.com/cinit/QAuxiliary - * - * This software is non-free but opensource software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * as published by the Free Software Foundation; either - * version 3 of the License, or any later version and our eula as published - * by QAuxiliary contributors. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * and eula along with this software. If not, see - * - * . - */ - -package cc.hicore.message.chat; - -import com.tencent.qqnt.kernel.nativeinterface.Contact; - -public class CommonChat { - public static final int TYPE_GROUP = 1; - public static final int TYPE_USER= 0; - public static final int TYPE_PRIVATE = 2; - public int type; - public String uid; - public String groupUin; - public String userUin; - - public Contact contact; -} diff --git a/app/src/main/java/cc/hicore/message/chat/SessionUtils.java b/app/src/main/java/cc/hicore/message/chat/SessionUtils.java index f298ca0c46..641679ecaa 100644 --- a/app/src/main/java/cc/hicore/message/chat/SessionUtils.java +++ b/app/src/main/java/cc/hicore/message/chat/SessionUtils.java @@ -31,60 +31,26 @@ import io.github.qauxv.util.Initiator; public class SessionUtils { - public static CommonChat AIOParam2CommonChat(Object AIOParam){ + public static Contact AIOParam2Contact(Object AIOParam) { try { - if (QAppUtils.isQQnt()){ - CommonChat chat = new CommonChat(); - Contact contact = AIOParam2Contact(AIOParam); - if (contact.getChatType() == 1){ - chat.type = 0; - }else if (contact.getChatType() == 2){ - chat.type = 1; - } - //TODO decode private session - chat.contact = contact; - return chat; - }else { - return null; + Object AIOSession = MField.GetFirstField(AIOParam, Initiator.loadClass("com.tencent.aio.data.AIOSession")); + Object AIOContact = MField.GetFirstField(AIOSession,Initiator.loadClass("com.tencent.aio.data.AIOContact")); + Contact contact = new Contact(); + contact.setPeerUid(getCurrentPeerIDByAIOContact(AIOContact)); + + int chatType = getCurrentChatTypeByAIOContact(AIOContact); + contact.setChatType(chatType); + + if (chatType == 4){ + contact.setGuildId(getCurrentGuildIDByAIOContact(AIOContact)); } + return contact; }catch (Exception e){ - XLog.e("SessionUtils.getCurrentSession",e); + XLog.e("SessionUtils.AIOParam2Contact",e); return null; } } - public static Contact buildContact(CommonChat chat){ - Contact contact = new Contact(); - if (chat.contact == null){ - if (chat.type == 0) contact.setChatType(2); - else if (chat.type == 1) contact.setChatType(1); - else if (chat.type == 2) contact.setChatType(100); - if (TextUtils.isEmpty(chat.uid)){ - if (chat.type == 0)contact.setPeerUid(chat.groupUin); - else if (chat.type == 1)contact.setPeerUid(QAppUtils.UserUinToPeerID(chat.userUin)); - else if (chat.type == 2) throw new RuntimeException("Not support."); - }else { - contact.setPeerUid(chat.uid); - } - }else { - contact = chat.contact; - } - return contact; - } - public static Contact AIOParam2Contact(Object AIOParam) throws Exception { - Object AIOSession = MField.GetFirstField(AIOParam, Initiator.loadClass("com.tencent.aio.data.AIOSession")); - Object AIOContact = MField.GetFirstField(AIOSession,Initiator.loadClass("com.tencent.aio.data.AIOContact")); - Contact contact = new Contact(); - contact.setPeerUid(getCurrentPeerIDByAIOContact(AIOContact)); - - int chatType = getCurrentChatTypeByAIOContact(AIOContact); - contact.setChatType(chatType); - - if (chatType == 4){ - contact.setGuildId(getCurrentGuildIDByAIOContact(AIOContact)); - } - return contact; - } public static String getCurrentPeerIDByAIOContact(Object AIOContact) throws Exception { return MField.GetField(AIOContact,"f",String.class); } @@ -94,14 +60,4 @@ public static int getCurrentChatTypeByAIOContact(Object AIOContact) throws Excep public static String getCurrentGuildIDByAIOContact(Object AIOContact) throws Exception{ return MField.GetField(AIOContact,"g",String.class); } - public static Object buildSession(CommonChat chat){ - if (chat.type == 0){ - return SessionInfoImpl.createSessionInfo(chat.groupUin,1); - }else if (chat.type == 1){ - return SessionInfoImpl.createSessionInfo(chat.userUin,0); - }else { - throw new RuntimeException("Not support type"); - } - - } } diff --git a/app/src/main/java/cc/hicore/message/common/MsgBuilder.java b/app/src/main/java/cc/hicore/message/common/MsgBuilder.java index d2c96376ae..75983cfa0b 100644 --- a/app/src/main/java/cc/hicore/message/common/MsgBuilder.java +++ b/app/src/main/java/cc/hicore/message/common/MsgBuilder.java @@ -77,6 +77,15 @@ public static MsgElement nt_build_pic(String path){ throw new RuntimeException(e); } } + public static MsgElement nt_build_pic_guild(String path){ + try { + Object helper = MClass.NewInstance(MClass.loadClass("com.tencent.qqnt.msg.api.impl.MsgUtilApiImpl")); + return MMethod.CallMethod(helper,"createPicElementForGuild",MsgElement.class,new Class[]{String.class,boolean.class,int.class},path,true,0); + } catch (Exception e) { + XLog.e("MsgBuilder.nt_build_pic_guild",e); + throw new RuntimeException(e); + } + } public static Object build_pic(Object _SessionInfo,String path){ try { Method CallMethod = MMethod.FindMethod("com.tencent.mobileqq.activity.ChatActivityFacade", null, MClass.loadClass("com.tencent.mobileqq.data.ChatMessage"), new Class[]{ diff --git a/app/src/main/java/cc/hicore/message/common/MsgSender.java b/app/src/main/java/cc/hicore/message/common/MsgSender.java index c10963e3f1..e8a43c955a 100644 --- a/app/src/main/java/cc/hicore/message/common/MsgSender.java +++ b/app/src/main/java/cc/hicore/message/common/MsgSender.java @@ -26,34 +26,23 @@ import cc.hicore.message.bridge.Chat_facade_bridge; import cc.hicore.message.bridge.Nt_kernel_bridge; import cc.hicore.message.chat.SessionUtils; -import cc.hicore.message.chat.CommonChat; +import com.tencent.qqnt.kernel.nativeinterface.Contact; import com.tencent.qqnt.kernel.nativeinterface.MsgElement; import java.util.ArrayList; public class MsgSender { - public static void send_text(CommonChat chat,String text){ - if (QAppUtils.isQQnt()){ - - ArrayList newMsgArr = new ArrayList<>(); - newMsgArr.add(MsgBuilder.nt_build_text(text)); - Nt_kernel_bridge.send_msg(SessionUtils.buildContact(chat),newMsgArr); - }else { - Chat_facade_bridge.sendText(SessionUtils.buildSession(chat),text,new ArrayList<>()); - } - } - public static void send_pic(CommonChat chat,String picPath){ + public static void send_pic_by_contact(Contact contact,String picPath){ if (QAppUtils.isQQnt()){ ArrayList newMsgArr = new ArrayList<>(); - newMsgArr.add(MsgBuilder.nt_build_pic(picPath)); - Nt_kernel_bridge.send_msg(SessionUtils.buildContact(chat),newMsgArr); + if (contact.getChatType() == 4){ + newMsgArr.add(MsgBuilder.nt_build_pic_guild(picPath)); + }else { + newMsgArr.add(MsgBuilder.nt_build_pic(picPath)); + } + + Nt_kernel_bridge.send_msg(contact,newMsgArr); }else { - Chat_facade_bridge.sendPic(SessionUtils.buildSession(chat),picPath); + Chat_facade_bridge.sendPic(contact,picPath); } } - public static void send_voice(CommonChat chat,String voicePath){ - - } - public static void send_reply(CommonChat chat,Object source){ - - } } diff --git a/app/src/main/java/io/github/qauxv/util/dexkit/DexKitTarget.kt b/app/src/main/java/io/github/qauxv/util/dexkit/DexKitTarget.kt index cf196c6ca6..b919234370 100644 --- a/app/src/main/java/io/github/qauxv/util/dexkit/DexKitTarget.kt +++ b/app/src/main/java/io/github/qauxv/util/dexkit/DexKitTarget.kt @@ -380,6 +380,12 @@ data object AbstractQQCustomMenuItem : DexKitTarget.UsingStr() { override val traitString = arrayOf("QQCustomMenuItem{title='") override val filter = DexKitFilter.strInClsName("com/tencent/qqnt/aio/menu/ui") } +data object Guild_Emo_Btn_Create_QQNT : DexKitTarget.UsingStr() { + override val findMethod: Boolean = true + override val traitString = arrayOf("mEmojiLayout.findViewByI…id.guild_aio_emoji_image)") + override val declaringClass = "Guild_Emo_Btn_Create_QQNT" + override val filter = DexKitFilter.allowAll +} data object NBaseChatPie_init : DexKitTarget.UsingStr() { override val findMethod: Boolean = true