Merge branch 'hotfix/1.0.6'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ed48cb0..bf5d0b9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -33,10 +33,6 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
 
-    <!--写时钟权限-->
-    <uses-permission
-            android:name="android.permission.WRITE_SETTINGS"
-            serviceandroid:ignore="ProtectedPermissions"/>
     <uses-permission
             android:name="android.permission.WRITE_SECURE_SETTINGS"
             serviceandroid:ignore="ProtectedPermissions"/>
diff --git a/app/src/main/java/com/newcapec/jni/Icc.java b/app/src/main/java/com/newcapec/jni/Icc.java
index 3a4f197..0a3cb03 100644
--- a/app/src/main/java/com/newcapec/jni/Icc.java
+++ b/app/src/main/java/com/newcapec/jni/Icc.java
@@ -13,12 +13,12 @@
     /**
      * @param version
      */
-    public Icc(int version) {
-        if (version < 110) {
+    public Icc(String version) {
+        if (version.compareTo("110") < 0) {
             System.loadLibrary("iccV108");
-        } else if (version < 115) {
+        } else if (version.compareTo("115") < 0) {
             System.loadLibrary("iccV110");
-        } else if (version < 116) {
+        } else if (version.compareTo("116") < 0) {
             System.loadLibrary("iccV115");
         } else {
             System.loadLibrary("iccV116");
diff --git a/app/src/main/java/com/newcapec/jni/Picc.java b/app/src/main/java/com/newcapec/jni/Picc.java
index fadb179..18ecad4 100644
--- a/app/src/main/java/com/newcapec/jni/Picc.java
+++ b/app/src/main/java/com/newcapec/jni/Picc.java
@@ -105,10 +105,10 @@
     /**
      * @param version
      */
-    public Picc(int version) {
-        if (version < 110) {
+    public Picc(String version) {
+        if (version.compareTo("110") < 0) {
             System.loadLibrary("piccV108");
-        } else if (version < 116) {
+        } else if (version.compareTo("116") < 0) {
             System.loadLibrary("piccV115");
         } else {
             System.loadLibrary("piccV116");
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 7febabd..363ff7f 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -20,6 +20,7 @@
 import com.supwisdom.activities.transdtl.TransdtlActivity
 import com.supwisdom.auxscreen.AuxScreenController
 import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.PeriodFixPayRecord
 import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlUnionRecord
 import com.supwisdom.utils.CommonUtil
@@ -55,14 +56,15 @@
     private lateinit var vLastPayFailreason: TextView
     private lateinit var vLastPayFailll: LinearLayout
     private lateinit var vLastPayamtll: LinearLayout
+    private val pos = SPApplication.getInstance().getPos()
     private var beepManager: BeepManager? = null
     private val scanLock = ReentrantLock()
     @Volatile
-    private var codeSwitchEnable = false
+    private var cardPaying = false
     @Volatile
     private var payStatusEnable = false
     @Volatile
-    private var isBackRuning = false
+    private var isBackRunning = false
     private var addAmount: Int = 0
     @Volatile
     private var amount: Int = 0
@@ -73,6 +75,8 @@
     private var counter: LastPayShowTimer? = null
     private var lastPayInfo: CardUserInfoBean? = null
     private var dialogPurchase: DialogPurchase? = null
+    private var periodFixPayList: List<PeriodFixPayRecord>? = null
+    private var periodFixPayEnable = false
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -106,16 +110,12 @@
             }
 
             override fun callback(code: String) {
-                //扫码和寻卡消费互斥
-                if (!codeSwitchEnable) {
-                    return
-                }
                 if (!scanLock.tryLock()) {
                     return
                 }
                 try {
                     //正在扣款
-                    if (dialogPurchase!!.codePaying) {
+                    if (someWayPaying()) {
                         return
                     }
                     //已扣款
@@ -136,6 +136,13 @@
         presenter.loadLastTransdtl()
     }
 
+    private fun someWayPaying(): Boolean {
+        if (cardPaying || dialogPurchase!!.codePaying || isBackRunning) {
+            return true
+        }
+        return false
+    }
+
     private fun initView() {
         vShopname = this.findViewById<TextView>(R.id.tv_shopname)
         vLinkLogo = this.findViewById<ImageView>(R.id.tv_linklogo)
@@ -157,7 +164,7 @@
 
     override fun onStop() {
         super.onStop()
-        isBackRuning = true
+        isBackRunning = true
     }
 
     override fun onDestroy() {
@@ -170,6 +177,7 @@
     @SuppressLint("SetTextI18n")
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
+            presenter.resetOperationTime()
             when (payMode) {
                 PayMode.FIXPAY -> fixInputPay(event.keyCode)
                 PayMode.HOTKEY -> hotkeyInputPay(event.keyCode)
@@ -183,7 +191,7 @@
         when (keyCode) {
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
-                isBackRuning = true
+                isBackRunning = true
                 jumpActivity(MenuActivity::class.java)
             }
             KeyEvent.KEYCODE_DPAD_RIGHT -> {
@@ -218,7 +226,7 @@
             }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
-                isBackRuning = true
+                isBackRunning = true
                 jumpActivity(MenuActivity::class.java)
             }
             KeyEvent.KEYCODE_DPAD_RIGHT -> {
@@ -263,7 +271,7 @@
             }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
-                isBackRuning = true
+                isBackRunning = true
                 jumpActivity(MenuActivity::class.java)
             }
 //                KeyEvent.KEYCODE_DPAD_UP ->
@@ -302,30 +310,39 @@
         }
     }
 
+    override fun screenSaver(flag: Boolean) {
+        if (flag) {
+            CommonUtil.setAppBrightness(this, PublicDef.SCREEN_SAVER_BRIGHTNESS)
+        } else {
+            CommonUtil.setAppBrightness(this, PublicDef.SCREEN_NORMAL_BRIGHTNESS)
+        }
+    }
+
     private var lastshowtime: String? = null
     override fun clearUserInfo(datetime: String) {
-        if (!isBackRuning) {
-            vCitizenName.text = null
-            vCitizenCardno.text = null
-            vCardstatus.text = null
-            val tmptime = datetime.substring(0, 16)
-            if (lastshowtime != tmptime) {
-                lastshowtime = tmptime
-                vTime.text = tmptime
-                AuxScreenController.getInstance().refreshBottom(tmptime)
+        vCitizenName.text = null
+        vCitizenCardno.text = null
+        vCardstatus.text = null
+        val tmptime = datetime.substring(0, 16)
+        if (lastshowtime != tmptime) {
+            lastshowtime = tmptime
+            vTime.text = tmptime
+            AuxScreenController.getInstance().refreshBottom(tmptime)
+            if (periodFixPayEnable) {
+                parsePeriodFixPay()
             }
-            if (dialogPurchase!!.isShowing &&
-                !dialogPurchase!!.isFixPay &&
-                payStatusEnable
-            ) {
-                beepManager!!.playBeepSoundAndVibrate()
-            }
+        }
+        if (dialogPurchase!!.isShowing &&
+            !dialogPurchase!!.isFixPay &&
+            payStatusEnable
+        ) {
+            beepManager!!.playBeepSoundAndVibrate()
         }
     }
 
     override fun onResume() {
         super.onResume()
-        isBackRuning = false
+        isBackRunning = false
         beepManager!!.updatePrefs()
         dealIntent()
         refresh()
@@ -354,7 +371,7 @@
     private fun refresh() {
         addAmount = 0
         amountTxt.text = "0"
-        var shopname = SPApplication.getInstance().getPos().getDynamicPara()!!.shopname
+        var shopname = pos.getDynamicPara()!!.shopname
         if (shopname == null || shopname.length < 9) {
             vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_normal)
         } else {
@@ -370,28 +387,31 @@
         AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime().substring(0, 16))
         AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
 
-        SPApplication.getInstance().getPos().getControlPara(PublicDef.CONTROL_FIXAMT)?.also { mode ->
+        periodFixPayEnable = false
+        pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also { mode ->
             when {
                 mode.paraval == PayMode.HOTKEY.desc -> {
                     presenter.setFixMode(false)
                     payMode = PayMode.HOTKEY
                     hotkeyPayMap.clear()
                     hotkeyPayList.clear()
-                    SPApplication.getInstance().getPos().getHotkeyPay()?.forEach {
+                    pos.getHotkeyPay()?.forEach {
                         hotkeyPayMap[it.key] = it.amount
                         hotkeyPayList.add(String.format("按键%d - %.02f元", it.key, it.amount / 100.0f))
                     }
                     AuxScreenController.getInstance().refreshContent(hotkeyPayList)
                 }
+                mode.paraval == PayMode.PERIODFIX.desc -> {
+                    periodFixPayEnable = true
+                    periodFixPayList = pos.getPeriodFixPay()
+                    parsePeriodFixPay()
+                }
                 mode.paraval == PayMode.NORMAL.desc -> {
-                    presenter.setFixMode(false)
-                    payMode = PayMode.NORMAL
+                    doNormalPay()
                 }
                 else -> {
-                    presenter.setFixMode(true)
-                    payMode = PayMode.FIXPAY
                     try {
-                        checkAmtToPay(Integer.parseInt(mode.paraval))
+                        doFixPay(Integer.parseInt(mode.paraval))
                     } catch (ex: Exception) {
                         ex.printStackTrace()
                     }
@@ -400,6 +420,33 @@
         }
     }
 
+    private fun parsePeriodFixPay() {
+        val nowtime = DateUtil.getNowTimeNoFormat().substring(0, 4)
+        periodFixPayList?.forEach {
+            if (it.beginTime!! <= nowtime && nowtime < it.endTime!!) {
+                if (payMode != PayMode.FIXPAY || amount != it.amount) {
+                    doFixPay(it.amount)
+                }
+                return
+            }
+        }
+        if (payMode != PayMode.NORMAL) {
+            doNormalPay()
+        }
+    }
+
+    private fun doFixPay(fixamt: Int) {
+        presenter.setFixMode(true)
+        payMode = PayMode.FIXPAY
+        checkAmtToPay(fixamt)
+    }
+
+    private fun doNormalPay() {
+        amount = 0
+        presenter.setFixMode(false)
+        payMode = PayMode.NORMAL
+    }
+
     override fun refreshLinkStatus(isOnline: Boolean) {
         if (isOnline) {
             vLinkLogo.setImageDrawable(getDrawable(R.drawable.wireless_on))
@@ -643,8 +690,8 @@
         return this
     }
 
-    override fun isBackRuning(): Boolean {
-        return isBackRuning
+    override fun isBackRunning(): Boolean {
+        return isBackRunning
     }
 
     override fun showRecentDtl(record: TransdtlUnionRecord?) {
@@ -662,8 +709,8 @@
         }
     }
 
-    override fun codeScannerEnable(enable: Boolean) {
-        codeSwitchEnable = enable
+    override fun cardPayingStatus(isPaying: Boolean) {
+        cardPaying = isPaying
     }
 
     private fun resetPayShowCounter(timems: Long) {
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
index 43b5ed2..4be4346 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
@@ -16,10 +16,9 @@
  ** create by zzq on 2019/7/25
  ** @desc
  **/
-class ConsumePresenter constructor(iConsumeView: IConsumeView) {
+class ConsumePresenter constructor(private val iConsumeView: IConsumeView) {
     private val TAG = "ConsumePresenter"
     private val pos = SPApplication.getInstance().getPos()
-    private val iConsumeView = iConsumeView
     private val codePayRunnable = CodePayRunnable()
     private lateinit var handler: Handler
     private var cardPayService: CardPayService
@@ -45,23 +44,24 @@
                     PublicDef.MSG_CARD_PAY_QUERY -> iConsumeView.showConsumeQuery(msg.obj as String)
                     PublicDef.MSG_CARD_PAY_FAIL -> {
                         val ret = msg.obj as CardUserInfoBean
-                        LogUtil.d(TAG, "pay fail,reason=${ret.retmsg}")
+                        LogUtil.d(TAG, "pay fail,reason=$ret")
                         iConsumeView.showConsumeFail(ret)
                     }
                     PublicDef.MSG_PAYING_INTERRUPT -> {
                         val ret = msg.obj as CardUserInfoBean
-                        LogUtil.d(TAG, "pay interrupt,reason=${ret.retmsg}")
+                        LogUtil.d(TAG, "pay interrupt,reason=$ret")
                         iConsumeView.showConsumeInterrupt(ret)
                     }
                     PublicDef.MSG_CARD_REVERSE_FAIL -> {
                         val ret = msg.obj as CardUserInfoBean
-                        LogUtil.d(TAG, "reverse fail,reason=${ret.retmsg}")
+                        LogUtil.d(TAG, "reverse fail,reason=$ret")
                         iConsumeView.showReverseFail(msg.obj as CardUserInfoBean)
                     }
                     PublicDef.MSG_CARD_REVERSE_SUC -> iConsumeView.showReverseSuc(msg.obj as CardUserInfoBean)
                     PublicDef.MSG_USER_INFO_SHOW -> iConsumeView.showUserInfo(msg.obj as CardUserInfoBean)
                     PublicDef.MSG_USER_INFO_CLEAR -> iConsumeView.clearUserInfo(msg.obj as String)
                     PublicDef.MSG_LINK_STATUS -> iConsumeView.refreshLinkStatus(msg.obj as Boolean)
+                    PublicDef.MSG_SCREEN_SAVER -> iConsumeView.screenSaver((msg.obj as String) == "on")
                 }
             }
         }
@@ -91,6 +91,10 @@
         cardPayService.clickToInterrupt()
     }
 
+    fun resetOperationTime() {
+        cardPayService.resetOperationTime()
+    }
+
     fun setFixMode(isFixMode: Boolean) {
         cardPayService.isFixMode = isFixMode
         codePayService.isFixMode = isFixMode
@@ -133,5 +137,6 @@
 enum class PayMode(val desc: String) {
     NORMAL("none"),
     FIXPAY("fixpay"),
-    HOTKEY("hotkey")
+    HOTKEY("hotkey"),
+    PERIODFIX("periodfix")
 }
\ No newline at end of file
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 608ff3f..3561af7 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -11,7 +11,7 @@
 interface IConsumeView {
     fun getActivity(): Activity
 
-    fun isBackRuning(): Boolean
+    fun isBackRunning(): Boolean
 
     fun showConsumeSuc(info: CardUserInfoBean)
 
@@ -34,6 +34,10 @@
     fun refreshLinkStatus(isOnline: Boolean)
 
     fun showRecentDtl(record: TransdtlUnionRecord?)
+    /**
+     * 是否正在刷卡支付
+     */
+    fun cardPayingStatus(isPaying: Boolean)
 
-    fun codeScannerEnable(enable: Boolean)
+    fun screenSaver(flag: Boolean)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
index 047d57b..286b664 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
@@ -21,6 +21,10 @@
     var transdate: String? = null
     var transtime: String? = null
     var payway: String? = null //card,code
+
+    override fun toString(): String {
+        return "name=$username,cardno=$cardno,amount=$amount,payway=$payway,retcode=$retcode,retmsg=$retmsg"
+    }
 }
 
 enum class CardStatus(val desc: String) {
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt
new file mode 100644
index 0000000..bcbf64e
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.activities.consume.bean
+
+/**
+ ** create by zzq on 2019/11/5
+ ** @desc 屏保参数
+ **/
+class ScreenSaverBean {
+    var operationTime = 0L //ms
+    var operationFlag = false //是否操作
+    var flag = false //是否屏保
+}
\ No newline at end of file
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 4b39eea..11f8580 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
@@ -39,7 +39,14 @@
     /**
      * 防止定额连续消费
      */
-    private var lastPayBean = LastPayBean()
+    private val lastPayBean = LastPayBean()
+    @Volatile
+    private var operation = false
+    private val screenSaverBean = ScreenSaverBean()
+
+    init {
+        screenSaverBean.operationTime = System.currentTimeMillis()
+    }
 
     fun start() {
         isExist = false
@@ -75,6 +82,10 @@
         payQueryConfirm = false
     }
 
+    fun resetOperationTime() {
+        operation = true
+    }
+
     private inner class CardPayRunnable : Runnable {
         private lateinit var onlRecord: TransdtlOnlineRecord
         private lateinit var onlRvsRecord: TransdtlOnlineRecord
@@ -88,20 +99,21 @@
         private var curLinkRefreshTime: Long = 0
         override fun run() {
             while (!isExist) {
-                if (iConsumeView.isBackRuning()) {
+                iConsumeView.cardPayingStatus(false)
+                checkShowScreen()
+                if (iConsumeView.isBackRunning()) {
                     CommonUtil.doSleep(1000)
-                    doClear()
                     continue
                 }
-                iConsumeView.codeScannerEnable(true)
                 CommonUtil.doSleep(100)
                 try {
                     val cardphyid = Cardlib.instance.requestCard()
-                    iConsumeView.codeScannerEnable(false)
+                    iConsumeView.cardPayingStatus(true)
                     if (oldcardphyid != cardphyid) {
                         readCard()
                         cardBean!!.cardphyid = cardphyid
                         oldcardphyid = cardphyid
+                        operation = true
                     }
                     when (clickStat) {
                         ClickStat.PAY -> {
@@ -188,6 +200,31 @@
             }
         }
 
+        private fun checkShowScreen() {
+            val tt = System.currentTimeMillis()
+            if (operation) {
+                operation = false
+                screenSaverBean.operationTime = tt
+                screenSaverBean.operationFlag = true
+            }
+            if (tt > screenSaverBean.operationTime &&
+                tt - screenSaverBean.operationTime > PublicDef.SCREEN_SAVER_GAP
+            ) {
+                /**
+                 * 连续半小时无操作屏保
+                 */
+                screenSaverBean.operationTime = tt
+                screenSaverBean.flag = true
+                screenSaverBean.operationFlag = false
+                sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
+            } else {
+                if (screenSaverBean.operationFlag && screenSaverBean.flag) {
+                    screenSaverBean.flag = false
+                    sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
+                }
+            }
+        }
+
         private fun showCardUserInfo() {
             val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
             if (cardBean!!.username != cardBean!!.cardNo) {
@@ -215,8 +252,9 @@
         private fun doConsume() {
             if (isFixMode) {
                 if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
-                    if (System.currentTimeMillis() - lastPayBean.suctime < 15000) {
-                        throw CardPayFailError("15s内不能连续消费")
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
                     }
                 }
             }
@@ -362,6 +400,10 @@
 
         private fun doOnlineConsumeQuery(): Boolean {
             var queryCnt = 1
+            LogUtil.e(
+                TAG,
+                "pay timeout and query result,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
+            )
             sleepWithCancel(1000)
             while (payQueryConfirm) {
                 sendMsg(PublicDef.MSG_CARD_PAY_QUERY, "消费确认中[$queryCnt]")
@@ -411,7 +453,6 @@
 
         private fun parseConfirmResult(resp: TransResp?): Boolean {
             if (resp == null || resp.retcode != HttpStatus.SC_OK) {
-                SPApplication.getInstance().setEpayLinking(false)
                 return false
             }
             val retBean = try {
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 2b76df8..989ef92 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
@@ -45,8 +45,9 @@
         try {
             if (isFixMode) {
                 if (lastPayBean.code == code) {
-                    if (System.currentTimeMillis() - lastPayBean.suctime < 15000) {
-                        throw CardPayFailError("15s内不能连续消费")
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
                     }
                 }
             }
diff --git a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
index 3daaf82..eaf5482 100644
--- a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
@@ -3,12 +3,10 @@
 import android.annotation.SuppressLint
 import android.os.Bundle
 import android.os.CountDownTimer
+import android.text.TextUtils
 import android.view.KeyEvent
 import android.view.View
-import android.widget.EditText
-import android.widget.LinearLayout
-import android.widget.RadioButton
-import android.widget.TextView
+import android.widget.*
 import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
 import com.supwisdom.activities.SPApplication
@@ -16,6 +14,7 @@
 import com.supwisdom.activities.menu.MenuActivity
 import com.supwisdom.auxscreen.AuxScreenController
 import com.supwisdom.entity.HotKeyPayRecord
+import com.supwisdom.entity.PeriodFixPayRecord
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.PublicDef
@@ -29,17 +28,20 @@
  **/
 class ConsumeModeActivity : BaseActivity() {
     private lateinit var vPayamt: TextView
-    private lateinit var vNormalMode: TextView
-    private lateinit var vFixMode: TextView
-    private lateinit var vHotkeyMode: TextView
-    private lateinit var llHotList: LinearLayout
+    private lateinit var vSpecialDesc: TextView
+    private lateinit var rbHotkeyMode: RadioButton
+    private lateinit var rbPeriodMode: RadioButton
+    private lateinit var rgSpecialMode: RadioGroup
+    private lateinit var llSpecialList: LinearLayout
     private lateinit var llFixMode: LinearLayout
-    private lateinit var llHotMode: LinearLayout
+    private lateinit var llSpecialMode: LinearLayout
     private val pos = SPApplication.getInstance().getPos()
     private var keyActive = true
     private var shoppwdPass = false
-    private var hotkey = false
+    private var specialMode = false
     private var tmpPwd = ""
+    private var configMode = ConfigMode.NORMAL_FIX
+
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -49,83 +51,183 @@
     }
 
     private fun initData() {
-        pos.getHotkeyPay()?.forEach {
-            val item = View.inflate(this, R.layout.item_hotkey_pay, null)
-            item.findViewById<TextView>(R.id.tv_hot_del).setOnClickListener {
-                llHotList.removeView(item)
-                for (loop in 0 until llHotList.childCount) {
-                    val item = llHotList.getChildAt(loop)
-                    val key = item.findViewById<TextView>(R.id.tv_hot_key)
-                    key.text = "${(loop + 1)}"
-                }
-            }
-            val key = item.findViewById<TextView>(R.id.tv_hot_key)
-            key.text = "${llHotList.childCount + 1}"
-            val amt = item.findViewById<TextView>(R.id.tv_hot_amount)
-            amt.text = String.format("%.02f", it.amount / 100.0f)
-            llHotList.addView(item)
-        }
+
     }
 
     private fun initView() {
         vPayamt = findViewById<TextView>(R.id.tv_consume_mode_payamt)
-        llHotList = findViewById<LinearLayout>(R.id.ll_hot_list)
+        llSpecialList = findViewById<LinearLayout>(R.id.ll_special_list)
         this.findViewById<TextView>(R.id.tv_hot_add).setOnClickListener {
-            if (llHotList.childCount >= 9) {
+            if (llSpecialList.childCount >= 9) {
                 return@setOnClickListener
             }
+            if (configMode == ConfigMode.PERIOD_FIX) {
+                addPeriodFixRule()
+            } else {
+                addHotkeyRule()
+            }
+        }
+        this.findViewById<TextView>(R.id.tv_hot_save).setOnClickListener {
+            if (llSpecialList.childCount == 0) {
+                SWToast.show(applicationContext, "请先添加规则", PublicDef.TOAST_SHOW_DOUBT)
+                return@setOnClickListener
+            }
+            if (configMode == ConfigMode.PERIOD_FIX) {
+                if (!savePeriodFixRule()) {
+                    return@setOnClickListener
+                }
+            } else {
+                if (!saveHotkeyRule()) {
+                    return@setOnClickListener
+                }
+            }
+            finish()
+        }
+        this.findViewById<TextView>(R.id.tv_return).setOnClickListener {
+            showCurrentMode(ConfigMode.NORMAL_FIX)
+            refreshToSetAmount()
+        }
+        rgSpecialMode = this.findViewById<RadioGroup>(R.id.rg_special_mode)
+        rgSpecialMode.setOnCheckedChangeListener { _, checkedId ->
+            when (checkedId) {
+                R.id.rb_hot_mode -> showCurrentMode(ConfigMode.HOT_KEY)
+                R.id.rb_period_fix_mode -> showCurrentMode(ConfigMode.PERIOD_FIX)
+            }
+        }
+        rbPeriodMode = this.findViewById<RadioButton>(R.id.rb_period_fix_mode)
+        rbHotkeyMode = this.findViewById<RadioButton>(R.id.rb_hot_mode)
+
+        llFixMode = this.findViewById<LinearLayout>(R.id.ll_fix_mode)
+        llSpecialMode = this.findViewById<LinearLayout>(R.id.ll_hot_mode)
+
+        vSpecialDesc = this.findViewById<TextView>(R.id.tv_special_desc)
+    }
+
+    private fun addHotkeyRule() {
+        val item = View.inflate(this, R.layout.item_hotkey_pay, null)
+        item.findViewById<TextView>(R.id.tv_hot_del).setOnClickListener {
+            llSpecialList.removeView(item)
+            for (loop in 0 until llSpecialList.childCount) {
+                val item = llSpecialList.getChildAt(loop)
+                val key = item.findViewById<TextView>(R.id.tv_hot_key)
+                key.text = "${(loop + 1)}"
+            }
+        }
+        val key = item.findViewById<TextView>(R.id.tv_hot_key)
+        key.text = "${llSpecialList.childCount + 1}"
+        llSpecialList.addView(item)
+    }
+
+    private fun addPeriodFixRule() {
+        val item = View.inflate(this, R.layout.item_period_fix_pay, null)
+        item.findViewById<TextView>(R.id.tv_del).setOnClickListener {
+            llSpecialList.removeView(item)
+            for (loop in 0 until llSpecialList.childCount) {
+                val item = llSpecialList.getChildAt(loop)
+                val key = item.findViewById<TextView>(R.id.tv_config)
+                key.text = "规则${(loop + 1)}:"
+            }
+        }
+        val key = item.findViewById<TextView>(R.id.tv_config)
+        key.text = "规则${llSpecialList.childCount + 1}:"
+        llSpecialList.addView(item)
+    }
+
+    private fun saveHotkeyRule(): Boolean {
+        val list = ArrayList<HotKeyPayRecord>()
+        for (loop in 0 until llSpecialList.childCount) {
+            val record = HotKeyPayRecord()
+            val item = llSpecialList.getChildAt(loop)
+            var temp = item.findViewById<TextView>(R.id.tv_hot_key)
+            record.key = Integer.parseInt(temp.text.toString())
+            temp = item.findViewById<EditText>(R.id.tv_hot_amount)
+            record.amount = CommonUtil.YuanToFen(java.lang.Double.parseDouble(CommonUtil.getEditView(temp)))
+            list.add(record)
+        }
+        pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.HOTKEY.desc)
+        if (!pos.saveHotkeyPay(list)) {
+            SWToast.show(applicationContext, "保持配置失败", PublicDef.TOAST_SHOW_CRY)
+            return false
+        }
+        return true
+    }
+
+    private fun savePeriodFixRule(): Boolean {
+        val list = ArrayList<PeriodFixPayRecord>()
+        for (loop in 0 until llSpecialList.childCount) {
+            val record = PeriodFixPayRecord()
+            val item = llSpecialList.getChildAt(loop)
+            record.beginTime = CommonUtil.getEditView(item.findViewById<EditText>(R.id.tv_period_start))
+            record.endTime = CommonUtil.getEditView(item.findViewById<EditText>(R.id.tv_period_end))
+            val temp = item.findViewById<EditText>(R.id.tv_amount)
+            record.amount = CommonUtil.YuanToFen(java.lang.Double.parseDouble(CommonUtil.getEditView(temp)))
+            if (TextUtils.isEmpty(record.beginTime) || TextUtils.isEmpty(record.endTime)) {
+                SWToast.show(applicationContext, "时间段不为空", PublicDef.TOAST_SHOW_CRY)
+                return false
+            }
+            if (record.beginTime!!.length != 4 || record.endTime!!.length != 4) {
+                SWToast.show(applicationContext, "时间段长度不对", PublicDef.TOAST_SHOW_CRY)
+                return false
+            }
+            if (!("0000" <= record.beginTime!! && record.beginTime!! < record.endTime!! && record.endTime!! <= "2400")) {
+                SWToast.show(applicationContext, "时间段不合法", PublicDef.TOAST_SHOW_CRY)
+                return false
+            }
+            list.add(record)
+        }
+        pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.PERIODFIX.desc)
+        if (!pos.savePeriodFixPay(list)) {
+            SWToast.show(applicationContext, "保持配置失败", PublicDef.TOAST_SHOW_CRY)
+            return false
+        }
+        return true
+    }
+
+    private fun loadHotkeyRule() {
+        llSpecialList.removeAllViews()
+        pos.getHotkeyPay()?.forEach {
             val item = View.inflate(this, R.layout.item_hotkey_pay, null)
             item.findViewById<TextView>(R.id.tv_hot_del).setOnClickListener {
-                llHotList.removeView(item)
-                for (loop in 0 until llHotList.childCount) {
-                    val item = llHotList.getChildAt(loop)
+                llSpecialList.removeView(item)
+                for (loop in 0 until llSpecialList.childCount) {
+                    val item = llSpecialList.getChildAt(loop)
                     val key = item.findViewById<TextView>(R.id.tv_hot_key)
                     key.text = "${(loop + 1)}"
                 }
             }
             val key = item.findViewById<TextView>(R.id.tv_hot_key)
-            key.text = "${llHotList.childCount + 1}"
-            llHotList.addView(item)
+            key.text = "${llSpecialList.childCount + 1}"
+            val amt = item.findViewById<TextView>(R.id.tv_hot_amount)
+            amt.text = String.format("%.02f", it.amount / 100.0f)
+            llSpecialList.addView(item)
         }
-        this.findViewById<TextView>(R.id.tv_hot_save).setOnClickListener {
-            if (llHotList.childCount == 0) {
-                SWToast.show(applicationContext, "请先添加热键", PublicDef.TOAST_SHOW_DOUBT)
-                return@setOnClickListener
-            }
-            val list = ArrayList<HotKeyPayRecord>()
-            for (loop in 0 until llHotList.childCount) {
-                val item = llHotList.getChildAt(loop)
-                val key = item.findViewById<TextView>(R.id.tv_hot_key)
-                val keyboard = key.text.toString()
-                val amt = item.findViewById<EditText>(R.id.tv_hot_amount)
-                val hotamt = CommonUtil.getEditView(amt)
-
-                val record = HotKeyPayRecord()
-                record.key = Integer.parseInt(keyboard)
-                record.amount = CommonUtil.YuanToFen(java.lang.Double.parseDouble(hotamt))
-                list.add(record)
-            }
-            pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.HOTKEY.desc)
-            if (!pos.saveHotkeyPay(list)) {
-                SWToast.show(applicationContext, "保持热键失败", PublicDef.TOAST_SHOW_CRY)
-                return@setOnClickListener
-            }
-            finish()
-        }
-        this.findViewById<TextView>(R.id.tv_return).setOnClickListener {
-            hotkey = false
-            llHotMode.visibility = View.GONE
-            llFixMode.visibility = View.VISIBLE
-            refreshToSetAmount()
-        }
-        vNormalMode = this.findViewById<RadioButton>(R.id.rb_normal_mode)
-        vFixMode = this.findViewById<RadioButton>(R.id.rb_fix_mode)
-        vHotkeyMode = this.findViewById<RadioButton>(R.id.rb_hot_mode)
-
-        llFixMode = this.findViewById<LinearLayout>(R.id.ll_fix_mode)
-        llHotMode = this.findViewById<LinearLayout>(R.id.ll_hot_mode)
     }
 
+    private fun loadPeriodFixRule() {
+        llSpecialList.removeAllViews()
+        pos.getPeriodFixPay()?.forEach {
+            val item = View.inflate(this, R.layout.item_period_fix_pay, null)
+            item.findViewById<TextView>(R.id.tv_del).setOnClickListener {
+                llSpecialList.removeView(item)
+                for (loop in 0 until llSpecialList.childCount) {
+                    val item = llSpecialList.getChildAt(loop)
+                    val key = item.findViewById<TextView>(R.id.tv_config)
+                    key.text = "规则${(loop + 1)}:"
+                }
+            }
+            val beginTime = item.findViewById<EditText>(R.id.tv_period_start)
+            beginTime.setText(it.beginTime)
+            val endTime = item.findViewById<EditText>(R.id.tv_period_end)
+            endTime.setText(it.endTime)
+            val amt = item.findViewById<EditText>(R.id.tv_amount)
+            amt.setText(String.format("%.02f", it.amount / 100.0f))
+            val key = item.findViewById<TextView>(R.id.tv_config)
+            key.text = "规则${llSpecialList.childCount + 1}:"
+            llSpecialList.addView(item)
+        }
+    }
+
+
     @SuppressLint("SetTextI18n")
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
@@ -145,13 +247,41 @@
     override fun onResume() {
         super.onResume()
         shoppwdPass = false
-        hotkey = false
         keyActive = true
-        llFixMode.visibility = View.VISIBLE
-        llHotMode.visibility = View.GONE
+        showCurrentMode(ConfigMode.NORMAL_FIX)
         refreshToCheckPasswd()
     }
 
+    private fun showCurrentMode(mode: ConfigMode) {
+        configMode = mode
+        when (mode) {
+            ConfigMode.HOT_KEY -> {
+                specialMode = true
+                rgSpecialMode.visibility = View.VISIBLE
+                rbHotkeyMode.isChecked = true
+                llFixMode.visibility = View.GONE
+                llSpecialMode.visibility = View.VISIBLE
+                vSpecialDesc.text = "设置快捷按键(单位:元)"
+                loadHotkeyRule()
+            }
+            ConfigMode.PERIOD_FIX -> {
+                specialMode = true
+                rbPeriodMode.isChecked = true
+                rgSpecialMode.visibility = View.VISIBLE
+                llFixMode.visibility = View.GONE
+                llSpecialMode.visibility = View.VISIBLE
+                vSpecialDesc.text = "设置波段定额(单位:元)"
+                loadPeriodFixRule()
+            }
+            else -> {
+                rgSpecialMode.visibility = View.GONE
+                llSpecialMode.visibility = View.GONE
+                llFixMode.visibility = View.VISIBLE
+                specialMode = false
+            }
+        }
+    }
+
     private fun checkShopPwd(keyCode: Int) {
         when (keyCode) {
             KeyEvent.KEYCODE_0,
@@ -203,7 +333,7 @@
     }
 
     private fun setFixAmount(keyCode: Int) {
-        if (hotkey) {
+        if (specialMode) {
             AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
             return
         }
@@ -227,9 +357,7 @@
             }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //F1
-                hotkey = true
-                llHotMode.visibility = View.VISIBLE
-                llFixMode.visibility = View.GONE
+                showCurrentMode(ConfigMode.HOT_KEY)
                 AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
             }
         }
@@ -244,11 +372,23 @@
     private fun refreshToSetAmount() {
         vPayamt.text = PayMode.NORMAL.desc
         pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also {
-            if (PayMode.FIXPAY.desc == it.paraval) {
-                vPayamt.text = String.format("%.02f", Integer.parseInt(it.paraval) / 100.0f)
+            when {
+                PayMode.FIXPAY.desc == it.paraval -> {
+                    vPayamt.text = String.format("%.02f", Integer.parseInt(it.paraval) / 100.0f)
+                    screenShowAmt()
+                }
+                PayMode.HOTKEY.desc == it.paraval -> {
+                    showCurrentMode(ConfigMode.HOT_KEY)
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+                    return
+                }
+                PayMode.PERIODFIX.desc == it.paraval -> {
+                    showCurrentMode(ConfigMode.PERIOD_FIX)
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+                    return
+                }
             }
-        }
-        screenShowAmt()
+        } ?: screenShowAmt()
     }
 
     private fun getFixAmount(): String {
@@ -306,7 +446,7 @@
     }
 
     private fun screenShowAmt() {
-        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-热键模式")
+        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-特殊模式")
         AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
         AuxScreenController.getInstance().refreshContent(
             Arrays.asList<String>(
@@ -317,10 +457,6 @@
         )
     }
 
-    override fun onDestroy() {
-        super.onDestroy()
-    }
-
     private var counter: ContinuePressTimer? = null
 
     private fun resetCounter(timems: Long) {
@@ -343,4 +479,10 @@
             keyActive = true
         }
     }
+}
+
+enum class ConfigMode {
+    NORMAL_FIX,
+    HOT_KEY,
+    PERIOD_FIX,
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
index 304a6a7..110f204 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
@@ -18,9 +18,8 @@
  * @date 2019/4/9
  * @desc 在线升级
  */
-class EpayUpgradeApi constructor(callbackInterface: CallbackInterface) {
+class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
     private val TIMEOUT = 5 * 1000// 超时
-    private val callback = callbackInterface
     private val POSID = "posa711dali"
 
     fun upgrade(devphyid: String, version: String) {
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index 1c90e59..0112dfc 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -114,4 +114,10 @@
         key,
         amount
     }
+    enum class PeriodFixPay{
+        id,
+        begintime,
+        endtime,
+        amount
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
index 4862731..8a0f51d 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -13,13 +13,14 @@
 class DBParaHelper private constructor(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
     companion object {
         private val DB_NAME = "db_para"
-        private val VERSION = 1
+        private val VERSION = 2
 
         val TABLE_NAME_SYSPARA = "tb_syspara"
         val TABLE_NAME_DYNAMICPARA = "tb_dynamicpara"
         val TABLE_NAME_CONTROLPARA = "tb_controlpara"
         val TABLE_NAME_WHITELIST = "tb_whitelist"
         val TABLE_NAME_HOTKEY = "tb_hotkey"
+        val TABLE_NAME_PERIOD_FIX = "tb_period_fix"
 
         private var instance: DBParaHelper? = null
         fun getInstance(context: Context): DBParaHelper {
@@ -38,9 +39,15 @@
     /**
      * SQL for create table
      */
+    private val CREATE_TABLE_NAME_PERIOD_FIX = ("create table IF NOT EXISTS "
+            + TABLE_NAME_PERIOD_FIX + " ( "
+            + BeanPropEnum.PeriodFixPay.id + " integer primary key autoincrement,"
+            + BeanPropEnum.PeriodFixPay.begintime + " varchar(4),"
+            + BeanPropEnum.PeriodFixPay.endtime + " varchar(4),"
+            + BeanPropEnum.PeriodFixPay.amount + " integer )")
     private val CREATE_TABLE_NAME_HOTKEY = ("create table IF NOT EXISTS "
             + TABLE_NAME_HOTKEY + " ( "
-            + BeanPropEnum.HotkeyPay.key + " integer primary key,"
+            + BeanPropEnum.HotkeyPay.key + " long primary key,"
             + BeanPropEnum.HotkeyPay.amount + " integer)")
     private val CREATE_TABLE_NAME_WHITELIST = ("create table IF NOT EXISTS "
             + TABLE_NAME_WHITELIST + " ( "
@@ -99,12 +106,13 @@
         db.execSQL(CREATE_TABLE_NAME_CONTROLPARA)
         db.execSQL(CREATE_TABLE_NAME_WHITELIST)
         db.execSQL(CREATE_TABLE_NAME_HOTKEY)
+        db.execSQL(CREATE_TABLE_NAME_PERIOD_FIX)
     }
 
     override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
         if (oldVersion < newVersion) {
             if (oldVersion < 2 && newVersion >= 2) {
-//                db.execSQL("alter table $TABLE_NAME_SYSPARA add column ${BeanPropEnum.Syspara.maxDayOfflineAmt} integer")
+                db.execSQL(CREATE_TABLE_NAME_PERIOD_FIX)
             }
         }
     }
diff --git a/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt b/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
new file mode 100644
index 0000000..dce63c0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
@@ -0,0 +1,100 @@
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.PeriodFixPayRecord
+import java.util.concurrent.locks.Lock
+
+/**
+ ** create by zzq on 2019/11/20
+ ** @desc
+ **/
+class PeriodFixPayDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_PERIOD_FIX
+
+    fun getLock(): Lock {
+        return dbHelper.getLock()
+    }
+
+    fun replace(record: PeriodFixPayRecord): Boolean {
+        val db = dbHelper.readableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun save(list: List<PeriodFixPayRecord>): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            list.forEach {
+                val values = getContentValues(it)
+                if (db.insert(TABLE, null, values) <= 0) {
+                    return false
+                }
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun get(): List<PeriodFixPayRecord>? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, null)
+            val list = ArrayList<PeriodFixPayRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun clear(): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): PeriodFixPayRecord {
+        val record = PeriodFixPayRecord()
+        record.beginTime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.PeriodFixPay.begintime.toString()))
+        record.endTime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.PeriodFixPay.endtime.toString()))
+        record.amount = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.PeriodFixPay.amount.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: PeriodFixPayRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.PeriodFixPay.begintime.toString(), record.beginTime)
+        values.put(BeanPropEnum.PeriodFixPay.endtime.toString(), record.endTime)
+        values.put(BeanPropEnum.PeriodFixPay.amount.toString(), record.amount)
+        return values
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/Pos.kt b/app/src/main/java/com/supwisdom/db/Pos.kt
index 00ae522..9972af0 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -18,6 +18,7 @@
     private val controlParaDao = ControlParaDao(context)
     private val whiteListDao = WhiteListDao(context)
     private val hotkeyPayDao = HotkeyPayDao(context)
+    private val periodFixPayDao = PeriodFixPayDao(context)
     private val transdtlOnlineDao = TransdtlOnlineDao(sdContext)
     private val transdtlOfflineDao = TransdtlOfflineDao(sdContext)
     private val transdtlUnionDao = TransdtlUnionDao(sdContext)
@@ -73,6 +74,24 @@
         }
     }
 
+    fun savePeriodFixPay(list: List<PeriodFixPayRecord>): Boolean {
+        try {
+            periodFixPayDao.getLock().lock()
+            return periodFixPayDao.save(list)
+        } finally {
+            periodFixPayDao.getLock().unlock()
+        }
+    }
+
+    fun getPeriodFixPay(): List<PeriodFixPayRecord>? {
+        try {
+            periodFixPayDao.getLock().lock()
+            return periodFixPayDao.get()
+        } finally {
+            periodFixPayDao.getLock().unlock()
+        }
+    }
+
     fun replaceControlPara(record: ControlParaRecord): Boolean {
         try {
             controlParaDao.getLock().lock()
diff --git a/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt b/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
index 4d8bb24..e3ae7aa 100644
--- a/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
@@ -7,5 +7,4 @@
 class HotKeyPayRecord {
     var key: Int = 0
     var amount: Int = 0
-
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/PeriodFixPayRecord.kt b/app/src/main/java/com/supwisdom/entity/PeriodFixPayRecord.kt
new file mode 100644
index 0000000..abb736f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/PeriodFixPayRecord.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/11/19
+ ** @desc
+ **/
+class PeriodFixPayRecord {
+    var beginTime: String? = null //hhmm
+    var endTime: String? = null //hhmm
+    var amount: Int = 0
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt b/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt
index 4992921..f146948 100644
--- a/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt
+++ b/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt
@@ -37,9 +37,9 @@
         val temp = Build.DISPLAY
         val version = if (temp.contains("CAP08S-V1")) {
             when {
-                temp < "CAP08S-V1.0.9" -> 108
-                temp < "CAP08S-V1.1.1" -> 110
-                else -> 115
+                temp < "CAP08S-V1.0.9" -> "108"
+                temp < "CAP08S-V1.1.1" -> "110"
+                else -> "115"
             }
         } else {
             /**
@@ -48,7 +48,8 @@
             CommonUtil.getSerialNumber()?.replace("v", "")
                 ?.replace("V", "")
                 ?.replace(".", "")
-                ?.toInt() ?: 116
+                ?.replace(" ", "")
+                ?: "116"
         }
         picc = Picc(version)
         val ret = picc!!.open()
diff --git a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
index 5e3f70c..8765a41 100644
--- a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
@@ -35,7 +35,7 @@
     private var clientLong: OkHttpClient
     private val JSON = MediaType.parse("application/json; charset=utf-8")
     private val FORM_ENCODE = MediaType.parse("application/x-www-form-urlencoded;charset=utf-8")
-    private var commTime = 2
+    private var commTime = 5
     private var clientId: String? = null
     private var jwt: String? = null
 
diff --git a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
index 917f39c..253a752 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -5,6 +5,7 @@
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.app.ActivityManager
+import android.content.ContentResolver
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
@@ -12,6 +13,7 @@
 import android.os.Build
 import android.os.PowerManager
 import android.provider.Settings
+import android.view.WindowManager
 import android.widget.EditText
 import com.supwisdom.activities.SPApplication
 import java.io.File
@@ -191,4 +193,95 @@
             else -> " "
         }
     }
+
+    /**
+     * @param activity
+     * @param brightness [1-255]
+     * @desc 根据亮度值修改当前window亮度
+     */
+    fun setAppBrightness(activity: Activity, brightness: Int) {
+        val window = activity.window
+        val lp = window.attributes
+        if (brightness == -1) {
+            if (lp.screenBrightness < 0) {
+                /**
+                 * 已经是正常亮度
+                 */
+                return
+            }
+            lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
+        } else {
+            if (lp.screenBrightness > 0) {
+                /**
+                 * 已经屏保亮度
+                 */
+                return
+            }
+//            stopAutoBrightness(activity)
+            lp.screenBrightness = (if (brightness <= 0) 1 else brightness) / 255f
+        }
+        window.attributes = lp
+        /**
+         * 生效?
+         */
+//        getActivityBrightness(activity)
+    }
+
+    /**
+     * 获取当前activity的屏幕亮度
+     *
+     * @param activity 当前的activity对象
+     * @return 亮度值范围为0-0.1f,如果为-1.0,则亮度与全局同步。
+     */
+    private fun getActivityBrightness(activity: Activity): Float {
+        val localWindow = activity.window
+        val params = localWindow.attributes
+        return params.screenBrightness
+    }
+
+    /**
+     * 判断是否开启了自动亮度调节
+     * *
+     * * @param aContext
+     * * @return
+     *      
+     */
+    private fun isAutoBrightness(aContentResolver: ContentResolver): Boolean {
+        try {
+            return Settings.System.getInt(
+                aContentResolver,
+                Settings.System.SCREEN_BRIGHTNESS_MODE
+            ) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+        } catch (e: Settings.SettingNotFoundException) {
+            e.printStackTrace()
+        }
+
+        return false
+    }
+
+    /**
+     * 停止自动亮度调节
+     *
+     * @param activity
+     */
+    private fun stopAutoBrightness(activity: Activity) {
+        Settings.System.putInt(
+            activity.contentResolver,
+            Settings.System.SCREEN_BRIGHTNESS_MODE,
+            Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
+        )
+    }
+
+    /**
+     * 开启亮度自动调节
+     *
+     * @param activity
+     */
+    private fun startAutoBrightness(activity: Activity) {
+        Settings.System.putInt(
+            activity.contentResolver,
+            Settings.System.SCREEN_BRIGHTNESS_MODE,
+            Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+        )
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index 140f9a8..18c7074 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -33,8 +33,15 @@
     const val MSG_LINK_STATUS = 19
     const val MSG_PAYING_QUERY = 20
     const val MSG_PAYING_INTERRUPT = 21
+    const val MSG_SCREEN_SAVER = 22
     /*************************不能重复*****************************/
     /**
+     * 屏保亮度
+     */
+    const val SCREEN_SAVER_BRIGHTNESS = 1
+    const val SCREEN_NORMAL_BRIGHTNESS = -1
+    const val SCREEN_SAVER_GAP: Long = 30 * 60 * 1000
+    /**
      * 卡消费标志(1 byte)
      */
     /*high 4 bit*/
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index fa71710..44d3c74 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -115,6 +115,7 @@
     }
 
     fun showPaySuccess(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = info.retmsg
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.payamt)
@@ -126,6 +127,7 @@
     }
 
     fun showPayInterrupt() {
+        payQueryConfirm = false
         vPayhint.text = "交易取消"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = "以银行交易为准"
@@ -136,6 +138,7 @@
     }
 
     fun showPayFail(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = "消费失败"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = info.retmsg
@@ -146,6 +149,7 @@
     }
 
     fun showReverseSuccess(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = info.retmsg
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.amount)
@@ -156,6 +160,7 @@
     }
 
     fun showReverseFail(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = "冲正失败"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = info.retmsg
diff --git a/app/src/main/res/layout/activity_consume_mode.xml b/app/src/main/res/layout/activity_consume_mode.xml
index 653add6..befd0cf 100644
--- a/app/src/main/res/layout/activity_consume_mode.xml
+++ b/app/src/main/res/layout/activity_consume_mode.xml
@@ -8,22 +8,19 @@
                 style="@style/head_title_text_style"
                 android:text="消费模式"/>
         <RadioGroup
+                android:id="@+id/rg_special_mode"
                 android:visibility="gone"
                 android:layout_height="wrap_content"
+                android:weightSum="2"
                 android:layout_width="match_parent"
-                android:orientation="vertical">
-            <RadioButton
-                    android:id="@+id/rb_normal_mode"
-                    android:text="普通消费"
-                    style="@style/consume_mode_rb_style"
-                    android:checked="true"/>
-            <RadioButton
-                    android:id="@+id/rb_fix_mode"
-                    android:text="定额消费"
-                    style="@style/consume_mode_rb_style"/>
+                android:orientation="horizontal">
             <RadioButton
                     android:id="@+id/rb_hot_mode"
-                    android:text="快捷消费"
+                    android:text="按键便捷消费"
+                    style="@style/consume_mode_rb_style"/>
+            <RadioButton
+                    android:id="@+id/rb_period_fix_mode"
+                    android:text="波段定额消费"
                     style="@style/consume_mode_rb_style"/>
         </RadioGroup>
         <LinearLayout
@@ -91,7 +88,7 @@
                 <TextView
                         android:id="@+id/tv_hot_save"
                         android:textSize="25sp"
-                        android:layout_marginLeft="50dp"
+                        android:layout_marginStart="50dp"
                         android:text="保存"
                         android:background="@drawable/corner_bg_blue"
                         android:padding="10dp"
@@ -102,7 +99,7 @@
                         android:id="@+id/tv_hot_add"
                         android:textSize="25sp"
                         android:text="添加"
-                        android:layout_marginLeft="50dp"
+                        android:layout_marginStart="50dp"
                         android:background="@drawable/corner_bg_blue"
                         android:padding="10dp"
                         android:textColor="@color/white"
@@ -110,6 +107,7 @@
                         android:layout_height="wrap_content"/>
             </LinearLayout>
             <TextView
+                    android:id="@+id/tv_special_desc"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:text="快捷消费(单位:元)"
@@ -117,11 +115,10 @@
                     android:textColor="@color/light_blue2"
                     android:textSize="20sp"/>
             <LinearLayout
-                    android:id="@+id/ll_hot_list"
+                    android:id="@+id/ll_special_list"
                     android:layout_width="match_parent"
                     android:orientation="vertical"
                     android:layout_height="match_parent"/>
-
         </LinearLayout>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_period_fix_pay.xml b/app/src/main/res/layout/item_period_fix_pay.xml
new file mode 100644
index 0000000..b1e7226
--- /dev/null
+++ b/app/src/main/res/layout/item_period_fix_pay.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="horizontal"
+              android:background="@color/white"
+              android:layout_width="match_parent"
+              android:weightSum="7"
+              android:padding="5dp"
+              android:layout_marginTop="10dp"
+              android:layout_height="match_parent">
+    <TextView
+            android:id="@+id/tv_config"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="规则 1:"
+            android:visibility="gone"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_period_start"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:inputType="numberDecimal"
+            android:layout_weight="2"
+            android:maxLines="1"
+            android:text="0000"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_period_end"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:inputType="numberDecimal"
+            android:layout_weight="2"
+            android:maxLines="1"
+            android:text="2400"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_amount"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:inputType="numberDecimal"
+            android:layout_weight="2"
+            android:maxLines="1"
+            android:text="0"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <TextView
+            android:id="@+id/tv_del"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="删除"
+            android:layout_marginStart="10dp"
+            android:gravity="center"
+            android:padding="10dp"
+            android:background="@drawable/corner_bg_blue"
+            android:textColor="@color/white"
+            android:textSize="25sp"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d85e0af..a1088c5 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -428,7 +428,8 @@
     </style>
     <style name="consume_mode_rb_style">
         <item name="android:layout_height">wrap_content</item>
-        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_width">0dp</item>
+        <item name="android:layout_weight">1</item>
         <item name="android:textSize">25sp</item>
         <item name="android:textColor">@color/light_blue2</item>
     </style>