From c7530f1a595883f815b9689dbd3a8159e8d6bd30 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Sat, 31 Dec 2022 01:14:21 +0000
Subject: [PATCH] UI线程阻塞问题修复

---
 app/src/main/java/com/auto/lyric/service/AutoInputService.java |  126 +++++++++++++++++++++++++----------------
 1 files changed, 76 insertions(+), 50 deletions(-)

diff --git a/app/src/main/java/com/auto/lyric/service/AutoInputService.java b/app/src/main/java/com/auto/lyric/service/AutoInputService.java
index 73c3ea9..ca83317 100644
--- a/app/src/main/java/com/auto/lyric/service/AutoInputService.java
+++ b/app/src/main/java/com/auto/lyric/service/AutoInputService.java
@@ -4,6 +4,7 @@
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.annotation.SuppressLint;
 import android.content.BroadcastReceiver;
+import android.content.ClipboardManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -22,38 +23,47 @@
 public class AutoInputService extends AccessibilityService {
     final String TAG = "AutoInputService";
     public static final int ACTION_SEND = 1001,//发送
-            ACTION_PASTE = 1002;//粘贴
+            ACTION_PASTE = 1002,//粘贴
+            ACTION_START = 1000;//开始
 
     BroadcastReceiver receiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             int action = intent.getIntExtra("action", 0);
+            ClipboardManager cmb = (ClipboardManager) context .getSystemService(Context.CLIPBOARD_SERVICE);
             Log.e(TAG, "onReceive action: " + action);
             switch (action){
                 case ACTION_SEND:
                     //List<AccessibilityNodeInfo> nodeInfos = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.ss.android.ugc.aweme:id/llp");
                     AccessibilityNodeInfo sendNode = getViewByDesc(getRootInActiveWindow(),"发送");
-                    Log.e(TAG, "ACTION_SEND nodeInfos: " + sendNode);
+                    Log.e(TAG, "ACTION_SEND "+cmb.getText()+" nodeInfos: " + sendNode);
                     if(sendNode != null){
                         Log.e(TAG, "ACTION_SEND nodeInfos: " + sendNode.getClassName());
                         sendNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                     }else{
-                        printView(getRootInActiveWindow()," ");
+                        //printView(getRootInActiveWindow()," ");
                         Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show();
                     }
                     break;
                 case ACTION_PASTE:
-                    List<AccessibilityNodeInfo> list = getRootInActiveWindow().findAccessibilityNodeInfosByText("说点什么...");
-                    Log.e(TAG, "ACTION_PASTE nodeInfos: " + list.size());
-                    printView(getRootInActiveWindow()," ");
-                    AccessibilityNodeInfo editNode = getView(getRootInActiveWindow(),"android.widget.EditText");
-                    if(editNode != null){
-                        Log.e(TAG, "ACTION_PASTE nodeInfos: " + editNode.getClassName());
-                        editNode.performAction(AccessibilityNodeInfo.ACTION_PASTE);
-                    }else{
-                        Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show();
+                    try{
+                        List<AccessibilityNodeInfo> list = getRootInActiveWindow().findAccessibilityNodeInfosByText("说点什么...");
+                        Log.e(TAG, "ACTION_PASTE "+cmb.getText()+" nodeInfos: " + list.size());
+                        //printView(getRootInActiveWindow()," ");
+                        AccessibilityNodeInfo editNode = getView(getRootInActiveWindow(),"android.widget.EditText");
+                        if(editNode != null){
+                            Log.e(TAG, "ACTION_PASTE nodeInfos: " + editNode.getClassName());
+                            editNode.performAction(AccessibilityNodeInfo.ACTION_PASTE);
+                        }else{
+                            Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show();
+                        }
+                    }catch (Exception e){
+                        //e.printStackTrace();
                     }
 
+                    break;
+                case ACTION_START:
+                    clickEdit();
                     break;
             }
         }
@@ -64,36 +74,27 @@
     @Override
     public void onAccessibilityEvent(AccessibilityEvent event) {
         int eventType = event.getEventType();
-        Log.d(TAG," text:" + event.getText()+" class:"+event.getClassName() +" action:" + event.getAction() +" windowId:"+ event.getWindowId());
-        Log.d(TAG,"event:"+event );
-        Log.d(TAG,"ParcelableData:"+event.getParcelableData()  );
+        //Log.d(TAG," text:" + event.getText()+" class:"+event.getClassName() +" action:" + event.getAction() +" windowId:"+ event.getWindowId());
+        //Log.d(TAG,"event:"+event );
+        //Log.d(TAG,"ParcelableData:"+event.getParcelableData()  );
         AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
         AccessibilityNodeInfo source = event.getSource();//当前界面的可访问节点信息
         if(source != null){
             //printView(source,"source == ");
         }
-        Log.d(TAG,"source:"+(source == null? null : source.getClassName())  );
-        Log.d(TAG,"nodeInfo:"+ (nodeInfo == null? null : nodeInfo.getClassName()) );
+        //Log.d(TAG,"source:"+(source == null? null : source.getClassName())  );
+        //Log.d(TAG,"nodeInfo:"+ (nodeInfo == null? null : nodeInfo.getClassName()) );
         switch (eventType) {
             case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED://界面变化事件
-                Log.e(TAG, "TYPE_WINDOW_CONTENT_CHANGED " );
+                //Log.e(TAG, "TYPE_WINDOW_CONTENT_CHANGED " );
+                if(event.getClassName().toString().equals("androidx.viewpager.widget.ViewPager") && flag){
+                    clickEdit();
+                }
                 break;
             case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED://界面变化事件
-                Log.e(TAG, "TYPE_WINDOW_STATE_CHANGED " );
-                if(source != null && event.getClassName().toString().equals("com.ss.android.ugc.aweme.live.LivePlayActivity")){
-                    List<AccessibilityNodeInfo> list = getRootInActiveWindow().findAccessibilityNodeInfosByText("说点什么...");
-                    Log.e(TAG,"获取到控件 "+list.size());
-                    if (list != null && list.size() > 0 && flag) {
-                        //模拟第三方点击事件
-                        //找到你的节点以后 就直接点击他就行了
-                        //AccessibilityNodeInfo node = list.get(0);
-                        list.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
-                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                            Log.e(TAG,"执行点击 "+list.get(0).getPaneTitle());
-                        }
-                    }else if(flag){
-                        Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show();
-                    }
+                //Log.e(TAG, "TYPE_WINDOW_STATE_CHANGED " );
+                if(source != null && event.getClassName().toString().equals("com.ss.android.ugc.aweme.live.LivePlayActivity") && flag){
+                    clickEdit();
                 }
 
                 if(event.getText().contains("更多选项") ){
@@ -103,17 +104,17 @@
                 }
                 break;
             case AccessibilityEvent.TYPE_VIEW_FOCUSED://焦点变更
-                Log.e(TAG, "TYPE_VIEW_FOCUSED ResourceName:" +( source == null ? null : source.getParent()));
+                //Log.e(TAG, "TYPE_VIEW_FOCUSED ResourceName:" +( source == null ? null : source.getParent()));
                 if(event.getClassName().equals("android.widget.EditText") && source != null){
                     //source.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
                     //source.performAction(AccessibilityNodeInfo.ACTION_PASTE);//粘贴
                 }
                 break;
             case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:
-                Log.e(TAG, "TYPE_VIEW_LONG_CLICKED ResourceName:" +( source == null ? null : source.getParent()));
+                //Log.e(TAG, "TYPE_VIEW_LONG_CLICKED ResourceName:" +( source == null ? null : source.getParent()));
                 break;
             case AccessibilityEvent.TYPE_VIEW_CLICKED:
-                Log.e(TAG, "TYPE_VIEW_CLICKED " );
+                //Log.e(TAG, "TYPE_VIEW_CLICKED " );
                 if(nodeInfo != null) {
                     Log.e(TAG, "TYPE_VIEW_CLICKED source:" + nodeInfo.getText() + " " + nodeInfo.getClass());
                 }
@@ -122,15 +123,36 @@
                 break;
             case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
                 //界面文字改动
-                Log.e(TAG, "TYPE_VIEW_TEXT_CHANGED " );
+                //Log.e(TAG, "TYPE_VIEW_TEXT_CHANGED " );
                 break;
         }
 
     }
 
+    /**
+     * 点击弹出 edit弹框
+     */
+    private void clickEdit(){
+        try{
+            List<AccessibilityNodeInfo> list = getRootInActiveWindow().findAccessibilityNodeInfosByText("说点什么...");
+            Log.e(TAG,"获取到控件 "+list.size());
+            if (list != null && list.size() > 0 && flag) {
+                //模拟第三方点击事件
+                //找到你的节点以后 就直接点击他就行了
+                //AccessibilityNodeInfo node = list.get(0);
+                list.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                    Log.e(TAG,"执行点击 "+list.get(0).getPaneTitle());
+                }
+            }else if(flag){
+                //Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show();
+            }
+        }catch ( Exception e){}
+    }
+
     @SuppressLint("NewApi")
     private void printView(AccessibilityNodeInfo node, String space){
-        Log.e(TAG,space +node+" id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getPaneTitle());
+        //Log.e(TAG,space +node+" id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getPaneTitle());
         if(node.getChildCount() > 0){
             for(int i = 0 ; i < node.getChildCount() ; i ++){
                 if(node.getChild(i) != null) {
@@ -141,7 +163,7 @@
     }
     @SuppressLint("NewApi")
     private AccessibilityNodeInfo getView(AccessibilityNodeInfo node, String className){
-        Log.e(TAG,className +" id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getPaneTitle());
+        //Log.e(TAG,className +" id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getPaneTitle());
         if(node.getChildCount() > 0){
             for(int i = 0 ; i < node.getChildCount() ; i ++){
                 if(node.getChild(i) != null) {
@@ -159,20 +181,22 @@
 
     @SuppressLint("NewApi")
     private AccessibilityNodeInfo getViewByDesc(AccessibilityNodeInfo node, String desc){
-        Log.e(TAG,desc +" getViewByDesc id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getContentDescription());
-        Log.e(TAG,"getViewByDesc  node:"+node);
-        if(node.getChildCount() > 0){
-            for(int i = 0 ; i < node.getChildCount() ; i ++){
-                if(node.getChild(i) != null) {
-                    AccessibilityNodeInfo nodeInfo = getViewByDesc(node.getChild(i), desc);
-                    if(nodeInfo != null){
-                        return nodeInfo;
+        try{
+            //Log.e(TAG,desc +" getViewByDesc id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getContentDescription());
+            //Log.e(TAG,"getViewByDesc  node:"+node);
+            if(node.getChildCount() > 0){
+                for(int i = 0 ; i < node.getChildCount() ; i ++){
+                    if(node.getChild(i) != null) {
+                        AccessibilityNodeInfo nodeInfo = getViewByDesc(node.getChild(i), desc);
+                        if(nodeInfo != null){
+                            return nodeInfo;
+                        }
                     }
                 }
+            }else if(node != null && node.getContentDescription() != null && node.getContentDescription().equals(desc)){
+                return node;
             }
-        }else if(node != null && node.getContentDescription() != null && node.getContentDescription().equals(desc)){
-            return node;
-        }
+        }catch (Exception e){}
         return null;
     }
     private void printWindow(AccessibilityWindowInfo window, String space){
@@ -191,7 +215,9 @@
 
     @Override
     public void onInterrupt() {
+        Log.e(TAG,"onInterrupt 服务停止");
         unregisterReceiver(receiver);
+        Toast.makeText(getBaseContext(),"服务停止",Toast.LENGTH_SHORT).show();
     }
     @Override
     protected void onServiceConnected() {

--
Gitblit v1.9.1