liuyuqi-dellpc 7 years ago
parent
commit
70560b9462
17 changed files with 790 additions and 15 deletions
  1. 19 1
      src/client/android/app/src/main/AndroidManifest.xml
  2. 25 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/App.java
  3. 27 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/Config.java
  4. 0 13
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/MainActivity.java
  5. 66 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/SearchEngines.java
  6. 29 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/activities/MainActivity.java
  7. 136 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/model/Topic.java
  8. 78 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/services/AssistService.java
  9. 87 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/BaiWanYingXiongJob.java
  10. 105 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/BaseQAAssistJob.java
  11. 93 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/ChongDingDaHuiJob.java
  12. 38 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/HuaJiaoZhiBoJob.java
  13. 29 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/QAAssistJob.java
  14. 49 0
      src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/ZhiShiChaoRenJob.java
  15. BIN
      src/client/android/app/src/main/res/drawable/ic_close.png
  16. 1 1
      src/client/android/app/src/main/res/layout/activity_main.xml
  17. 8 0
      src/client/android/app/src/main/res/xml/accessibility.xml

+ 19 - 1
src/client/android/app/src/main/AndroidManifest.xml

@@ -2,6 +2,10 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="me.yoqi.app.quizassist">
 
+    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
@@ -9,13 +13,27 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".MainActivity">
+        <activity android:name=".activities.MainActivity"
+            android:launchMode="singleInstance">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <service
+            android:name=".services.AssistService"
+            android:enabled="true"
+            android:exported="true"
+            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
+            >
+            <intent-filter>
+                <action  android:name="android.accessibilityservice.AccessibilityService"/>
+            </intent-filter>
+            <meta-data android:name="android.accessibilityservice"
+                android:resource="@xml/accessibility"/>
+        </service>
     </application>
 
 </manifest>

+ 25 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/App.java

@@ -0,0 +1,25 @@
+package me.yoqi.app.quizassist;
+
+import android.annotation.SuppressLint;
+import android.app.Application;
+import android.content.Context;
+
+/**
+ * Created by lll on 2018/1/14.
+ * app
+ */
+public class App extends Application {
+
+    @SuppressLint("StaticFieldLeak")
+    private static Context mContext;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mContext = this.getBaseContext();
+    }
+
+    public static Context getContext() {
+        return mContext;
+    }
+}

+ 27 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/Config.java

@@ -0,0 +1,27 @@
+package me.yoqi.app.quizassist;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+/**
+ * Created by lll on 2018/1/14.
+ * 配置
+ */
+public class Config {
+    private static final Config ourInstance = new Config();
+
+
+    private static final String AUTO_CLOSE_SEARCH = "auto_close_search";
+
+    private boolean mAutoCloseSearch;
+
+
+    public static Config getInstance() {
+        return ourInstance;
+    }
+
+    private Config() {
+        SharedPreferences config = App.getContext().getSharedPreferences("CONFIG", Context.MODE_PRIVATE);
+        mAutoCloseSearch = config.getBoolean(AUTO_CLOSE_SEARCH, false);
+    }
+}

+ 0 - 13
src/client/android/app/src/main/java/me/yoqi/app/quizassist/MainActivity.java

@@ -1,13 +0,0 @@
-package me.yoqi.app.quizassist;
-
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-
-public class MainActivity extends AppCompatActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
-    }
-}

+ 66 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/SearchEngines.java

