浏览代码

优化事件提醒及事件记录显示,区分已取消事件

weizhengliang 9 月之前
父节点
当前提交
8a70c55c5c

+ 1 - 7
android_mobile/src/main/yd_w_xiaomi_2/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt

@@ -64,8 +64,6 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
 
     private val watchCallRecordsItemAdapter = WatchCallRecordsItemAdapter(ArrayList())
 
-    private lateinit var loadingDialog: LoadingDialog
-
     private var customerId = ""
 
     var all = "ALL"
@@ -104,8 +102,6 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
         call_records_recyv.layoutManager = virtualLayoutManager
         call_records_recyv.adapter = delegateAdapter
 
-        //loadingDialog = CommonTool.createLoadingDialog(this, R.layout.custom_loading,R.id.loadding_image)
-
         receivedData = intent.getSerializableExtra("data") as WatchContactsVO?
         action = intent.getStringExtra("action")
         customerId = intent.getStringExtra("customer_id").toString()
@@ -227,7 +223,7 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
             Constants.oldEvent = true
             Constants.eventList.add(data)
 
-            var intent = Intent()
+            val intent = Intent()
             intent.setClass(this, NewEventListActivity::class.java)
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
             startActivity(intent)
@@ -314,10 +310,8 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
             Log.i(TAG, tcpModel.toJson())
             if (tcpModel.type == TcpType.VOICE) {
                 if (tcpModel.action == TcpAction.VoiceAction.SUCCESS) {
-                    //loadingDialog.dismiss()
                     //界面呈现,逻辑在service中
                 } else if (tcpModel.action == TcpAction.VoiceAction.FAILED) {
-                    //loadingDialog.dismiss()
                     call_relyout.isEnabled = true
                     DeviceChannel.calling = false
                     DeviceChannel.callId = 0

+ 0 - 32
android_mobile/src/main/yd_w_xiaomi_2/code/com/wdkl/ncs/android/component/home/adapter/NewEventItemAdapter.kt

@@ -136,16 +136,6 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                                 }
                             }
                             TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
-
-                            /*NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
-                                if (it) {
-                                    Log.d(TAG, "TCP.发送消息完成")
-                                } else {
-                                    Log.e(TAG, "TCP.发送消息失败")
-                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
-                                }
-                                loadingDialog.dismiss()
-                            }*/
                         }
                     }
                 }
@@ -198,15 +188,6 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                                     }
                                 }
                                 TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
-
-                                /*NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
-                                    if (it) {
-                                        Log.d(TAG, "TCP.发送消息完成")
-                                    } else {
-                                        Log.e(TAG, "TCP.发送消息失败")
-                                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
-                                    }
-                                }*/
                             }
                         }
                     }
@@ -255,19 +236,6 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                                 }
                             }
                             TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
-
-                            /*NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
-                                if (it) {
-                                    Log.d(TAG, "TCP.发送消息完成")
-                                    tcpModel.data = Gson().toJson(itemData)
-                                    EventBus.getDefault().post(MessageEvent(tcpModel, 999))
-                                } else {
-                                    Log.e(TAG, "TCP.发送消息失败")
-
-                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
-                                }
-                                loadingDialog.dismiss()
-                            }*/
                         }
                     }
                 }

+ 43 - 56
android_mobile/src/main/yd_w_xiaomi_2/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt

@@ -14,6 +14,7 @@ import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.enums.DeviceTypeEnum
+import com.wdkl.ncs.android.middleware.tcp.enums.EventStatusEnum
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.StringUtil
 
@@ -83,31 +84,54 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                 binding.nameTv.text = "To: " + itemData.toFrameFullName
             }
 
