From 9aeecdbe43d4c4601710b6c7b301f41f55c07746 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Tue, 29 Mar 2022 15:54:33 +0000
Subject: [PATCH] 路径修改,部分功能类添加和修改

---
 app/src/main/java/com/auto/lyric/MainActivity.java                                |   84 +++++++++++++-
 app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java                |   14 +-
 app/src/main/java/com/auto/lyric/vm/MainViewModel.java                            |    9 +
 app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java |    8 
 app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java     |    2 
 app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java               |    7 
 app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java            |    2 
 app/src/main/java/com/auto/lyric/util/MyLog.java                                  |    2 
 app/src/main/java/com/auto/lyric/service/AutoInputService.java                    |  210 +++++++++++++++++++++++++++++++++++
 9 files changed, 315 insertions(+), 23 deletions(-)

diff --git a/app/src/main/java/com/auto/lyric/MainActivity.java b/app/src/main/java/com/auto/lyric/MainActivity.java
index ec4e9ce..0340eef 100644
--- a/app/src/main/java/com/auto/lyric/MainActivity.java
+++ b/app/src/main/java/com/auto/lyric/MainActivity.java
@@ -1,14 +1,86 @@
 package com.auto.lyric;
 
-import androidx.appcompat.app.AppCompatActivity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
 
-import android.os.Bundle;
+import com.auto.lyric.base.activities.BaseActivity;
+import com.auto.lyric.databinding.ActivityMainBinding;
+import com.auto.lyric.service.AutoInputService;
+import com.auto.lyric.vm.MainViewModel;
 