@@ -0,0 +1,66 @@
+package me.yoqi.app.quizassist;
+
+import android.content.Context;
+import android.util.Log;
+import java.util.ArrayList;
+
+import me.yoqi.app.quizassist.activities.MainActivity;
+import me.yoqi.app.quizassist.model.Topic;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 搜索引擎
+ */
+public class SearchEngines {
+
+    private static final String TAG = "SearchEngines";
+    private static final ArrayList<Topic> mHistory = new ArrayList<>();
+    public static void clearHistory() {
+        mHistory.clear();
+    }
+
+    /** 搜索函数
+     * @param context
+     * @param topic
+     */
+    public static void search(Context context, Topic topic) {
+        //已经搜索过 , 不再重复搜索
+        if (mHistory.contains(topic)) {
+            Log.e(TAG, "已经搜索过的问题");
+            return;
+        }
+        mHistory.add(topic);
+        Log.e(TAG,topic.toString());
+        MainActivity.start(context, getSearchUrls(topic), getSearchTitles(topic));
+    }
+
+    /** 设置搜索标题
+     * @param topic 问答话题对象
+     * @return titles
+     */
+    private static ArrayList<String> getSearchTitles(Topic topic) {
+        ArrayList<String> titles = new ArrayList<>();
+        titles.add("百度");
+        titles.add("知道");
+        titles.add("知乎");
+        titles.add("百科");
+//        titles.add("谷歌");
+        return titles;
+    }
+
+    /** 根据提问生成问题url
+     * @param topic 问答话题对象
+     * @return urls
+     */
+    private static ArrayList<String> getSearchUrls(Topic topic) {
+        ArrayList<String> urls = new ArrayList<>();
+        String keyword = topic.getQuestion();
+        urls.add("https://m.baidu.com/from=0a/pu=sz%401321_480/s?word=" + keyword + "&rn=30&tn=baidulocal");
+        urls.add("https://m.baidu.com/from=0a/pu=sz%401321_480/s?word=site:zhidao.baidu.com " + keyword + "&rn=30&tn=baidulocal");
+        urls.add("https://m.baidu.com/from=0a/pu=sz%401321_480/s?word=site:www.zhihu.com " + keyword + "&rn=30&tn=baidulocal");
+        urls.add("https://m.baidu.com/from=0a/pu=sz%401321_480/s?word=site:baike.baidu.com " + keyword + "&rn=30&tn=baidulocal");
+//        urls.add("https://www.google.com/search?q=" + keyword + "&aqs=chrome..69i57.13964j0j7&sourceid=chrome-mobile&ie=UTF-8");
+
+        return urls;
+    }
+}

+ 29 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/activities/MainActivity.java

@@ -0,0 +1,29 @@
+package me.yoqi.app.quizassist.activities;
+
+import android.content.Context;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+
+import me.yoqi.app.quizassist.R;
+
+/**
+ * 程序入口
+ */
+public class MainActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+    }
+
+    /**
+     * @param context
+     * @param searchUrls
+     * @param searchTitles
+     */
+    public static void start(Context context, ArrayList<String> searchUrls, ArrayList<String> searchTitles) {
+    }
+}

+ 136 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/model/Topic.java