+            if (itemData.actionType == TcpType.EVENT.name) {
+                if (itemData.actionEndMemberId != null) {
+                    //已响应
+                    binding.treatmentStateImagev.setImageResource(R.drawable.checked_100)
+                    binding.treatmentStateImagev.visibility = View.VISIBLE
+                    binding.playTv.visibility = View.GONE
+                    binding.projectTv.visibility = View.VISIBLE
+                    binding.conductorNameTv.visibility = View.VISIBLE
+                    binding.projectTv.text = itemData.data
+                    binding.conductorNameTv.text = itemData.actionEndMemberName
+                    binding.processingTimeTv.text = TimeTransition().stampToDate(itemData.actionEnd*1000)
+                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_do)
+                    binding.callStatusImagev.setImageResource(R.drawable.event_do)
+                    binding.callStatusImagev.visibility = View.VISIBLE
+                } else {
+                    if (itemData.actionStatus == EventStatusEnum.CANCELED.status) {
+                        //已取消
+                        binding.treatmentStateImagev.visibility = View.GONE
+                        binding.playTv.visibility = View.GONE
+                        binding.projectTv.visibility = View.VISIBLE
+                        binding.projectTv.text = itemData.data
+                        binding.projectTv.setBackgroundResource(R.drawable.sp_event_cancel)
+                        binding.callStatusImagev.setImageResource(R.drawable.event_undo)
+                        binding.callStatusImagev.visibility = View.VISIBLE
+                        binding.processingTimeTv.setText(R.string.event_cancel)
+                    } else {
+                        //未响应
+                        binding.treatmentStateImagev.setImageResource(R.drawable.unchecked_100)
+                        binding.treatmentStateImagev.visibility = View.VISIBLE
+                        binding.playTv.visibility = View.GONE
+                        binding.projectTv.visibility = View.VISIBLE
+                        binding.projectTv.text = itemData.data
+                        binding.projectTv.setBackgroundResource(R.drawable.sp_event_undo)
+                        binding.callStatusImagev.setImageResource(R.drawable.event_undo)
+                        binding.callStatusImagev.visibility = View.VISIBLE
+                        binding.processingTimeTv.setText(R.string.event_undo)
+                    }
+                }
+
+                return
+            }
+
             //是否已播放 已响应
             if (itemData.actionEnd != null) {
                 binding.treatmentStateImagev.setImageResource(R.drawable.checked_100)
                 binding.treatmentStateImagev.visibility = View.VISIBLE
                 binding.processingTimeTv.visibility = View.VISIBLE
 
-                //判断是呼入还是呼出
-                /*if (itemData.fromDeviceMemberId == Constants.memberId){
-                    binding.sickbedTv.text = itemData.toFrameFullName
-                    if (TextUtils.isEmpty(itemData.toMemberName)) {
-                        binding.nameTv.text = "To: " + StringUtil.getResString(R.string.str_null)
-                    } else {
-                        binding.nameTv.text = "To: " + itemData.toMemberName
-                    }
-                    binding.callStatusImagev.setImageResource(R.drawable.hu_chu_yi_jie)
-                } else {
-                    binding.sickbedTv.text = itemData.fromFrameFullName
-                    if (TextUtils.isEmpty(itemData.fromMemberName)) {
-                        binding.nameTv.text = "From: " + StringUtil.getResString(R.string.str_null)
-                    } else {
-                        binding.nameTv.text = "From: " + itemData.fromMemberName
-                    }
-                    binding.callStatusImagev.setImageResource(R.drawable.hu_ru_yi_jie)
-                }*/
-
                 if(itemData.actionType == TcpType.SOS.name){ //sos紧急呼叫 已处理
                     binding.playTv.visibility = View.GONE
                     binding.projectTv.visibility = View.VISIBLE
@@ -118,16 +142,6 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                     binding.projectTv.setBackgroundResource(R.drawable.sp_event_do)
                     binding.callStatusImagev.setImageResource(R.drawable.sos_96)
                     binding.callStatusImagev.visibility = View.VISIBLE
-                }else if(itemData.actionType == TcpType.EVENT.name){//事件已经响应 相应的数据
-                    binding.playTv.visibility = View.GONE
-                    binding.projectTv.visibility = View.VISIBLE
-                    binding.conductorNameTv.visibility = View.VISIBLE
-                    binding.projectTv.text = itemData.data
-                    binding.conductorNameTv.text = itemData.actionEndMemberName
-                    binding.processingTimeTv.text = TimeTransition().stampToDate(itemData.actionEnd*1000)
-                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_do)
-                    binding.callStatusImagev.setImageResource(R.drawable.event_do)
-                    binding.callStatusImagev.visibility = View.VISIBLE
                 }else if (itemData.actionType == TcpType.IM.name){//语音已播放
 
                     binding.projectTv.visibility = View.GONE
@@ -166,25 +180,6 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                 binding.conductorNameTv.visibility = View.GONE
                 binding.processingTimeTv.visibility = View.VISIBLE
 
-                //判断是呼入还是呼出 1 分机到主机 2主机到分机
-                /*if(Constants.memberId != itemData.fromDeviceMemberId){
-                    binding.sickbedTv.text = itemData.fromFrameFullName
-                    if (TextUtils.isEmpty(itemData.fromMemberName)) {
-                        binding.nameTv.text = "From: " + StringUtil.getResString(R.string.str_null)
-                    } else {
-                        binding.nameTv.text = "From: " + itemData.fromMemberName
-                    }
-                    binding.callStatusImagev.setImageResource(R.drawable.hu_ru_wei_jie)
-                }else{
-                    binding.sickbedTv.text = itemData.toFrameFullName
-                    if (TextUtils.isEmpty(itemData.toMemberName)) {
-                        binding.nameTv.text = "To: " + StringUtil.getResString(R.string.str_null)
-                    } else {
-                        binding.nameTv.text = "To: " + itemData.toMemberName
-                    }
-                    binding.callStatusImagev.setImageResource(R.drawable.hu_chu_wei_jie)
-                }*/
-
                 if(itemData.actionType == TcpType.SOS.name){ //sos紧急呼叫 未处理
                     binding.playTv.visibility = View.GONE
                     binding.projectTv.visibility = View.VISIBLE
@@ -193,14 +188,6 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                     binding.processingTimeTv.setText(R.string.event_undo)
                     binding.callStatusImagev.setImageResource(R.drawable.sos_96)
                     binding.callStatusImagev.visibility = View.VISIBLE
-                }else if(itemData.actionType == TcpType.EVENT.name){//事件未处理
-                    binding.playTv.visibility = View.GONE
-                    binding.projectTv.visibility = View.VISIBLE
-                    binding.projectTv.text = itemData.data
-                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_undo)
-                    binding.callStatusImagev.setImageResource(R.drawable.event_undo)
-                    binding.callStatusImagev.visibility = View.VISIBLE
-                    binding.processingTimeTv.setText(R.string.event_undo)
                 }else if (itemData.actionType == TcpType.IM.name){//语音未播放
                     binding.projectTv.visibility = View.GONE
                     binding.playTv.visibility = View.VISIBLE

+ 9 - 15
android_mobile/src/main/yd_w_xiaomi_2/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -487,7 +487,7 @@ class WdKeepAliveService : AbsWorkService() {
                     handleVibrator()
                     //消除事件
                     val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                    var iterator = Constants.eventList.iterator()
+                    val iterator = Constants.eventList.iterator()
                     while (iterator.hasNext()) {
                         val it = iterator.next()
                         if (it.id.equals(interactionVO.id)) {
@@ -878,15 +878,16 @@ class WdKeepAliveService : AbsWorkService() {
                 if (Locale.CHINESE.getLanguage().equals(language)) {
                     SpeechUtil.getInstance().startSpeak("您有新的事件待处理, " + eventStr)
                 } else {
-                    RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
+                    //RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
+
+                    val text = interactionVO.fromFrameFullName.replace("-", ",") + ", " + interactionVO.data
+                    SpeechUtil.getInstance().startSpeak(text)
                 }
             } else {
-                //MediaPlayHelper.getInstance().playResMusic(R.raw.new_event, 1.0f, false)
-                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.new_event, false)
+                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
             }
         } else if (model.type == TcpType.SOS) {
             AppTool.Time.delay(200) {
-                //MediaPlayHelper.getInstance().playResMusic(R.raw.sos, 1.0f, true)
                 RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.sos, false)
             }
         } else if (model.action == TcpAction.EventAction.CANCEL) { // 事件取消
@@ -900,10 +901,7 @@ class WdKeepAliveService : AbsWorkService() {
                     RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
                 }
             } else {
-                AppTool.Time.delay(200) {
-                    //MediaPlayHelper.getInstance().playResMusic(R.raw.new_event, 1.0f, false)
-                    RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.new_event, false)
-                }
+                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
             }
         } else if (model.action == TcpAction.EventAction.COMPLETED) { //事件完成
             val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ", " +
@@ -916,9 +914,7 @@ class WdKeepAliveService : AbsWorkService() {
                     RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
                 }
             } else {
-                AppTool.Time.delay(200) {
-                    RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
-                }
+                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
             }
         } else if(model.action==TcpAction.EventAction.RESPONSED){
             val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ", " + interactionVO.data + "事件已由"+interactionVO.actionEndMemberName+"响应"
@@ -930,9 +926,7 @@ class WdKeepAliveService : AbsWorkService() {
                     RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
                 }
             } else {
-                AppTool.Time.delay(200) {
-                    RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
-                }
+                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
             }
         }
     }

