From f94146b3af6cf8a83c8c0ba62f7f86bae500dec2 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期一, 06 一月 2020 11:23:43 +0800
Subject: [PATCH] Merge branch 'master' of https://gitee.com/endian11/DriveJudge

---
 app/src/main/res/layout/layout_train_exit.xml                                  |    3 
 app/src/main/java/safeluck/drive/evaluation/app.java                           |    2 
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java    |   25 ++++
 lib/src/main/java/com/anyun/exam/lib/SvrManager.java                           |   10 +
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java       |   30 ++++
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java     |  202 +++++++++++++++++++++++++++++++++
 app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java        |   32 +++++
 app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java  |   23 +++
 app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java |   17 ++
 9 files changed, 338 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/safeluck/drive/evaluation/app.java b/app/src/main/java/safeluck/drive/evaluation/app.java
index 57d4f83..90930b5 100644
--- a/app/src/main/java/safeluck/drive/evaluation/app.java
+++ b/app/src/main/java/safeluck/drive/evaluation/app.java
@@ -15,6 +15,7 @@
 import com.anyun.exam.lib.crash.CrashHandler;
 import com.facebook.stetho.Stetho;
 
+import safeluck.drive.evaluation.cEventCenter.CEventCenter;
 import safeluck.drive.evaluation.util.SystemUtil;
 
 /**
@@ -68,6 +69,7 @@
     @Override
     public void callBackMsg(String json) {
         MyLog.d(TAG, "鏀跺埌==" + json);
+        CEventCenter.dispatchEvent("train",0,0,json);
     }
 
 
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java
new file mode 100644
index 0000000..f87b93c
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventCenter.java
@@ -0,0 +1,202 @@
+package safeluck.drive.evaluation.cEventCenter;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * MyApplication2
+ * Created by lzw on 2020/1/2. 14:03:04
+ * 閭锛�632393724@qq.com
+ * All Rights Saved! Chongqing AnYun Tech co. LTD
+ */
+public class CEventCenter {
+
+    private static final String TAG = CEventCenter.class.getSimpleName();
+
+    /**
+     * 鐩戝惉鍣ㄥ垪琛紝鏀寔涓�瀵瑰瀛樺偍
+     */
+    private static final HashMap<String , Object> LISTENER_MAP = new HashMap<>();
+
+    /**
+     * 鐩戝惉鍣ㄥ垪琛ㄩ攣
+     */
+    private static final Object LISTENER_LOCK = new Object();
+
+    /**
+     * 浜嬩欢瀵硅薄姹�
+     */
+    private static final CEventObjPool POOL = new CEventObjPool(5);
+
+    /**
+     * 娉ㄥ唽/娉ㄩ攢鐩戝惉鍣�
+     * @param toBind true娉ㄥ唽  false娉ㄩ攢
+     * @param listener 鐩戝惉鍣�
+     * @param topic 鍗曚釜涓婚
+     */
+    public static void onBindEvent(boolean toBind,ICEventListener listener,String topic){
+        onBindEvent(toBind,listener,new String[]{topic});
+    }
+
+    /**
+     *
+     * @param toBind
+     * @param listener
+     * @param topics 澶氫釜涓婚
+     */
+    public static void onBindEvent(boolean toBind,ICEventListener listener,String[] topics){
+        if (toBind){
+            registerEventListener(listener, topics);
+        }else{
+            unregisterEventListener(listener, topics);
+        }
+    }
+
+    /**
+     * 娉ㄥ唽鐩戝惉鍣�
+     * @param listener
+     * @param topic 鍗曚釜涓婚
+     */
+    public static void registerEventListener(ICEventListener listener, String topic){
+        registerEventListener(listener,new String[]{topic});
+    }
+
+    /**
+     * 娉ㄩ攢鐩戝惉鍣�
+     * @param listener
+     * @param topic  鍗曚釜涓富棰�
+     */
+    private static void unregisterEventListener(ICEventListener listener, String topic) {
+        unregisterEventListener(listener,new String[]{topic});
+    }
+
+    /**
+     * 娉ㄩ攢鐩戝惉鍣�
+     * @param listener
+     * @param topics 澶氫釜涓婚
+     */
+    private static void unregisterEventListener(ICEventListener listener, String[] topics) {
+        if (null == listener || null == topics){
+            return;
+        }
+        synchronized (LISTENER_LOCK){
+            for (String topic :
+                    topics) {
+                if (TextUtils.isEmpty(topic)) {
+                    continue;
+                }
+                Object obj = LISTENER_MAP.get(topic);
+                if (null == obj){
+                    continue;
+                }else if (obj instanceof ICEventListener){
+                    //鏈変竴涓洃鍚櫒
+                    if (obj == listener){
+                        LISTENER_MAP.remove(topic);
+                    }
+                }else if (obj instanceof List){
+                    //鏈夊涓洃鍚櫒
+                    LinkedList<ICEventListener> listeners = (LinkedList<ICEventListener>)obj;
+                    listeners.remove(listener);
+                }
+            }
+        }
+    }
+    /**
+     * 娉ㄥ唽鐩戝惉鍣�
+     * @param listener
+     * @param topics 澶氫釜涓婚
+     */
+    private static void registerEventListener(ICEventListener listener, String[] topics) {
+        if (null == listener || null == topics){
+            return;
+        }
+        synchronized (LISTENER_LOCK){
+            for (String topic :
+                    topics) {
+                if (TextUtils.isEmpty(topic)){
+                    continue;
+                }
+                Object obj = LISTENER_MAP.get(topic);
+                if (null == obj){
+                    //杩樻病鏈夌洃鍚櫒锛岀洿鎺ユ斁鍒癕ap闆嗗悎
+                    LISTENER_MAP.put(topic,listener);
+                }else if (obj instanceof  ICEventListener){
+                    //鏈変竴涓洃鍚櫒
+                    ICEventListener oldListener = (ICEventListener)obj;
+                    if (listener == oldListener){
+                        //鍘婚噸
+                        continue;
+                    }
+
+                    LinkedList<ICEventListener> list = new LinkedList<>();
+                    list.add(oldListener);
+                    list.add(listener);
+                    LISTENER_MAP.put(topic,list);
+                }else if (obj instanceof List){
+                    //鏈夊涓洃鍚櫒
+                    LinkedList<ICEventListener> listeners = (LinkedList<ICEventListener>)obj;
+                    if (listeners.indexOf(listener) >=0){
+                        //鍘婚噸
+                        continue;
+                    }
+                    listeners.add(listener);
+                }
+            }
+        }
+    }
+
+    public static void dispatchEvent(String topic, int msgCode, int resultCode, Object object){
+        if (!TextUtils.isEmpty(topic)){
+            CEvent event = POOL.get();
+            event.setMsgCode(msgCode);
+            event.setTopic(topic);
+            event.setResultCode(resultCode);
+            event.setObj(object);
+
+            dispatchEvent(event);
+        }
+    }
+
+    private static void dispatchEvent(CEvent event){
+        if (LISTENER_MAP.size() == 0){
+            return;
+        }
+        if (null != event && !TextUtils.isEmpty(event.getTopic())){
+            String topic = event.getTopic();
+
+            //閫氱煡浜嬩欢鐩戝惉鍣ㄥ鐞嗕簨浠�
+            ICEventListener listener = null;
+            LinkedList<ICEventListener> listeners = null;
+            synchronized (LISTENER_LOCK){
+                Log.d(TAG, "dispatchEvent | topic="+topic+"\tmsgCode="+event.getMsgCode()+"\tresultCode="+event.getResultCode()
+                +"\tobj="+event.getObj());
+                Object obj = LISTENER_MAP.get(topic);
+                if (obj == null){
+                    return;
+                }
+                if (obj instanceof ICEventListener){
+                    listener = (ICEventListener)obj;
+                }else if (obj instanceof List){
+                    listeners = (LinkedList<ICEventListener>)((LinkedList)obj).clone();
+                }
+            }
+
+            if (null != listener){
+                listener.onCEvent(topic,event.getMsgCode(),event.getResultCode(),event.getObj());
+            }else if (null != listeners && listeners.size()>0){
+                for (ICEventListener
+                     l:
+                     listeners) {
+                    l.onCEvent(topic, event.getMsgCode(), event.getResultCode(), event.getObj());
+                }
+            }
+            //鎶婂璞℃斁鍥炴睜閲�
+            POOL.returnObj(event);
+        }
+    }
+
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java
new file mode 100644
index 0000000..ce514ea
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/CEventObjPool.java
@@ -0,0 +1,25 @@
+package safeluck.drive.evaluation.cEventCenter;
+
+/**
+ * 浜嬩欢瀵硅薄姹�
+ * MyApplication2
+ * Created by lzw on 2020/1/2. 13:58:00
+ * 閭锛�632393724@qq.com
+ * All Rights Saved! Chongqing AnYun Tech co. LTD
+ */
+public class CEventObjPool extends ObjectPool<CEvent>{
+
+    public CEventObjPool(int capacity) {
+        super(capacity);
+    }
+
+    @Override
+    protected CEvent[] createObjPool(int capacity) {
+        return new CEvent[capacity];
+    }
+
+    @Override
+    protected CEvent createNewObj() {
+        return new CEvent();
+    }
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java
new file mode 100644
index 0000000..e24ab31
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ICEventListener.java
@@ -0,0 +1,23 @@
+package safeluck.drive.evaluation.cEventCenter;
+
+/**
+ * 浜嬩欢鐩戝惉鍣�
+ * MyApplication2
+ * Created by lzw on 2020/1/2. 14:00:14
+ * 閭锛�632393724@qq.com
+ * All Rights Saved! Chongqing AnYun Tech co. LTD
+ */
+public interface  ICEventListener {
+
+    /**
+     * 浜嬩欢鍥炶皟鍑芥暟
+     *
+     * 濡傛灉obj浣跨敤浜嗗璞℃睜
+     * 閭d箞浜嬩欢瀹屾垚鍚庯紝obj鍗宠嚜鍔ㄤ細鍙楀埌瀵硅薄姹狅紝璇蜂笉瑕佸啀鍏朵粬绾跨▼缁х画浣跨敤锛屽惁鍒欏彲鑳戒細瀵艰嚧鏁版嵁涓嶆甯�
+     * @param topic
+     * @param msgCode
+     * @param resultCode
+     * @param obj
+     */
+    void onCEvent(String topic, int msgCode, int resultCode, Object obj);
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
index 3eafce0..acaa4e5 100644
--- a/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
+++ b/app/src/main/java/safeluck/drive/evaluation/cEventCenter/ObjectPool.java
@@ -8,12 +8,20 @@
  * All Rights Saved! Chongqing AnYun Tech co. LTD
  */
 public abstract class ObjectPool<T extends PooledObject> {
+    /**
+     *  瀵硅薄瀹瑰櫒
+     */
+    private T[] mContainer;
 
-    private T[] mContainer;//瀵硅薄瀹瑰櫒
+    /**
+     *  瀵硅薄閿�
+     */
+    private final Object LOCK = new Object();
 
-    private final Object LOCK = new Object();//瀵硅薄閿�
-
-    private int length;//姣忔杩斿洖瀵硅薄閮芥斁鍒版暟鎹湯绔紝length琛ㄧず鍓嶉潰鍙敤瀵硅薄鏁�
+    /***
+     * 姣忔杩斿洖瀵硅薄閮芥斁鍒版暟鎹湯绔紝length琛ㄧず鍓嶉潰鍙敤瀵硅薄鏁�
+     */
+    private int length;
 
     public ObjectPool(int capacity) {
         mContainer = createObjPool(capacity);
@@ -60,4 +68,18 @@
         }
         return obj;
     }
+
+    /**
+     * 鎶婂璞℃斁鍥炴睜閲岄潰
+     * @param obj
+     */
+    public final void returnObj(T obj){
+        synchronized (LOCK){
+            int size = mContainer.length;
+            if (length < size){
+                mContainer[length] = obj;
+                length++;
+            }
+        }
+    }
 }
diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java
index bbb0ad3..6b9695e 100644
--- a/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java
+++ b/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java
@@ -5,11 +5,14 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Button;
 import android.widget.ListView;
 
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+
+import com.anyun.exam.lib.AYSdk;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -26,9 +29,10 @@
  * 閭锛�632393724@qq.com
  * All Rights Saved! Chongqing AnYun Tech co. LTD
  */
-public class NetWorkTrainFragment extends SupportFragment {
+public class NetWorkTrainFragment extends SupportFragment implements View.OnClickListener {
 
     private ListView mListView ;
+    private Button btn_start_exam;
     private ScoreAdapter mScoreAdapter;
 
     private List<ScoreBean> mArrayList = new ArrayList<>();
@@ -49,6 +53,8 @@
         mListView = view.findViewById(R.id.lv);
         mScoreAdapter = new ScoreAdapter(_mActivity);
         mListView.setAdapter(mScoreAdapter);
+        btn_start_exam = view.findViewById(R.id.btn_start);
+        btn_start_exam.setOnClickListener(this);
         mListView.addHeaderView(LayoutInflater.from(_mActivity).inflate(R.layout.layout_score_item,null));
         mArrayList.add(new ScoreBean(12,"鐩磋杞集","鍚庤疆鑳庡帇绾�"));
         mArrayList.add(new ScoreBean(100,"鍊掕溅鍏ュ簱","鏈郴瀹夊叏甯�"));
@@ -59,4 +65,13 @@
         mScoreAdapter.addDatas(mArrayList);
 
     }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.btn_start:
+                AYSdk.getInstance().at_sendCmd("AT+BEGIN_EXAM:0\r\n");
+                break;
+        }
+    }
 }
diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java
index d2a793d..518cb39 100644
--- a/app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java
+++ b/app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java
@@ -1,5 +1,6 @@
 package safeluck.drive.evaluation.fragment;
 
+import android.content.Context;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
@@ -11,10 +12,12 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Button;
 import android.widget.ListView;
 import android.widget.Toast;
 
 import java.util.ArrayList;
+import java.util.EventListener;
 import java.util.List;
 
 import me.yokeyword.fragmentation.SupportFragment;
@@ -26,6 +29,8 @@
 import safeluck.drive.evaluation.R;
 import safeluck.drive.evaluation.adapter.ScoreAdapter;
 import safeluck.drive.evaluation.bean.ScoreBean;
+import safeluck.drive.evaluation.cEventCenter.CEventCenter;
+import safeluck.drive.evaluation.cEventCenter.ICEventListener;
 
 /**鍗曟満璁粌UI
  * MyApplication2
@@ -37,12 +42,31 @@
 
     private static final String TAG = TrainFragment.class.getSimpleName();
     private ListView mListView ;
+    private Button btn_train;
     private ScoreAdapter mScoreAdapter;
 
     private int item_id;
 
     private List<ScoreBean> mArrayList = new ArrayList<>();
 
+    private ICEventListener eventListener =new ICEventListener() {
+        @Override
+        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
+            Log.i(TAG, "onCEvent: "+(String)obj);
+        }
+    };
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        CEventCenter.onBindEvent(true, eventListener,"train");
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        CEventCenter.onBindEvent(false,eventListener,"train");
+    }
 
     public static SupportFragment newInstance(){
         return new TrainFragment();
@@ -83,10 +107,15 @@
         return view;
     }
     private void initView(View view) {
+
         mListView = view.findViewById(R.id.lv);
         view.findViewById(R.id.view_map).setOnClickListener(this);
+        btn_train = view.findViewById(R.id.btn_start);
+        btn_train.setOnClickListener(this);
+        btn_train.setText("寮�濮嬭缁�");
         mScoreAdapter = new ScoreAdapter(_mActivity);
         mListView.setAdapter(mScoreAdapter);
+
         mListView.addHeaderView(LayoutInflater.from(_mActivity).inflate(R.layout.layout_score_item,null));
         mArrayList.add(new ScoreBean(12,"鐩磋杞集","鍚庤疆鑳庡帇绾�"));
         mArrayList.add(new ScoreBean(100,"鍊掕溅鍏ュ簱","鏈郴瀹夊叏甯�"));
@@ -107,6 +136,9 @@
                     start(passwordFragment);
                 }
                 break;
+            case R.id.btn_start:
+                Toast.makeText(_mActivity, "寮�濮嬪方瀵�", Toast.LENGTH_SHORT).show();
+                break;
         }
     }
 }
diff --git a/app/src/main/res/layout/layout_train_exit.xml b/app/src/main/res/layout/layout_train_exit.xml
index 00ed465..2405699 100644
--- a/app/src/main/res/layout/layout_train_exit.xml
+++ b/app/src/main/res/layout/layout_train_exit.xml
@@ -23,6 +23,7 @@
         android:textSize="20sp"
         android:layout_below="@+id/btn_return"
         android:padding="10dp"
+        android:id="@+id/btn_start"
         android:textColor="@android:color/white"
-        android:text="寮�濮嬭缁�"/>
+        android:text="寮�濮嬭�冭瘯"/>
 </RelativeLayout>
diff --git a/lib/src/main/java/com/anyun/exam/lib/SvrManager.java b/lib/src/main/java/com/anyun/exam/lib/SvrManager.java
index 128fff3..8335ad4 100644
--- a/lib/src/main/java/com/anyun/exam/lib/SvrManager.java
+++ b/lib/src/main/java/com/anyun/exam/lib/SvrManager.java
@@ -69,6 +69,16 @@
         }
     }
 
+    public void at_sendCmd(String s) {
+        if (!checkRemoteIsNull()){
+//            try {
+//                remoteInterface.at_sendCmd(s);
+//            } catch (RemoteException e) {
+//                e.printStackTrace();
+//            }
+        }
+    }
+
     class MyServiceConn implements ServiceConnection {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {

--
Gitblit v1.8.0