@@ -0,0 +1,136 @@
+package me.yoqi.app.quizassist.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+
+/**
+ * 问答话题模型
+ * Created by liuyuqi on 2018/1/16.
+ */
+
+public class Topic implements Parcelable {
+
+    /**
+     * 问题
+     */
+    private String question;
+    /**
+     * 答案
+     */
+    private ArrayList<String> answers;
+
+    /**
+     * 构造函数
+     *
+     * @param in
+     */
+    protected Topic(Parcel in) {
+        this.question = in.readString();
+        this.answers = in.createStringArrayList();
+    }
+
+    /**
+     * 构造函数
+     *
+     * @param question 初始化问题
+     */
+    public Topic(String question) {
+        this.question = question;
+    }
+
+    /**
+     * get函数
+     *
+     * @return
+     */
+    public String getQuestion() {
+        return question;
+    }
+
+    /**
+     * set函数
+     *
+     * @param question
+     */
+    public void setQuestion(String question) {
+        this.question = question;
+    }
+
+    /**
+     * get函数
+     *
+     * @return
+     */
+    public ArrayList<String> getAnswers() {
+        return answers;
+    }
+
+    /**
+     * set函数
+     *
+     * @param answers
+     */
+    public void setAnswers(ArrayList<String> answers) {
+        this.answers = answers;
+    }
+
+    /**
+     * 增加问题
+     *
+     * @param answers
+     */
+    public void addAnswer(String answers) {
+        if (this.answers == null) this.answers = new ArrayList<>();
+        this.answers.add(answers);
+    }
+
+    public static final Creator<Topic> CREATOR = new Creator<Topic>() {
+        @Override
+        public Topic createFromParcel(Parcel in) {
+            return new Topic(in);
+        }
+
+        @Override
+        public Topic[] newArray(int size) {
+            return new Topic[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return "Topic{" +
+                "question='" + question + '\'' +
+                ", answers=" + answers +
+                '}';
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(this.question);
+        dest.writeStringList(this.answers);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Topic topic = (Topic) o;
+
+        return (question != null ? question.equals(topic.question) : topic.question == null) && (answers != null ? answers.equals(topic.answers) : topic.answers == null);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = question != null ? question.hashCode() : 0;
+        result = 31 * result + (answers != null ? answers.hashCode() : 0);
+        return result;
+    }
+}

+ 78 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/services/AssistService.java

@@ -0,0 +1,78 @@
+package me.yoqi.app.quizassist.services;
+
+import android.accessibilityservice.AccessibilityService;
+import android.view.KeyEvent;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.util.ArrayList;
+
+import me.yoqi.app.quizassist.tasks.BaiWanYingXiongJob;
+import me.yoqi.app.quizassist.tasks.ChongDingDaHuiJob;
+import me.yoqi.app.quizassist.tasks.HuaJiaoZhiBoJob;
+import me.yoqi.app.quizassist.tasks.QAAssistJob;
+import me.yoqi.app.quizassist.tasks.ZhiShiChaoRenJob;
+
+/**
+ *直播答题助手服务
+ */
+public class AssistService extends AccessibilityService {
+
+    public static final String TAG = "AssistService";
+    public static final ArrayList<Class<? extends QAAssistJob>> JOBS = new ArrayList<>();
+    public final ArrayList<QAAssistJob> mQAAssistJobs = new ArrayList<>();
+    private static AssistService aService = null;
+
+    static {
+        register(ChongDingDaHuiJob.class);
+        register(ZhiShiChaoRenJob.class);
+        register(BaiWanYingXiongJob.class);
+        register(HuaJiaoZhiBoJob.class);
+    }
+
+    public static void register(Class<? extends QAAssistJob> job) {
+        JOBS.add(job);
+    }
+
+    @SuppressWarnings("unused")
+    public static void unregister(Class<? extends QAAssistJob> job) {
+        JOBS.remove(job);
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+
+    @Override
+    protected void onServiceConnected() {
+        super.onServiceConnected();
+    }
+
+    @Override
+    protected boolean onGesture(int gestureId) {
+        return super.onGesture(gestureId);
+    }
+
+    @Override
+    protected boolean onKeyEvent(KeyEvent event) {
+        return super.onKeyEvent(event);
+    }
+
+    public AssistService() {
+    }
+
+    @Override
+    public void onAccessibilityEvent(AccessibilityEvent event) {
+
+    }
+
+    @Override
+    public void onInterrupt() {
+
+    }
+}

+ 87 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/BaiWanYingXiongJob.java

@@ -0,0 +1,87 @@
+package me.yoqi.app.quizassist.tasks;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+import com.lll.auxiliary.SearchEngines;
+import com.lll.auxiliary.bean.Topic;
+import com.lll.auxiliary.service.QAAssistService;
+import com.lll.auxiliary.utils.Log;
+
+import java.util.List;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 西瓜视频-百万英雄
+ */
+public class BaiWanYingXiongJob extends BaseQAAssistJob {
+
+    private static final String PACKAGE_NAME = "com.ss.android.article.video";
+
+    @Override
+    public String getTargetPackageName() {
+        return PACKAGE_NAME;
+    }
+
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+    @Override
+    public void onEvent(QAAssistService service, AccessibilityEvent event) {
+        super.onEvent(service, event);
+        AccessibilityNodeInfo window = service.getRootInActiveWindow();
+        if (window != null) {
+            recycle(window);
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            List<AccessibilityWindowInfo> windows = service.getWindows();
+            if (windows != null && !windows.isEmpty()) {
+                for (AccessibilityWindowInfo windowInfo : windows) {
+                    recycle(windowInfo.getRoot());
+                }
+            }
+        }
+        if(window == null)return;
+        List<String> question = getTextByViewId(window, "2131755270");//Q
+        if (question == null || question.isEmpty()) return;
+        Topic topic = new Topic();
+        for (String q : question) {
+            Log.e(TAG, "question : " + q);
+            topic.setQuestion(q);
+        }
+        List<String> answer = getTextByViewId(window, "2131755523");//A
+        if (answer == null) return;
+        for (String a : answer) {
+            topic.addAnswer(a);
+            Log.e(TAG, "answer : " + a);
+        }
+        SearchEngines.search(service.getBaseContext(), topic);
+    }
+
+    @TargetApi(Build.VERSION_CODES.KITKAT)
+    public void recycle(AccessibilityNodeInfo info) {
+        if (info == null) return;
+        if (info.getChildCount() == 0) {
+            Log.i(TAG, "Text:" + info.getText());
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                Log.i(TAG, "AvailableExtraData:" + info.getAvailableExtraData());
+            }
+            Bundle extras = info.getExtras();
+            if (extras != null) {
+                Log.i(TAG, "extras:" + extras);
+            }
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                Log.i(TAG, "Text:" + info.getHintText());
+            }
+        } else {
+            for (int i = 0; i < info.getChildCount(); i++) {
+                AccessibilityNodeInfo child = info.getChild(i);
+                if (child != null) {
+                    recycle(info.getChild(i));
+                }
+            }
+        }
+    }
+}

+ 105 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/BaseQAAssistJob.java

@@ -0,0 +1,105 @@
+package me.yoqi.app.quizassist.tasks;
+
+import android.os.Build;
+import android.view.KeyEvent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import com.lll.auxiliary.SearchEngines;
+import com.lll.auxiliary.service.QAAssistService;
+import com.lll.auxiliary.utils.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static android.view.accessibility.AccessibilityEvent.eventTypeToString;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 答题辅助
+ */
+public abstract class BaseQAAssistJob implements QAAssistJob {
+
+    String TAG = "BaseQAAssistJob";
+
+    BaseQAAssistJob() {
+        TAG = this.getClass().getSimpleName();
+    }
+
+    @Override
+    public void onCreate() {
+        
+    }
+
+    @Override
+    public void onKeyEvent(KeyEvent event) {
+
+    }
+
+    @Override
+    public void onConnected() {
+        SearchEngines.clearHistory();
+    }
+
+    @Override
+    public abstract String getTargetPackageName();
+
+    @Override
+    public boolean isEnable() {
+        return true;
+    }
+
+    @Override
+    public void onEvent(QAAssistService service, AccessibilityEvent event) {
+        Log.i(TAG, "event:" + eventTypeToString(event.getEventType()));
+    }
+
+    @Override
+    public void onDestroy() {
+        SearchEngines.clearHistory();
+    }
+
+    @Override
+    public void onInterrupt() {
+
+    }
+
+    @SuppressWarnings("unused")
+    HashMap<String, String> getTextsByViewIds(AccessibilityNodeInfo nodeInfo, String... ids) {
+        if (ids == null) return null;
+        HashMap<String, String> texts = new HashMap<>();
+        for (String id : ids) {
+            List<String> list = getTextByViewId(nodeInfo, id);
+            if (list != null && !list.isEmpty()) {
+                texts.put(id, list.get(0));
+            } else {
+                texts.put(id, null);
+            }
+        }
+        return texts;
+    }
+
+    public List<AccessibilityNodeInfo> getNodeInfoById(AccessibilityNodeInfo nodeInfo, String id) {
+        if (nodeInfo == null) return null;
+        List<AccessibilityNodeInfo> infos = null;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            infos = nodeInfo.findAccessibilityNodeInfosByViewId(id);
+        }
+        return infos;
+    }
+
+    List<String> getTextByViewId(AccessibilityNodeInfo nodeInfo, String viewId) {
+        if (nodeInfo == null) return null;
+        List<AccessibilityNodeInfo> infos = null;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            infos = nodeInfo.findAccessibilityNodeInfosByViewId(viewId);
+        }
+        if (infos == null) return null;
+        List<String> texts = new ArrayList<>();
+        for (AccessibilityNodeInfo info : infos) {
+            texts.add(info.getText().toString());
+        }
+        return texts;
+    }
+}