+ 5 - 0
android_mobile/src/main/yd_w_xiaomi_2/res/drawable/sp_event_cancel.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#9FD8DF"/>
+    <corners android:radius="5sp"/>
+</shape>

+ 1 - 6
android_mobile/src/main/yd_w_xiaomi_2/res/layout/adapter_watch_call_records_item.xml

@@ -15,12 +15,6 @@
             android:layout_centerVertical="true"
             android:orientation="vertical">
 
-<!--            <ImageView-->
-<!--                android:id="@+id/tab_imagev"-->
-<!--                android:layout_width="wrap_content"-->
-<!--                android:layout_height="wrap_content"-->
-<!--                android:src="@drawable/hu_ru_yi_jie" />-->
-
             <ImageView
                 android:id="@+id/call_status_imagev"
                 android:layout_width="26dp"
@@ -125,6 +119,7 @@
                     android:id="@+id/processing_time_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
+                    android:textColor="#F78B8F"
                     android:textSize="12sp" />
             </LinearLayout>
         </RelativeLayout>

+ 0 - 182
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/NettyClient.kt.bak

@@ -1,182 +0,0 @@
-package com.wdkl.ncs.android.middleware.tcp
-
-import android.util.Log
-import com.enation.javashop.net.engine.utils.ThreadFromUtils
-import io.netty.bootstrap.Bootstrap
-import io.netty.channel.Channel
-import io.netty.channel.ChannelInitializer
-import io.netty.channel.ChannelOption
-import io.netty.channel.nio.NioEventLoopGroup
-import io.netty.channel.socket.SocketChannel
-import io.netty.channel.socket.nio.NioSocketChannel
-import io.netty.handler.codec.LengthFieldBasedFrameDecoder
-import io.netty.handler.codec.LengthFieldPrepender
-import io.netty.handler.codec.string.StringDecoder
-import io.netty.handler.codec.string.StringEncoder
-import io.netty.handler.timeout.IdleStateHandler
-import io.netty.util.CharsetUtil
-import io.reactivex.Observable
-import java.util.concurrent.Executors
-import java.util.concurrent.ScheduledExecutorService
-import java.util.concurrent.TimeUnit
-import kotlin.properties.Delegates
-
-class NettyClient{
-    private val TAG = NettyClient::class.java.simpleName
-
-    /*是否连接*/
-    private var isConnect = false
-
-    /*伴生对象*/
-    companion object {
-        var instance = NettyClient()
-        var isConnecting = false
-
-    }
-
-    private lateinit var group: NioEventLoopGroup
-    private lateinit var bootstrap: Bootstrap
-    private var channel: Channel? = null
-
-    //重连间隔
-    private val retrySeconds : Long = 2
-
-    //重连计数
-    private var retryTimes = 0
-
-    private lateinit var ip: String
-    private var port by Delegates.notNull<Int>()
-    private var heartBeatSeconds by Delegates.notNull<Long>()
-
-    //数据处理
-    private var tcpClientHandler = TcpClientHandler()
-
-    fun getChannel(): Channel? {
-        return channel
-    }
-
-    /*连接*/
-    @Synchronized
-    fun connect(ip: String, port: Int, heartBeatSeconds: Long): Observable<Boolean> {
-        Log.d(TAG, "开始连接 " + ip + ":" + port +","+heartBeatSeconds)
-        isConnecting = true
-
-        this.ip = ip
-        this.port = port
-        this.heartBeatSeconds = heartBeatSeconds
-
-        return Observable.create<Boolean> {
-            group = NioEventLoopGroup()
-            bootstrap = Bootstrap()
-                    .remoteAddress(ip, port)
-                    .group(group)
-                    .channel(NioSocketChannel::class.java)
-                    .option(ChannelOption.SO_KEEPALIVE, true)
-                    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
-                    .handler(object : ChannelInitializer<SocketChannel>() {
-                        override fun initChannel(sc: SocketChannel) {
-                            val pipeline = sc.pipeline()
-
-                            // 这里将LengthFieldBasedFrameDecoder添加到pipeline的首位,因为其需要对接收到的数据
-                            // 进行长度字段解码,这里也会对数据进行粘包和拆包处理
-                            pipeline.addLast(LengthFieldBasedFrameDecoder(2048, 0, 2, 0, 2))
-                            // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
-                            pipeline.addLast(LengthFieldPrepender(2))
-                            //心跳包应当小于服务器间隔
-                            pipeline.addLast(IdleStateHandler(heartBeatSeconds * 2, heartBeatSeconds, 0, TimeUnit.SECONDS))
-                            pipeline.addLast(StringDecoder(CharsetUtil.UTF_8))
-                            pipeline.addLast(StringEncoder(CharsetUtil.UTF_8))
-                            pipeline.addLast(tcpClientHandler)
-                        }
-                    })
-
-
-            try {
-                channel = bootstrap.connect().sync().channel()
-                it.onNext(channel!!.isActive)
-                isConnect = channel!!.isActive
-            } catch (e: Exception) {
-                isConnect = false
-                Log.d(TAG, "TCP.exception:${e.message}")
-
-                if (retryTimes>30){
-                    retryTimes = 0
-                    it.onNext(false)
-                } else {
-                    group.schedule(Runnable {
-                        group.shutdownGracefully()
-                        connect(ip, port, heartBeatSeconds)
-                        retryTimes++
-                    }, retrySeconds * retryTimes, TimeUnit.SECONDS)
-                }
-            } finally {
-                isConnecting = false
-            }
-        }.compose(ThreadFromUtils.defaultSchedulers())
-    }
-
-
-    /*发送命令*/
-    fun sendMsg(msg: String): Observable<Boolean> {
-        Log.d(TAG, "TCP.发送消息:$msg")
-        return Observable.create<Boolean> { emitter ->
-            if (isConnect) {
-                channel?.writeAndFlush(msg)?.addListener {
-                    emitter.onNext(it.isSuccess)
-                }
-            } else {
-                emitter.onNext(false)
-            }
-        }.compose(ThreadFromUtils.defaultSchedulers())
-    }
-
-    /*是否连接*/
-    fun isConnect(): Boolean {
-        return isConnect
-    }
-
-    /*重连*/
-    @Synchronized
-    fun reConnect(): Observable<Boolean> {
-        if (isConnecting){
-            Log.w(TAG, "TCP.在连接过程中")
-            return Observable.create<Boolean>{
-                it.onComplete()
-            }
-        }
-
-        if (channel!=null && channel!!.isActive){
-            Log.w(TAG, "TCP.已经连接上")
-            return Observable.create<Boolean>{
-                it.onComplete()
-            }
-        }
-
-        isConnecting = true
-        return Observable.create<Boolean> {
-            try {
-                channel = null
-                channel = bootstrap.connect().sync().channel();
-                it.onNext(channel!!.isActive)
-                isConnect = channel!!.isActive
-            } catch (e:Exception){
-                isConnect = false
-                it.onNext(false)
-            } finally {
-                isConnecting = false
-            }
-        }
-
-//        disConnect()
-//        return connect(ip, port, heartBeatSeconds)
-    }
-
-
-    /*关闭连接*/
-    fun disConnect() {
-        if (channel!=null) {
-            isConnect = false
-            group.shutdownGracefully()
-        }
-    }
-}

