[3.3.0][魔方] WindowManager#addView方式和PopupWindow#setContentView两种方式的aop替换,添加对View焦点事件的变化监听以响应魔方按键指令

This commit is contained in:
renwj
2023-06-24 14:29:30 +08:00
parent 58e74dcbff
commit 5bc7634ea3
2 changed files with 93 additions and 29 deletions

View File

@@ -3,16 +3,16 @@ package com.mogo.launcher.lancet;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.PopupWindow;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.knightboost.lancet.api.Origin;
import com.knightboost.lancet.api.Scope;
import com.knightboost.lancet.api.This;
@@ -24,6 +24,7 @@ import com.knightboost.lancet.api.annotations.TargetMethod;
import com.knightboost.lancet.api.annotations.Weaver;
import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.launcher.R;
@Keep
@Weaver
@@ -58,31 +59,90 @@ public class WindowCallbackLancet {
return dialog;
}
// @TargetClass(value = "android.view.WindowManager",scope = Scope.SELF)
// @TargetMethod(methodName = "addView")
// @ReplaceInvoke
// public static void proxyWindowManagerAddView(WindowManager manager, View view, ViewGroup.LayoutParams params) {
// manager.addView(view, params);
// Log.d("XXXXXX", "--- add view ---- 1 ---");
// IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang();
// if (mofang != null) {
// Log.d("XXXXXX", "--- add view ---- 2 ---");
// Window.Callback callback = mofang.provideWindowCallback(null);
// view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
// @Override
// public void onViewAttachedToWindow(@NonNull View v) {
// Log.d("XXXXXX", "--- add view ---- 3 ---");
// v.setOnKeyListener((v1, keyCode, event) -> {
// Log.d("XXXXXX", "--- add view ---- 4 ---");
// return callback.dispatchKeyEvent(event);
// });
// }
//
// @Override
// public void onViewDetachedFromWindow(@NonNull View v) {
//
// }
// });
// }
// }
@TargetClass(value = "android.view.WindowManager",scope = Scope.SELF)
@TargetMethod(methodName = "addView")
@ReplaceInvoke
public static void proxyWindowManagerAddView(WindowManager manager, View view, ViewGroup.LayoutParams params) {
view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
private final GlobalFocusChangedListener listener = new GlobalFocusChangedListener();
private boolean isAdd = false;
@Override
public void onViewAttachedToWindow(@NonNull View v) {
try {
v.getViewTreeObserver().addOnGlobalFocusChangeListener(listener);
isAdd = true;
} catch (Throwable t) {
t.printStackTrace();
}
}
@Override
public void onViewDetachedFromWindow(@NonNull View v) {
try {
if (isAdd) {
v.getViewTreeObserver().removeOnGlobalFocusChangeListener(listener);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
});
manager.addView(view, params);
}
@TargetClass(value = "android.widget.PopupWindow",scope = Scope.ALL)
@TargetMethod(methodName = "setContentView")
@ReplaceInvoke
public static void proxyPopupWindowSetContentView(PopupWindow window, View view) {
view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
private final GlobalFocusChangedListener listener = new GlobalFocusChangedListener();
private boolean isAdd = false;
@Override
public void onViewAttachedToWindow(@NonNull View v) {
try {
v.getViewTreeObserver().addOnGlobalFocusChangeListener(listener);
isAdd = true;
} catch (Throwable t) {
t.printStackTrace();
}
}
@Override
public void onViewDetachedFromWindow(@NonNull View v) {
try {
if (isAdd) {
v.getViewTreeObserver().removeOnGlobalFocusChangeListener(listener);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
});
window.setContentView(view);
}
private static class GlobalFocusChangedListener implements ViewTreeObserver.OnGlobalFocusChangeListener {
private Window.Callback mCallBack = null;
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (newFocus != null) {
Object tag = newFocus.getTag(R.id.on_key_set);
if (tag == null) {
newFocus.setTag(R.id.on_key_set, 1);
newFocus.setOnKeyListener((v, keyCode, event) -> {
if (mCallBack == null) {
IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang();
if (mofang != null) {
mCallBack = mofang.provideWindowCallback(null);
}
}
if (mCallBack != null) {
return mCallBack.dispatchKeyEvent(event);
}
return false;
});
}
}
}
}
}

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="on_key_set" type="id" />
</resources>