From 5bc7634ea34c8eae2d7a226a784ce3a3e98e20d4 Mon Sep 17 00:00:00 2001 From: renwj Date: Sat, 24 Jun 2023 14:29:30 +0800 Subject: [PATCH] =?UTF-8?q?[3.3.0][=E9=AD=94=E6=96=B9]=20WindowManager#add?= =?UTF-8?q?View=E6=96=B9=E5=BC=8F=E5=92=8CPopupWindow#setContentView?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E6=96=B9=E5=BC=8F=E7=9A=84aop=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=AF=B9View=E7=84=A6?= =?UTF-8?q?=E7=82=B9=E4=BA=8B=E4=BB=B6=E7=9A=84=E5=8F=98=E5=8C=96=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E4=BB=A5=E5=93=8D=E5=BA=94=E9=AD=94=E6=96=B9=E6=8C=89?= =?UTF-8?q?=E9=94=AE=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../launcher/lancet/WindowCallbackLancet.java | 118 +++++++++++++----- app/src/main/res/values/ids.xml | 4 + 2 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/values/ids.xml diff --git a/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java b/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java index d4f7ee1474..ce542d056a 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java +++ b/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java @@ -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; + }); + } + } + } + } } diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 0000000000..fbde1ec5f4 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file