Skip to content

Commit

Permalink
[add] 2.0新版ui
Browse files Browse the repository at this point in the history
  • Loading branch information
vitvm committed Feb 16, 2024
1 parent 8950373 commit 5ed4df2
Show file tree
Hide file tree
Showing 22 changed files with 1,667 additions and 238 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ android {
applicationId "com.lu.wxmask"
minSdk 24
targetSdk 34
versionCode 24
versionName "1.23-bug"
versionCode 1000
versionName "2.0-test"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

Expand Down
72 changes: 60 additions & 12 deletions app/src/main/java/com/lu/wxmask/MainHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import android.app.Application;
import android.app.Instrumentation;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.XModuleResources;
import android.nfc.Tag;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;
Expand All @@ -16,30 +19,43 @@
import com.lu.wxmask.plugin.CommonPlugin;
import com.lu.wxmask.plugin.WXConfigPlugin;
import com.lu.wxmask.plugin.WXMaskPlugin;
import com.lu.wxmask.util.Rm;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;

import de.robv.android.xposed.IXposedHookInitPackageResources;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_InitPackageResources;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

@Keep
public class MainHook implements IXposedHookLoadPackage {
public class MainHook implements IXposedHookLoadPackage, IXposedHookZygoteInit, IXposedHookInitPackageResources {
private static final String TARGET_PACKAGE = "com.tencent.mm";
public static CopyOnWriteArraySet<String> uniqueMetaStore = new CopyOnWriteArraySet<>();
private boolean hasInit = false;
private List<XC_MethodHook.Unhook> initUnHookList = new ArrayList<>();
private static String MODULE_PATH = null;

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (BuildConfig.APPLICATION_ID.equals(lpparam.packageName)) {
SelfHook.getInstance().handleLoadPackage(lpparam);
return;
}
if (!"com.tencent.mm".equals(lpparam.processName)) {
// if (BuildConfig.APPLICATION_ID.equals(lpparam.packageName)) {
// SelfHook.getInstance().handleLoadPackage(lpparam);
// return;
// }

HashSet<String> allowList = new HashSet<>();
allowList.add(BuildConfig.APPLICATION_ID);
allowList.add(TARGET_PACKAGE);

if (!allowList.contains(lpparam.processName)) {
return;
}

LogUtil.setLogger(new SimpleLogger() {
@Override
public void onLog(int level, @NonNull Object[] objects) {
Expand Down Expand Up @@ -81,7 +97,7 @@ public void onLog(int level, @NonNull Object[] objects) {
return new byte[]{};
}
if (Short.TYPE.equals(returnType) || Short.class.equals(returnType)) {
return (short)0;
return (short) 0;
}
if (BuildConfig.DEBUG) {
LogUtil.w("setOnErrorReturnFallback", throwable);
Expand Down Expand Up @@ -163,6 +179,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {

private void initPlugin(Context context, XC_LoadPackage.LoadPackageParam lpparam) {
if (context == null) {
LogUtil.w("context is null");
return;
}
if (hasInit) {
Expand All @@ -171,18 +188,49 @@ private void initPlugin(Context context, XC_LoadPackage.LoadPackageParam lpparam
LogUtil.i("start init Plugin");
hasInit = true;
AppUtil.attachContext(context);

if (BuildConfig.APPLICATION_ID.equals(lpparam.packageName)) {
initSelfPlugins(context, lpparam);
} else {
initTargetPlugins(context, lpparam);
}

for (XC_MethodHook.Unhook unhook : initUnHookList) {
if (unhook != null) {
unhook.unhook();
}
}
LogUtil.i("init plugin finish");
}

private void initSelfPlugins(Context context, XC_LoadPackage.LoadPackageParam lpparam) {
SelfHook.getInstance().handleHook(context, lpparam);
}

private void initTargetPlugins(Context context, XC_LoadPackage.LoadPackageParam lpparam) {
//目前生成的plugin都是单例的
PluginRegistry.register(
CommonPlugin.class,
WXConfigPlugin.class,
WXMaskPlugin.class
).handleHooks(context, lpparam);
for (XC_MethodHook.Unhook unhook : initUnHookList) {
if (unhook != null) {
unhook.unhook();
}

}

@Override
public void initZygote(StartupParam startupParam) throws Throwable {
MODULE_PATH = startupParam.modulePath;
}

@Override
public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
if (BuildConfig.APPLICATION_ID.equals(resparam.packageName)) {
return;
}
if (TARGET_PACKAGE.equals(resparam.packageName)) {
// XModuleResources xRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
// Rm.mask_layout_plugin_manager = resparam.res.addResource(xRes, R.layout.mask_layout_plugin_manager);
}
LogUtil.i("init plugin finish");
}

}
31 changes: 28 additions & 3 deletions app/src/main/java/com/lu/wxmask/SelfHook.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
package com.lu.wxmask;

import android.app.Activity;
import android.app.Application;
import android.content.Context;

import androidx.annotation.Keep;

import com.lu.lposed.api2.XC_MethodHook2;
import com.lu.lposed.api2.XposedHelpers2;
import com.lu.lposed.plugin.IPlugin;
import com.lu.magic.util.AppUtil;
import com.lu.magic.util.ResUtil;
import com.lu.magic.util.log.LogUtil;
import com.lu.wxmask.plugin.ui.MaskManagerCenterUI;
import com.lu.wxmask.util.ext.ResUtilXKt;

import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

@Keep
public class SelfHook {
private static class Holder {
public class SelfHook implements IPlugin {


private final static class Holder {
private static final SelfHook INSTANCE = new SelfHook();
}

Expand All @@ -23,7 +36,8 @@ public boolean isModuleEnable() {
return false;
}

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
@Override
public void handleHook(Context context, XC_LoadPackage.LoadPackageParam lpparam) {
XposedHelpers.findAndHookMethod(
SelfHook.class.getName(),
lpparam.classLoader,
Expand All @@ -36,5 +50,16 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
);

XposedHelpers.findAndHookMethod(
ClazzN.from("android.app.Activity"),
"onResume",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Activity act = (Activity) param.thisObject;
act.findViewById(ResUtilXKt.getViewId(ResUtil.INSTANCE, "action_bar")).setOnClickListener(v -> new MaskManagerCenterUI(act).show());
}
});

}
}
12 changes: 12 additions & 0 deletions app/src/main/java/com/lu/wxmask/plugin/CommonPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
package com.lu.wxmask.plugin

import android.content.Context
import android.content.res.XModuleResources
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.lu.lposed.api2.XC_MethodHook2
import com.lu.lposed.api2.XposedHelpers2
import com.lu.lposed.plugin.IPlugin
import com.lu.magic.util.ResUtil
import com.lu.wxmask.ClazzN
import com.lu.wxmask.plugin.ui.MaskManagerCenterUI
import com.lu.wxmask.util.HookPointManager
import com.lu.wxmask.util.ext.getViewId
import de.robv.android.xposed.callbacks.XC_LoadPackage

class CommonPlugin : IPlugin {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/lu/wxmask/plugin/WXConfigPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private void onEnterConfigUI(Activity activity, Intent intent) {
}

private void showManagerConfigUI(Activity activity, Intent intent) {
new ConfigManagerUI(activity).initUI().show();
new ConfigManagerUI(activity).show();
}

private void showAddTipDialog(Activity activity) {
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/lu/wxmask/plugin/WXMaskPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.lu.wxmask.plugin.part.EmptySingChatHistoryGalleryPluginPart
import com.lu.wxmask.plugin.part.EnterChattingUIPluginPart
import com.lu.wxmask.plugin.part.HideMainUIListPluginPart
import com.lu.wxmask.plugin.part.HideSearchListUIPluginPart
import com.lu.wxmask.plugin.part.MaskUIManagerPluginPart
import com.lu.wxmask.util.ConfigUtil
import com.lu.wxmask.util.ConfigUtil.ConfigSetObserver
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
Expand All @@ -19,6 +20,7 @@ class WXMaskPlugin : IPlugin, ConfigSetObserver {
private val enterChattingUIPluginPart = EnterChattingUIPluginPart()
private val hideMainUIListPluginPart = HideMainUIListPluginPart()
private val emptySingChatHistoryGalleryPluginPart = EmptySingChatHistoryGalleryPluginPart()
private val maskUIManagerPluginPart = MaskUIManagerPluginPart()

companion object {
fun containChatUser(chatUser: String?): Boolean {
Expand Down Expand Up @@ -57,6 +59,7 @@ class WXMaskPlugin : IPlugin, ConfigSetObserver {
enterChattingUIPluginPart.handleHook(context, lpparam)
// hideSearchListPluginPart.handleHook(context, lpparam)
emptySingChatHistoryGalleryPluginPart.handleHook(context, lpparam)
maskUIManagerPluginPart.handleHook(context, lpparam)
}


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.lu.wxmask.plugin.part

import android.app.Activity
import android.content.Context
import android.view.ViewGroup
import android.widget.Button
import com.lu.lposed.api2.XC_MethodHook2
import com.lu.lposed.api2.XposedHelpers2
import com.lu.lposed.plugin.IPlugin
import com.lu.magic.util.view.ChildDeepCheck
import com.lu.wxmask.ClazzN
import com.lu.wxmask.plugin.ui.MaskManagerCenterUI
import de.robv.android.xposed.callbacks.XC_LoadPackage

/**
* 糊脸ui管理页面
*/
class MaskUIManagerPluginPart : IPlugin {
override fun handleHook(context: Context?, lpparam: XC_LoadPackage.LoadPackageParam?) {
XposedHelpers2.findAndHookMethod(
ClazzN.from("com.tencent.mm.plugin.setting.ui.setting.SettingsCareModeIntro"),
"initView",
object : XC_MethodHook2() {
override fun afterHookedMethod(param: MethodHookParam) {
val act: Activity = param.thisObject as Activity
val contentView = act.findViewById<ViewGroup>(android.R.id.content)
ChildDeepCheck().filter(contentView) {
return@filter it is Button && it.id > 0
}.forEach {
it.setOnLongClickListener { v ->
MaskManagerCenterUI(act).show()
return@setOnLongClickListener true
}
}
}
}
)
}


}
3 changes: 0 additions & 3 deletions app/src/main/java/com/lu/wxmask/plugin/ui/AddMaskItemUI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,9 @@ class AddMaskItemUI(
val tipMode = ui.tipSpinnerSelectedItem.first
val tipData = GsonUtil.toJsonTree(MaskItemBean.TipData(tipMess)).asJsonObject

val clickCount = ui.etClickCount.text.toElseString("5").toInt()
val duration = ui.etDuration.text.toElseString("150").toInt()

MaskItemBean(maskId, maskName, tipMode, tipData).let {
ConfigUtil.addMaskList(it)
ConfigUtil.setTemporary(QuickTemporaryBean(duration, clickCount))
configListener?.invoke(dialog, it)
}
dialog.dismiss()
Expand Down
Loading

0 comments on commit 5ed4df2

Please sign in to comment.