init
diff --git a/app/src/main/java/com/supwisdom/activities/consume/BeepManager.kt b/app/src/main/java/com/supwisdom/activities/consume/BeepManager.kt
new file mode 100644
index 0000000..4973200
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/BeepManager.kt
@@ -0,0 +1,109 @@
+package com.supwisdom.activities.consume
+
+import android.app.Activity
+import android.content.Context
+import android.media.AudioManager
+import android.media.MediaPlayer
+import android.os.Vibrator
+import com.newcapec.zxinglib.PreferencesSetting
+import com.supwisdom.R
+import java.io.Closeable
+import java.io.IOException
+
+
+/**
+ * @author zzq
+ * @date 2018/4/25.
+ * @version 1.0.1
+ * @desc  滴滴声
+ */
+@Suppress("DEPRECATION")
+class BeepManager constructor(context: Context) : MediaPlayer.OnErrorListener, Closeable {
+    private val context = context
+
+    private val BEEP_VOLUME = 0.10f
+    private val VIBRATE_DURATION = 200L
+
+    private var mediaPlayer: MediaPlayer? = null
+    private var playBeep: Boolean = false
+    private var vibrate: Boolean = false
+
+    init {
+        updatePrefs()
+    }
+
+    @Synchronized
+    fun updatePrefs() {
+        //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+        playBeep = shouldBeep(context)
+        vibrate = PreferencesSetting.PREFER_VIBRATE
+        if (playBeep && mediaPlayer == null) {
+            // The volume on STREAM_SYSTEM is not adjustable, and users found it too loud,
+            // so we now play on the music stream.
+            (context as Activity).volumeControlStream = AudioManager.STREAM_MUSIC
+            mediaPlayer = buildMediaPlayer(context)
+        }
+    }
+
+    @Synchronized
+    fun playBeepSoundAndVibrate() {
+        if (playBeep && mediaPlayer != null) {
+            mediaPlayer!!.start()
+        }
+        if (vibrate) {
+            val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
+            vibrator.vibrate(VIBRATE_DURATION)
+        }
+    }
+
+    private fun shouldBeep(activity: Context): Boolean {
+        var shouldPlayBeep = PreferencesSetting.PREFER_PLAY_BEEP
+        if (shouldPlayBeep) {
+            // See if sound settings overrides this
+            val audioService = activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+            if (audioService.ringerMode != AudioManager.RINGER_MODE_NORMAL) {
+                shouldPlayBeep = false
+            }
+        }
+        return shouldPlayBeep
+    }
+
+    private fun buildMediaPlayer(activity: Context): MediaPlayer? {
+        val mediaPlayer = MediaPlayer()
+        return try {
+            activity.resources.openRawResourceFd(R.raw.beep).use { it ->
+                mediaPlayer.setDataSource(it.fileDescriptor, it.startOffset, it.length)
+            }
+            mediaPlayer.setOnErrorListener(this)
+            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
+            mediaPlayer.isLooping = false
+            mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME)
+            mediaPlayer.prepare()
+            mediaPlayer
+        } catch (ex: IOException) {
+            mediaPlayer.release()
+            null
+        }
+    }
+
+    @Synchronized
+    override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean {
+        if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
+            // we are finished, so put up an appropriate error toast if required and finish
+            (context as Activity).finish()
+        } else {
+            // possibly media player error, so release and recreate
+            close()
+            updatePrefs()
+        }
+        return true
+    }
+
+    @Synchronized
+    override fun close() {
+        if (mediaPlayer != null) {
+            mediaPlayer!!.release()
+            mediaPlayer = null
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
index 5bc4f48..8f196bc 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -27,6 +27,7 @@
 import com.supwisdom.utils.SoundUtil
 import com.supwisdom.view.DialogPurchase
 import java.util.*
+import java.util.concurrent.locks.ReentrantLock
 
 /**
  ** create by zzq on 2019/7/24
@@ -53,6 +54,12 @@
     private lateinit var vLastPayFailreason: TextView
     private lateinit var vLastPayFailll: LinearLayout
     private lateinit var vLastPayamtll: LinearLayout
+    private var beepManager: BeepManager? = null
+    private val scanLock = ReentrantLock()
+    @Volatile
+    private var codeSwitchEnable = false
+    @Volatile
+    private var payStatusEnable = false
     @Volatile
     private var isBackRuning = false
     private var addAmount: Int = 0
@@ -74,9 +81,39 @@
     private fun initData() {
         presenter = ConsumePresenter(this)
         presenter.start()
+        beepManager = BeepManager(this)
         dialogPurchase = DialogPurchase(this, object : DialogPurchase.ICallBack {
             override fun callback(isManualCancel: Boolean) {
                 presenter.clickNoPay()
+                amountTxt.text = ""
+            }
+
+            override fun callback(code: String) {
+                //扫码和寻卡消费互斥
+                if (!codeSwitchEnable) {
+                    return
+                }
+                if (!scanLock.tryLock()) {
+                    return
+                }
+                try {
+                    //正在扣款
+                    if (dialogPurchase!!.codePaying) {
+                        return
+                    }
+                    //已扣款
+                    if (!payStatusEnable) {
+                        return
+                    }
+                    beepManager!!.playBeepSoundAndVibrate()
+                    presenter.clickNoPay()
+                    dialogPurchase!!.codePaying = true
+                    dialogPurchase!!.codePayingNoCancelEnable = true
+                    payStatusEnable = false
+                    presenter.codeToPay(code, amount)
+                } finally {
+                    scanLock.unlock()
+                }
             }
         })
     }
@@ -122,12 +159,19 @@
         if (amount > 0) {
             amountTxt.text = String.format("%.02f", amount / 100.0f)
             presenter.clickToPay(amount)
-            dialogPurchase!!.showProcess("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+            showDialogPay()
         } else {
             AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
         }
     }
 
+    private fun showDialogPay() {
+        dialogPurchase!!.codePaying = false
+        dialogPurchase!!.isFixPay = false
+        dialogPurchase!!.codePayingNoCancelEnable = false
+        dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+    }
+
     private fun getCurAmount(): Int {
         return try {
             CommonUtil.YuanToFen(java.lang.Double.parseDouble(amountTxt.text.toString().trim { it <= ' ' }))
@@ -191,12 +235,19 @@
                 vTime.text = tmptime
                 AuxScreenController.getInstance().refreshBottom(tmptime)
             }
+            if (dialogPurchase!!.isShowing &&
+                !dialogPurchase!!.isFixPay &&
+                payStatusEnable
+            ) {
+                beepManager!!.playBeepSoundAndVibrate()
+            }
         }
     }
 
     override fun onResume() {
         super.onResume()
         isBackRuning = false
+        beepManager!!.updatePrefs()
         dealIntent()
         refresh()
         refreshRecentDtl(lastPayInfo)
@@ -239,7 +290,7 @@
                 amount = Integer.parseInt(record.paraval)
                 amountTxt.text = String.format("%.02f", amount / 100.0f)
                 presenter.clickToPay(amount)
-                dialogPurchase!!.showProcess("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+                showDialogPay()
             } catch (ex: Exception) {
                 ex.printStackTrace()
             }
@@ -372,6 +423,7 @@
     override fun onDestroy() {
         SoundUtil.releaseMusic()
         presenter.stop()
+        beepManager!!.close()
         super.onDestroy()
     }
 
@@ -475,6 +527,10 @@
         }
     }
 
+    override fun codeScannerEnable(enable: Boolean) {
+        codeSwitchEnable = enable
+    }
+
     private fun resetPayShowCounter(timems: Long) {
         counter?.cancel()
         counter = LastPayShowTimer(timems, 500)
diff --git a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
index d6c53bb..b633d51 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -30,4 +30,6 @@
     fun refreshLinkStatus(isOnline: Boolean)
 
     fun showRecentDtl(record: TransdtlUnionRecord?)
+
+    fun codeScannerEnable(enable: Boolean)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt
index 074e62c..2b50e3f 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt
@@ -9,7 +9,7 @@
 class CardPayInitRetBean : BaseResp() {
     var billno: String? = null
     var username: String? = null
-    var userid: Int = 0
+    var userid: String? = null
     var anonymous: Boolean = false
     var sourcetype: String? = null
     var needpwdconfirm: Boolean = false
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index 96e3032..f88e2b9 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
@@ -86,9 +86,11 @@
                     doClear()
                     continue
                 }
+                iConsumeView.codeScannerEnable(true)
                 CommonUtil.doSleep(100)
                 try {
                     val cardphyid = Cardlib.instance.requestCard()
+                    iConsumeView.codeScannerEnable(false)
                     if (oldcardphyid != cardphyid) {
                         readCard()
                         cardBean.cardphyid = cardphyid
@@ -201,7 +203,7 @@
             }
             resp = consumeApi.payConfirm(onlRecord)
             result = parseConfirmResult(resp)
-            if (!result) {
+            if (result) {
                 showSucInfo()
             }
             updateTransdtlOnline(result)
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
index 46c0d15..f69e698 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
@@ -48,7 +48,7 @@
             if (!result) {
                 result = payResultQuery()
             }
-            if (!result) {
+            if (result) {
                 showSucInfo()
             }
             updateTransdtlOnline(result)
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
index 4723966..cbfac25 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -8,6 +8,7 @@
 import com.supwisdom.bean.BaseResp
 import com.supwisdom.entity.PayStatus
 import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.exception.AuthEpayError
 import com.supwisdom.exception.HeartBeatError
 import com.supwisdom.exception.TransdtlUploadError
 import com.supwisdom.service.AuthEpay
@@ -35,7 +36,11 @@
 
     private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
         override fun doInBackground(vararg voids: Void): AuthRetBean {
-            val retBean = AuthEpay().login()
+            val retBean = try {
+                AuthEpay().login()
+            } catch (ex: AuthEpayError) {
+                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
+            }
             if (retBean.retcode == PublicDef.SUCCESS) {
                 val record = pos.getDynamicPara()
                 record!!.deviceid = retBean.deviceid
@@ -52,10 +57,10 @@
         }
 
         override fun onPostExecute(retBean: AuthRetBean?) {
-            if (retBean == null) {
-                iMenuView.showOperResult("签到结果", "请求超时")
-            } else {
-                iMenuView.showOperResult("签到结果", retBean.retmsg!!)
+            when {
+                retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
+                retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult("签到失败", retBean.retmsg ?: "null")
+                else -> iMenuView.showOperResult("签到成功", " ")
             }
         }
     }
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index c93d962..6ce7a41 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -20,15 +20,8 @@
     private val FORMAT_MMddHHmmyy = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
     private val FORMAT_yyyy_MM_dd_HH_mm_ss =
         org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
-    private val FORMAT_yyyy_MM_dd_HH_mm_ss_SSS =
-        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS")
-    private val FORMAT_HH_mm_ss_SSS = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmssSSS")
-    private val FORMAT_yyyy_MM_dd_HH_mm = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm")
     private val FORMAT_yyyy_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
     private val FORMAT_HH_mm_ss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
-    private val FORMAT_HH_mm = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm")
-    private val FORMAT_UTC_yyyyMMddHHmmss =
-        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
 
     /**
      * @return yyyy-MM-dd HH:mm:ss
@@ -41,96 +34,6 @@
         return FORMAT_yyyy_MM_dd.format(Date())
     }
 
-    /**
-     * @return yyyy-MM-dd HH:mm:ss.SSS
-     */
-    fun getNow5(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss_SSS.format(Date())
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm
-     */
-    fun getNow4(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm.format(Date())
-    }
-
-    /**
-     * @return yyMMddHHmmss
-     */
-    fun getNow2(): String {
-        return FORMAT_yyMMddHHmmss.format(Date())
-    }
-
-    /**
-     * @param dateTime yyyyMMddHHmmss
-     * @return yyyyMMdd.HHmmss
-     */
-    fun getNow4(dateTime: String): String? {
-        try {
-            val str1 = dateTime.substring(0, 8)
-            val str2 = dateTime.substring(8)
-            return "$str1.$str2"
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return yy-MM-dd HH:mm:ss
-     */
-    fun getNow3(): String {
-        return FORMAT_yyMMddHHmmss2.format(Date())
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getDateTimeFormat(date: Date): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(date)
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getDateTimeFormat(timeInMillis: Long?): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(timeInMillis)
-    }
-
-    /**
-     * @param datetime yyyyMMddHHmmss
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getNowDatetimeFromNoFormat(datetime: String): String {
-        try {
-            return datetime.substring(0, 4) + "-" +
-                    datetime.substring(4, 6) + "-" +
-                    datetime.substring(6, 8) + " " +
-                    datetime.substring(8, 10) + ":" +
-                    datetime.substring(10, 12) + ":" +
-                    datetime.substring(12)
-        } catch (ex: Exception) {
-        }
-        return ""
-    }
-
-    /**
-     * @param datetime yyyyMMddHHmm
-     * @return yyyy-MM-dd HH:mm
-     */
-    fun getNowDatetimeFromNoFormat3(datetime: String): String {
-        try {
-            return datetime.substring(0, 4) + "-" +
-                    datetime.substring(4, 6) + "-" +
-                    datetime.substring(6, 8) + " " +
-                    datetime.substring(8, 10) + ":" +
-                    datetime.substring(10)
-        } catch (ex: Exception) {
-        }
-        return ""
-    }
-
     fun utcToLocal(utctime: String): String {
         val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
         sdf.timeZone = TimeZone.getTimeZone("UTC")
@@ -146,24 +49,6 @@
         }
     }
 
-
-    /**
-     * @param datetime yyyyMMddHHmmss
-     * @return yy-MM-dd HH:mm:ss
-     */
-    fun getNowDatetimeFromNoFormat2(datetime: String): String? {
-        return try {
-            datetime.substring(2, 4) + "-" +
-                    datetime.substring(4, 6) + "-" +
-                    datetime.substring(6, 8) + " " +
-                    datetime.substring(8, 10) + ":" +
-                    datetime.substring(10, 12) + ":" +
-                    datetime.substring(12)
-        } catch (ex: Exception) {
-            null
-        }
-    }
-
     /**
      * @param date yyyyMMdd
      * @return yyyy-MM-dd
@@ -179,17 +64,6 @@
     }
 
     /**
-     * @param date yyyy-MM-dd HH:mm:ss
-     * @return yyyyMMddHHmmss
-     */
-    fun getNowDateFromNoFormat2(date: String): String {
-        return date.replace("-", "")
-            .replace(" ", "")
-            .replace(":", "")
-    }
-
-
-    /**
      * @return HH:mm:ss
      */
     fun getNowTimeWithArg(date: Date): String? {
@@ -267,13 +141,6 @@
     }
 
     /**
-     * @return HHmmssSSS
-     */
-    fun getNowTime1(): String {
-        return FORMAT_HH_mm_ss_SSS.format(Date())
-    }
-
-    /**
      * @return HH:mm:ss
      */
     fun getNowTime(): String {
@@ -446,53 +313,10 @@
     }
 
     /**
-     * 获得指定日期的后一天
-     *
-     * @param specifiedDay yyyy-MM-dd
-     * @return yyyy-MM-dd
-     */
-    fun getSpecifiedDayAfter1(specifiedDay: String): String {
-        return try {
-            val c = Calendar.getInstance()
-            val date = FORMAT_yyyy_MM_dd.parse(specifiedDay)
-            c.time = date
-            val day = c.get(Calendar.DATE)
-            c.set(Calendar.DATE, day + 1)
-            FORMAT_yyyy_MM_dd.format(c.time)
-        } catch (e: ParseException) {
-            ""
-        }
-    }
-
-    /**
-     * 分钟转化为未来时间yyyyMMddHHmm
-     *
-     * @param minute 分钟数
-     * @return yyyyMMddHHmm
-     */
-    fun format2FutureTime(minute: Int): String {
-        val calendar = Calendar.getInstance()
-        calendar.add(Calendar.MINUTE, minute)
-        return FORMAT_yyyyMMddHHmm.format(calendar.time)
-    }
-
-    /**
-     * @return yyyyMMddHHmm
+     * @return yyyyMMddHHmmss
      */
     fun getNowDateTimeFormat(): String {
-        return FORMAT_yyyyMMddHHmm.format(Date())
+        return FORMAT_yyyyMMddHHmmss.format(Date())
     }
 
-    /**
-     * @param datetime yyyyMMddHHmm
-     * @return 毫秒数
-     */
-    fun formatDateTime(datetime: String): Long {
-        try {
-            return FORMAT_yyyyMMddHHmm.parse(datetime).time
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-        }
-        return 0
-    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index 8ae1fc0..39b5806 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -6,23 +6,31 @@
 import android.view.KeyEvent
 import android.view.View
 import android.widget.TextView
+import com.google.zxing.Result
+import com.newcapec.zxinglib.IDecoderAcquirer
+import com.newcapec.zxinglib.PosDecoder
 import com.supwisdom.R
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
 import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.LogUtil
 
 /**
  ** create by zzq on 2019/7/26
  ** @desc 消费弹窗
  **/
-class DialogPurchase constructor(context: Context, callBack: ICallBack) : DialogBase(context) {
+class DialogPurchase constructor(context: Context, callBack: ICallBack) : DialogBase(context), IDecoderAcquirer {
+    private val TAG = "DialogPurchase"
     private val callBack = callBack
     private var vCount: TextView
     private var vPayhint: TextView
     private var vPayamt: TextView
     private var vBalance: TextView
+    private var posDec: PosDecoder? = null
+    private var lastFixpayDecoderOpenTime: Long = 0
     private val waitTime = 60
-    var qrcodePayingNoCancelEnable = false
-    var barcodePaying = false
+    var codePayingNoCancelEnable = false
+    var codePaying = false
+    var isFixPay = false
 
     init {
         setContentView(R.layout.dialog_purchase)
@@ -31,11 +39,28 @@
         vPayhint = this.findViewById(R.id.tv_pay_hint) as TextView
         vPayamt = this.findViewById(R.id.tv_pay_amount) as TextView
         vBalance = this.findViewById(R.id.tv_pay_balance) as TextView
+
+        posDec = PosDecoder(this)
+    }
+
+    override fun onFailed() {
+
+    }
+
+    override fun onDecoded(result: String?) {
+
+    }
+
+    override fun onDecoded(result: Result?) {
+        val rawSize = result?.rawBytes?.size ?: 0
+        if (rawSize > 0) {
+            callBack.callback(result!!.text)
+        }
     }
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
-            if (qrcodePayingNoCancelEnable) {
+            if (codePayingNoCancelEnable) {
                 return super.dispatchKeyEvent(event)
             }
             when (event.keyCode) {
@@ -47,7 +72,7 @@
         return super.dispatchKeyEvent(event)
     }
 
-    fun showProcess(hint: String, amount: String) {
+    fun show(hint: String, amount: String) {
         vPayhint.text = hint
         vPayhint.setTextColor(Color.BLACK)
         vPayamt.text = amount
@@ -55,6 +80,17 @@
 
         vBalance.visibility = View.GONE
         show()
+        asyncOpenDecoder()
+        resetCounter(waitTime)
+    }
+
+    fun showProcess(hint: String, amount: String) {
+        vPayhint.text = hint
+        vPayhint.setTextColor(Color.RED)
+        vPayamt.text = amount
+        vPayamt.visibility = View.VISIBLE
+
+        vBalance.visibility = View.GONE
         resetCounter(waitTime)
     }
 
@@ -103,11 +139,53 @@
         resetCounter(info.showtime)
     }
 
+    private fun asyncOpenDecoder() {
+        if (!isFixPay) {
+            try {
+                posDec!!.onResume()
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+                LogUtil.d(TAG, "open camera exception:" + CommonUtil.getExceptionStack(ex))
+            }
+        } else {
+            val time = System.currentTimeMillis()
+            if (time < lastFixpayDecoderOpenTime ||
+                time - lastFixpayDecoderOpenTime > 120000
+            ) {
+                lastFixpayDecoderOpenTime = time
+                try {
+                    posDec!!.onPause()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    LogUtil.d(TAG, "fix close camera exception:" + CommonUtil.getExceptionStack(ex))
+                }
+                try {
+                    posDec!!.onResume()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    LogUtil.d(TAG, "fix open camera exception:" + CommonUtil.getExceptionStack(ex))
+                }
+            }
+        }
+    }
+
+    private fun asyncCloseDecoder() {
+        if (!isFixPay) {
+            try {
+                posDec!!.onPause()
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+                LogUtil.d(TAG, "close camera exception:" + CommonUtil.getExceptionStack(ex))
+            }
+        }
+    }
+
     private fun finish(isManualCancel: Boolean) {
-        barcodePaying = false
-        qrcodePayingNoCancelEnable = false
+        codePaying = false
+        codePayingNoCancelEnable = false
         dismiss()
         callBack.callback(isManualCancel)
+        asyncCloseDecoder()
     }
 
     private var counter: ConsumeHintCount? = null
@@ -139,5 +217,7 @@
 
     interface ICallBack {
         fun callback(isManualCancel: Boolean)
+
+        fun callback(code: String)
     }
 }
\ No newline at end of file