+ 93 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/ChongDingDaHuiJob.java

@@ -0,0 +1,93 @@
+package me.yoqi.app.quizassist.tasks;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import com.lll.auxiliary.SearchEngines;
+import com.lll.auxiliary.bean.Topic;
+import com.lll.auxiliary.service.QAAssistService;
+import com.lll.auxiliary.utils.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 冲顶大会
+ *
+ * @version 1.0 只有问题 , 没有答案
+ */
+public class ChongDingDaHuiJob extends BaseQAAssistJob {
+    private static final String PACKAGE_NAME = "com.chongdingdahui.app";
+
+    @Override
+    public String getTargetPackageName() {
+        return PACKAGE_NAME;
+    }
+
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+    @Override
+    public void onEvent(QAAssistService service, AccessibilityEvent event) {
+        super.onEvent(service, event);
+        AccessibilityNodeInfo activeWindow = service.getRootInActiveWindow();
+        if (activeWindow == null) return;
+        List<String> question = getTextByViewId(activeWindow, "2131755202");//Q
+        if (question == null) return;
+        Topic topic = new Topic();
+        for (String q : question) {
+            Log.e(TAG, "question : " + q);
+            topic.setQuestion(q);
+        }
+
+        List<AccessibilityNodeInfo> answer1 = getNodeInfoById(activeWindow, "2131755214");
+        if(answer1 != null && !answer1.isEmpty()){
+            for (AccessibilityNodeInfo info : answer1) {
+                Log.e(TAG, "answer1NodeInfo : " + info);
+            }
+        }
+        List<AccessibilityNodeInfo> answer2 = getNodeInfoById(activeWindow, "2131755215");
+        if(answer1 != null && !answer1.isEmpty()){
+            for (AccessibilityNodeInfo info : answer2) {
+                Log.e(TAG, "answer1NodeInfo : " + info);
+            }
+        }
+        List<AccessibilityNodeInfo> answer3 = getNodeInfoById(activeWindow, "2131755216");
+        if(answer1 != null && !answer1.isEmpty()){
+            for (AccessibilityNodeInfo info : answer3) {
+                Log.e(TAG, "answer1NodeInfo : " + info);
+            }
+        }
+//        HashMap<String, String> answer = getTextsByViewIds(activeWindow, "2131755214", "2131755215", "2131755216");//A
+//        if (answer == null) return;
+//        for (Map.Entry<String, String> entry : answer.entrySet()) {
+//            Log.e(TAG, "answer : " + entry.getValue());
+//            topic.addAnswer(entry.getValue());
+//        }
+        SearchEngines.search(service.getBaseContext(), topic);
+    }
+
+    List<String> getTextByViewId(AccessibilityNodeInfo nodeInfo, String viewId) {
+        if (nodeInfo == null) return null;
+        List<AccessibilityNodeInfo> infos = null;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            infos = nodeInfo.findAccessibilityNodeInfosByViewId(viewId);
+        }
+        if (infos == null) return null;
+        List<String> texts = new ArrayList<>();
+        for (AccessibilityNodeInfo info : infos) {
+            AccessibilityNodeInfo parent = info.getParent();
+            if (parent != null && parent.getChildCount() == 5) {
+                CharSequence className = parent.getClassName();
+                if (className != null && TextUtils.equals("android.widget.RelativeLayout", className)) {
+                    texts.add(info.getText().toString());
+                }
+            }
+        }
+        return texts;
+    }
+}