+ 63 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/EventStatusEnum.java

@@ -0,0 +1,63 @@
+package com.wdkl.ncs.android.middleware.tcp.enums;
+
+/**
+ * @author wuyunfeng
+ * 2021-12-04 15:19
+ * 按键事件状态枚举
+ */
+public enum EventStatusEnum {
+
+    SENDED(1, "已发送"),
+    RESPONSED(2, "已响应"),
+    CANCELED(3, "已取消"),
+    COMPLETED(4, "已完成");
+
+
+    private final int value;
+    private final String status;
+
+    EventStatusEnum(int value, String status) {
+        this.value = value;
+        this.status = status;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * 通过status 转换成枚举
+     * @param status
+     * @return
+     */
+    public static EventStatusEnum parse(String status) {
+        EventStatusEnum[] values = EventStatusEnum.values();
+        for (EventStatusEnum value : values) {
+            if (value.getStatus().equals(status)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 通过value值转换成枚举
+     *
+     * @param value
+     * @return
+     */
+    public static EventStatusEnum parse(int value) {
+        EventStatusEnum[] values = EventStatusEnum.values();
+        for (EventStatusEnum eventStatusEnum : values) {
+            if (eventStatusEnum.getValue() == value) {
+                return eventStatusEnum;
+            }
+        }
+        return null;
+    }
+
+}

+ 1 - 0
resource/src/main/res/values-es/strings.xml

@@ -170,6 +170,7 @@
     <string name="event_voice_call">Llamar</string>
     <string name="event_undo">Deshacer</string>
     <string name="event_responded">Contestado</string>
+    <string name="event_cancel">Canceled</string>
     <string name="device_change_check">Confirmar cambio?</string>
     <string name="device_change_tips">Modificando, espere</string>
     <string name="invalid_phone_number">Teléfono no válido: %s</string>

+ 1 - 0
resource/src/main/res/values-ru/strings.xml

@@ -162,6 +162,7 @@
     <string name="event_voice_call">Позвонить</string>
     <string name="event_undo">Отменить</string>
     <string name="event_responded">Отвечено</string>
+    <string name="event_cancel">Canceled</string>
     <string name="device_change_check">Подтвердить изменение?</string>
     <string name="device_change_tips">Изменение, подождите</string>
     <string name="invalid_phone_number">Неверный номер телефона: %s</string>

+ 1 - 0
resource/src/main/res/values-zh/strings.xml

@@ -170,6 +170,7 @@
     <string name="event_voice_call">通话</string>
     <string name="event_undo">未处理</string>
     <string name="event_responded">已响应</string>
+    <string name="event_cancel">已取消</string>
     <string name="device_change_check">是否确认切换?</string>
     <string name="device_change_tips">切换中,请稍后</string>
     <string name="invalid_phone_number">非法号码: %s</string>

+ 1 - 0
resource/src/main/res/values/strings.xml

@@ -170,6 +170,7 @@
     <string name="event_voice_call">Call</string>
     <string name="event_undo">Undo</string>
     <string name="event_responded">Responded</string>
+    <string name="event_cancel">Canceled</string>
     <string name="device_change_check">Change confirm?</string>
     <string name="device_change_tips">Changing, wait</string>
     <string name="invalid_phone_number">Invalid phone: %s</string>