-public class MainActivity extends AppCompatActivity {
+public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
+
+    Intent service  = new Intent(getApplicationContext(), AutoInputService.class);
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
+    public void initViews() {
+
     }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        //申请权限
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            //开启悬浮窗
+            if(!Settings.canDrawOverlays(getApplicationContext())) {
+                //启动Activity让用户授权
+                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
+                intent.setData(Uri.parse("package:" + getPackageName()));
+                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
+                startActivity(intent);
+            }else if(!isAccessibilitySettingsOn()){//辅助权限
+                Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
+                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
+                startActivity(intent);
+            }else{//开启监听服务
+                startService(service);
+            }
+        }
+    }
+
+    public boolean isAccessibilitySettingsOn() {
+        int accessibilityEnabled = 0;
+        final String service = getPackageName() + "/" + AutoInputService.class.getCanonicalName();
+        try {
+            accessibilityEnabled = Settings.Secure.getInt(
+                    this.getApplicationContext().getContentResolver(),
+                    android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
+            Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
+        } catch (Settings.SettingNotFoundException e) {
+            Log.e(TAG, "Error finding setting, default accessibility to not found: "
+                    + e.getMessage());
+        }
+        TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
+
+        if (accessibilityEnabled == 1) {
+            Log.v(TAG, "***ACCESSIBILITY IS ENABLED*** -----------------");
+            String settingValue = Settings.Secure.getString(
+                    getApplicationContext().getContentResolver(),
+                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+            if (settingValue != null) {
+                mStringColonSplitter.setString(settingValue);
+                while (mStringColonSplitter.hasNext()) {
+                    String accessibilityService = mStringColonSplitter.next();
+
+                    Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service);
+                    if (accessibilityService.equalsIgnoreCase(service)) {
+                        Log.v(TAG, "We've found the correct setting - accessibility is switched on!");
+                        return true;
+                    }
+                }
+            }
+        } else {
+            Log.v(TAG, "***ACCESSIBILITY IS DISABLED***");
+        }
+
+        return false;
+    }
+
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java
index e853910..8b5af59 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java
@@ -1,7 +1,7 @@
 package com.auto.lyric.retrofit.Interceptor;
 
 
-import com.runt.open.mvvm.retrofit.utils.RSAUtils;
+import com.auto.lyric.retrofit.utils.RSAUtils;
 
 import org.json.JSONObject;
 
diff --git a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java
index 6355bf8..d75056a 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java
@@ -2,10 +2,10 @@
 
 import android.util.Log;
 
-import com.runt.open.mvvm.retrofit.net.NetWorkCost;
-import com.runt.open.mvvm.retrofit.net.NetWorkListenear;
-import com.runt.open.mvvm.retrofit.utils.HttpPrintUtils;
-import com.runt.open.mvvm.util.GsonUtils;
+import com.auto.lyric.retrofit.net.NetWorkCost;
+import com.auto.lyric.retrofit.net.NetWorkListenear;
+import com.auto.lyric.retrofit.utils.HttpPrintUtils;
+import com.auto.lyric.util.GsonUtils;
 
 import org.json.JSONObject;
 
diff --git a/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java b/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java
index 61cc267..4bf4ece 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java
@@ -4,7 +4,7 @@
 
 import androidx.lifecycle.MutableLiveData;
 
-import com.runt.open.mvvm.data.BaseApiResult;
+import com.auto.lyric.data.BaseApiResult;
 
 import java.lang.reflect.ParameterizedType;
 import java.net.SocketTimeoutException;
diff --git a/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java b/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java
index f33776c..4b0e3df 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java
@@ -1,8 +1,9 @@
 package com.auto.lyric.retrofit.utils;
 
-import com.runt.open.mvvm.BuildConfig;
-import com.runt.open.mvvm.util.GsonUtils;
-import com.runt.open.mvvm.util.MyLog;
+
+import com.auto.lyric.BuildConfig;
+import com.auto.lyric.util.GsonUtils;
+import com.auto.lyric.util.MyLog;
 
 import java.io.EOFException;
 import java.util.ArrayList;
diff --git a/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java b/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java
index 5010d05..ca63fbf 100644
--- a/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java
+++ b/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java
@@ -1,12 +1,12 @@
 package com.auto.lyric.retrofit.utils;
 
 
-import com.runt.open.mvvm.BuildConfig;
-import com.runt.open.mvvm.retrofit.Interceptor.EncryptInterceptor;
-import com.runt.open.mvvm.retrofit.Interceptor.HttpLoggingInterceptor;
-import com.runt.open.mvvm.retrofit.api.CommonApiCenter;
-import com.runt.open.mvvm.retrofit.converter.DecryptGsonConverterFactory;
-import com.runt.open.mvvm.retrofit.net.NetWorkListenear;
+import com.auto.lyric.BuildConfig;
+import com.auto.lyric.retrofit.Interceptor.EncryptInterceptor;
+import com.auto.lyric.retrofit.Interceptor.HttpLoggingInterceptor;
+import com.auto.lyric.retrofit.api.CommonApiCenter;
+import com.auto.lyric.retrofit.converter.DecryptGsonConverterFactory;
+import com.auto.lyric.retrofit.net.NetWorkListenear;
 
 import java.util.Collections;
 import java.util.concurrent.TimeUnit;
@@ -108,7 +108,7 @@
                 //设置OKHttpClient
                 .client(client)
                 //设置baseUrl,注意,baseUrl必须后缀"/"
-                .baseUrl(BuildConfig.ENVIRONMENT.equals("develop")?HOST_IP_ADDR:BuildConfig.HOST_IP_ADDR)
+                //.baseUrl(BuildConfig.ENVIRONMENT.equals("develop")?HOST_IP_ADDR:BuildConfig.HOST_IP_ADDR)
                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                 .build();
     }