+ 38 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/HuaJiaoZhiBoJob.java

@@ -0,0 +1,38 @@
+package me.yoqi.app.quizassist.tasks;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import com.lll.auxiliary.service.QAAssistService;
+import com.lll.auxiliary.utils.Log;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 花椒直播-百万赢家
+ */
+public class HuaJiaoZhiBoJob extends BaseQAAssistJob {
+    private static final String PACKAGE_NAME = "com.huajiao";
+
+    @Override
+    public String getTargetPackageName() {
+        return PACKAGE_NAME;
+    }
+
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+    @Override
+    public void onEvent(QAAssistService service, AccessibilityEvent event) {
+        super.onEvent(service, event);
+        AccessibilityNodeInfo window = service.getRootInActiveWindow();
+        if (window == null) return;
+        HashMap<String, String> ids = getTextsByViewIds(window, "");
+        if (ids == null) return;
+        for (Map.Entry<String, String> entry : ids.entrySet()) {
+            Log.e(TAG, "id :" + entry.getKey() + "\t\t text :" + entry.getValue());
+        }
+    }
+}

+ 29 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/QAAssistJob.java

@@ -0,0 +1,29 @@
+package me.yoqi.app.quizassist.tasks;
+
+import android.view.KeyEvent;
+import android.view.accessibility.AccessibilityEvent;
+
+import com.lll.auxiliary.service.QAAssistService;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 答题辅助
+ */
+public interface QAAssistJob {
+
+    void onCreate();
+
+    void onKeyEvent(KeyEvent event);
+
+    void onConnected();
+
+    String getTargetPackageName();
+
+    boolean isEnable();
+
+    void onEvent(QAAssistService service, AccessibilityEvent event);
+
+    void onDestroy();
+
+    void onInterrupt();
+}