diff --git a/app/src/main/java/com/auto/lyric/service/AutoInputService.java b/app/src/main/java/com/auto/lyric/service/AutoInputService.java
new file mode 100644
index 0000000..73c3ea9
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/service/AutoInputService.java
@@ -0,0 +1,210 @@
+package com.auto.lyric.service;
+
+import android.accessibilityservice.AccessibilityService;
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.SuppressLint;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Build;
+import android.util.Log;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityWindowInfo;
+import android.widget.Toast;
+
+import java.util.List;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/3/20.
+ */
+public class AutoInputService extends AccessibilityService {
+    final String TAG = "AutoInputService";
+    public static final int ACTION_SEND = 1001,//发送
+            ACTION_PASTE = 1002;//粘贴
+
+    BroadcastReceiver receiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            int action = intent.getIntExtra("action", 0);
+            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);
+                    if(sendNode != null){
+                        Log.e(TAG, "ACTION_SEND nodeInfos: " + sendNode.getClassName());
+                        sendNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
+                    }else{
+                        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();
+                    }
+
+                    break;
+            }
+        }
+    };
+
+    static  boolean flag = false , isFront;
+
+    @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()  );
+        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()) );
+        switch (eventType) {
+            case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED://界面变化事件
+                Log.e(TAG, "TYPE_WINDOW_CONTENT_CHANGED " );
+                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();
+                    }
+                }
+
+                if(event.getText().contains("更多选项") ){
+                    //printView(nodeInfo," ");
+                    //performGlobalAction(GLOBAL_ACTION_RECENTS); // 任务管理器
+                    //performGlobalAction(GLOBAL_ACTION_BACK); // 返回安装页面
+                }
+                break;
+            case AccessibilityEvent.TYPE_VIEW_FOCUSED://焦点变更
+                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()));
+                break;
+            case AccessibilityEvent.TYPE_VIEW_CLICKED:
+                Log.e(TAG, "TYPE_VIEW_CLICKED " );
+                if(nodeInfo != null) {
+                    Log.e(TAG, "TYPE_VIEW_CLICKED source:" + nodeInfo.getText() + " " + nodeInfo.getClass());
+                }
+                /**/
+                //界面点击
+                break;
+            case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
+                //界面文字改动
+                Log.e(TAG, "TYPE_VIEW_TEXT_CHANGED " );
+                break;
+        }
+
+    }
+
+    @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());
+        if(node.getChildCount() > 0){
+            for(int i = 0 ; i < node.getChildCount() ; i ++){
+                if(node.getChild(i) != null) {
+                    printView(node.getChild(i), space + " \t");
+                }
+            }
+        }
+    }
+    @SuppressLint("NewApi")
+    private AccessibilityNodeInfo getView(AccessibilityNodeInfo node, String className){
+        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) {
+                    AccessibilityNodeInfo nodeInfo = getView(node.getChild(i), className);
+                    if(nodeInfo != null){
+                        return nodeInfo;
+                    }
+                }
+            }
+        }else if(node.getClassName().equals(className)){
+            return node;
+        }
+        return null;
+    }
+
+    @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;
+                    }
+                }
+            }
+        }else if(node != null && node.getContentDescription() != null && node.getContentDescription().equals(desc)){
+            return node;
+        }
+        return null;
+    }
+    private void printWindow(AccessibilityWindowInfo window, String space){
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            Log.e(TAG,space +" id:"+window.getId() +" class:"+window.getClass().getName()+" text:"+window.getTitle()+" "+window.getRoot());
+            printView(window.getRoot()," window node ");
+        }
+        if(window.getChildCount() > 0){
+            for(int i = 0 ; i < window.getChildCount() ; i ++){
+                if(window.getChild(i) != null) {
+                    printWindow(window.getChild(i),space + " \t");
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onInterrupt() {
+        unregisterReceiver(receiver);
+    }
+    @Override
+    protected void onServiceConnected() {
+        AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();
+        serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
+        serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
+        serviceInfo.packageNames = new String[]{/*"com.tencent.mm",*/"com.ss.android.ugc.aweme"/*,"com.runt.autotext"*/};
+        serviceInfo.notificationTimeout=100;
+        serviceInfo.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+
+        setServiceInfo(serviceInfo);
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(AutoInputService.class.getName());
+        registerReceiver(receiver,filter);
+    }
+}
diff --git a/app/src/main/java/com/auto/lyric/util/MyLog.java b/app/src/main/java/com/auto/lyric/util/MyLog.java
index 5fc42ee..2d4b65e 100644
--- a/app/src/main/java/com/auto/lyric/util/MyLog.java
+++ b/app/src/main/java/com/auto/lyric/util/MyLog.java
@@ -2,7 +2,7 @@
 
 import android.util.Log;
 
-import com.runt.open.mvvm.BuildConfig;
+import com.auto.lyric.BuildConfig;
 
 
 /**
diff --git a/app/src/main/java/com/auto/lyric/vm/MainViewModel.java b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
new file mode 100644
index 0000000..395a607
--- /dev/null
+++ b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java
@@ -0,0 +1,9 @@
+package com.auto.lyric.vm;
+
+import com.auto.lyric.base.model.BaseViewModel;
+
+/**
+ * Created by Runt (qingingrunt2010@qq.com) on 2022/3/20.
+ */
+public class MainViewModel extends BaseViewModel {
+}

--
Gitblit v1.9.1