+ 49 - 0
src/client/android/app/src/main/java/me/yoqi/app/quizassist/tasks/ZhiShiChaoRenJob.java

@@ -0,0 +1,49 @@
+package me.yoqi.app.quizassist.tasks;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import com.lll.auxiliary.SearchEngines;
+import com.lll.auxiliary.bean.Topic;
+import com.lll.auxiliary.service.QAAssistService;
+import com.lll.auxiliary.utils.Log;
+
+import java.util.List;
+
+/**
+ * Created by lll on 2018/1/13.
+ * 芝士超人
+ * @version 1.0 OK
+ */
+public class ZhiShiChaoRenJob extends BaseQAAssistJob  {
+
+    private static final String PACKAGE_NAME = "com.inke.trivia";
+
+    @Override
+    public String getTargetPackageName() {
+        return PACKAGE_NAME;
+    }
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+    @Override
+    public void onEvent(QAAssistService service, AccessibilityEvent event) {
+        super.onEvent(service, event);
+        AccessibilityNodeInfo window = service.getRootInActiveWindow();
+        if(window == null)return;
+        List<String> question = getTextByViewId(window, "2131624297");//Q
+        if (question == null || question.isEmpty()) return;
+        Topic topic = new Topic();
+        for (String q : question) {
+            Log.e(TAG, "question : " + q);
+            topic.setQuestion(q);
+        }
+        List<String> answer = getTextByViewId(window, "2131624288");//A
+        if (answer == null) return;
+        for (String a : answer) {
+            Log.e(TAG, "answer : " + a);
+            topic.addAnswer(a);
+        }
+        SearchEngines.search(service.getBaseContext(), topic);
+    }
+}

BIN
src/client/android/app/src/main/res/drawable/ic_close.png


+ 1 - 1
src/client/android/app/src/main/res/layout/activity_main.xml

@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="me.yoqi.app.quizassist.MainActivity">
+    tools:context="me.yoqi.app.quizassist.activities.MainActivity">
 
     <TextView
         android:layout_width="wrap_content"

+ 8 - 0
src/client/android/app/src/main/res/xml/accessibility.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<accessibility-service
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accessibilityEventTypes="typeAllMask"
+    android:accessibilityFeedbackType="feedbackGeneric"
+    android:accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows|flagRequestAccessibilityButton|flagRequestFilterKeyEvents"
+    android:canRetrieveWindowContent="true"
+    android:notificationTimeout="100"/>