Forráskód Böngészése

完成串口地址设置功能,准备适配

Frankensteinly 9 hónapja
szülő
commit
2ccf7da113

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -17,6 +17,9 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+
     <application
         android:name=".MyApplication"
         android:allowBackup="true"

+ 70 - 59
app/src/main/java/com/grkj/iscs/view/fragment/SystemSettingFragment.kt

@@ -5,31 +5,27 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.PopupWindow
 import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentSystemSettingBinding
 import com.grkj.iscs.databinding.LayoutSelectableinputSpinnerBinding
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_COLLECT
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
-import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
-import com.grkj.iscs.util.CommonUtils
 import com.grkj.iscs.util.SPUtils
-import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.util.byteToHexString
-import com.grkj.iscs.view.base.BaseFragment
+import com.grkj.iscs.view.base.BaseMvpFragment
+import com.grkj.iscs.view.iview.ISystemSettingView
+import com.grkj.iscs.view.presenter.SystemSettingPresenter
 import com.zhy.adapter.recyclerview.CommonAdapter
 import com.zhy.adapter.recyclerview.base.ViewHolder
 
 /**
  * 系统设置页
  */
-class SystemSettingFragment : BaseFragment<FragmentSystemSettingBinding>() {
+class SystemSettingFragment : BaseMvpFragment<ISystemSettingView, SystemSettingPresenter, FragmentSystemSettingBinding>() {
 
     private var mDockTypeList = mutableListOf<DockItem>()
+    private var mPortList = mutableListOf<String>()
     private var mDropdownView: View? = null
-    private var mPopWindow: PopupWindow? = null
+    private var mTypePop: PopupWindow? = null
+    private var mPortPop: PopupWindow? = null
     private var mDockList = mutableListOf<DockTestFragment.DockTestBean>()
     private var mSelectedBoardType: Byte? = null
 
@@ -37,34 +33,18 @@ class SystemSettingFragment : BaseFragment<FragmentSystemSettingBinding>() {
         get() = FragmentSystemSettingBinding.inflate(layoutInflater)
 
     override fun initView() {
-        val dockConfigJson = SPUtils.getDockConfig(requireActivity())
-        if (!dockConfigJson.isNullOrEmpty()) {
-            val tempList: MutableList<DockTestFragment.DockTestBean> =
-                Gson().fromJson(
-                    dockConfigJson,
-                    object : TypeToken<MutableList<DockTestFragment.DockTestBean>>() {}.type
-                )
-            if (tempList.isNotEmpty()) {
-                mDockList.addAll(tempList)
-            }
-        }
+        mDockList.addAll(presenter?.getDockList()!!)
 
-        mDockTypeList.addAll(
-            mutableListOf(
-                DockItem(getString(R.string.board_type_key), DOCK_TYPE_KEY),
-                DockItem(getString(R.string.board_type_lock), DOCK_TYPE_LOCK),
-                DockItem(getString(R.string.board_type_portal), DOCK_TYPE_PORTABLE),
-                DockItem(getString(R.string.board_type_collect), DOCK_TYPE_COLLECT),
-                DockItem(getString(R.string.board_type_elec_lock), DOCK_TYPE_ELEC_LOCK_BOARD)
-            )
-        )
-
-        mBinding?.rlSpinner?.setOnClickListener {
+        mDockTypeList.addAll(presenter?.getDockTypeList()!!)
+
+        mBinding?.rlSpinnerType?.setOnClickListener {
             showBoardTypeDropDown()
         }
 
         mBinding?.tvAdd?.setOnClickListener {
-            addBoard()
+            presenter?.addBoard(mBinding?.etAddress?.text.toString(), mSelectedBoardType, mDockList) {
+                mBinding?.rvBoard?.adapter?.notifyDataSetChanged()
+            }
         }
 
         mBinding?.rvBoard?.adapter = object : CommonAdapter<DockTestFragment.DockTestBean>(
@@ -87,6 +67,19 @@ class SystemSettingFragment : BaseFragment<FragmentSystemSettingBinding>() {
                 }
             }
         }
+
+        mPortList.addAll(presenter?.getSerialPorts()!!)
+
+        mBinding?.rlSpinnerPort?.setOnClickListener {
+            showPortDropDown()
+        }
+
+        mBinding?.tvPort?.text = SPUtils.getPortConfig(requireActivity())
+
+        mBinding?.tvSetPort?.setOnClickListener {
+            presenter?.setPort(mBinding?.tvPort?.text.toString())
+            // TODO 设置端口
+        }
     }
 
     private fun showBoardTypeDropDown() {
@@ -95,13 +88,13 @@ class SystemSettingFragment : BaseFragment<FragmentSystemSettingBinding>() {
                 .inflate(R.layout.layout_selectableinput_spinner, null)
         }
 
-        mPopWindow ?: let {
-            mPopWindow = PopupWindow(context)
-            mPopWindow?.contentView = mDropdownView
-            mPopWindow?.width = mBinding?.rlSpinner!!.width
-            mPopWindow?.height = ViewGroup.LayoutParams.WRAP_CONTENT
-            mPopWindow?.isOutsideTouchable = true
-            mPopWindow?.isFocusable = true
+        mTypePop ?: let {
+            mTypePop = PopupWindow(context)
+            mTypePop?.contentView = mDropdownView
+            mTypePop?.width = mBinding?.rlSpinnerType!!.width
+            mTypePop?.height = ViewGroup.LayoutParams.WRAP_CONTENT
+            mTypePop?.isOutsideTouchable = true
+            mTypePop?.isFocusable = true
 
             val popBinding = LayoutSelectableinputSpinnerBinding.bind(mDropdownView!!)
             popBinding.rvOptions.adapter = object : CommonAdapter<DockItem>(
@@ -113,34 +106,52 @@ class SystemSettingFragment : BaseFragment<FragmentSystemSettingBinding>() {
                     holder?.setText(R.id.tv_option, option?.name)
                     holder?.setOnClickListener(R.id.tv_option) {
                         mBinding?.tvBoardType?.text = option?.name
-                        mPopWindow?.dismiss()
+                        mTypePop?.dismiss()
                         mSelectedBoardType = option?.type
                     }
                 }
             }
         }
 
-        mPopWindow?.showAsDropDown(mBinding?.rlSpinner)
+        mTypePop?.showAsDropDown(mBinding?.rlSpinnerType)
     }
 
-    private fun addBoard() {
-        val address = mBinding?.etAddress?.text.toString()
-        if (mSelectedBoardType == null) {
-            ToastUtils.tip(R.string.please_select_board_type)
-            return
-        }
-        if (address.isEmpty()) {
-            ToastUtils.tip(R.string.please_input_address)
-            return
+    private fun showPortDropDown() {
+        mDropdownView ?: let {
+            mDropdownView = LayoutInflater.from(requireActivity())
+                .inflate(R.layout.layout_selectableinput_spinner, null)
         }
-        if (!CommonUtils.isValidHex(address)) {
-            ToastUtils.tip(R.string.please_input_valid_address)
-            return
+
+        mPortPop ?: let {
+            mPortPop = PopupWindow(context)
+            mPortPop?.contentView = mDropdownView
+            mPortPop?.width = mBinding?.rlSpinnerType!!.width
+            mPortPop?.height = ViewGroup.LayoutParams.WRAP_CONTENT
+            mPortPop?.isOutsideTouchable = true
+            mPortPop?.isFocusable = true
+
+            val popBinding = LayoutSelectableinputSpinnerBinding.bind(mDropdownView!!)
+            popBinding.rvOptions.adapter = object : CommonAdapter<String>(
+                requireActivity(),
+                R.layout.item_rv_selectableinput_spinner,
+                mPortList
+            ) {
+                override fun convert(holder: ViewHolder?, option: String, position: Int) {
+                    holder?.setText(R.id.tv_option, option)
+                    holder?.setOnClickListener(R.id.tv_option) {
+                        mBinding?.tvPort?.text = option
+                        mPortPop?.dismiss()
+                    }
+                }
+            }
         }
-        mDockList.add(DockTestFragment.DockTestBean(address.toInt(16).toByte(), mSelectedBoardType!!))
-        mBinding?.rvBoard?.adapter?.notifyDataSetChanged()
-        SPUtils.saveDockConfig(requireActivity(), Gson().toJson(mDockList))
+
+        mPortPop?.showAsDropDown(mBinding?.rlSpinnerPort)
+    }
+
+    override fun initPresenter(): SystemSettingPresenter {
+        return SystemSettingPresenter()
     }
 
-    private data class DockItem(val name: String, val type: Byte)
+    data class DockItem(val name: String, val type: Byte)
 }

+ 6 - 0
app/src/main/java/com/grkj/iscs/view/iview/ISystemSettingView.kt

@@ -0,0 +1,6 @@
+package com.grkj.iscs.view.iview
+
+import com.grkj.iscs.view.base.IView
+
+interface ISystemSettingView : IView {
+}

+ 98 - 0
app/src/main/java/com/grkj/iscs/view/presenter/SystemSettingPresenter.kt

@@ -0,0 +1,98 @@
+package com.grkj.iscs.view.presenter
+
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.grkj.iscs.R
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_COLLECT
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_ELEC_LOCK_BOARD
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs.util.CommonUtils
+import com.grkj.iscs.util.SPUtils
+import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.view.base.BasePresenter
+import com.grkj.iscs.view.fragment.DockTestFragment
+import com.grkj.iscs.view.fragment.SystemSettingFragment.DockItem
+import com.grkj.iscs.view.iview.ISystemSettingView
+import java.io.File
+
+class SystemSettingPresenter : BasePresenter<ISystemSettingView>() {
+
+    fun getDockTypeList(): MutableList<DockItem> {
+        return mutableListOf(
+            DockItem(mContext!!.getString(R.string.board_type_key), DOCK_TYPE_KEY),
+            DockItem(mContext!!.getString(R.string.board_type_lock), DOCK_TYPE_LOCK),
+            DockItem(mContext!!.getString(R.string.board_type_portal), DOCK_TYPE_PORTABLE),
+            DockItem(mContext!!.getString(R.string.board_type_collect), DOCK_TYPE_COLLECT),
+            DockItem(mContext!!.getString(R.string.board_type_elec_lock), DOCK_TYPE_ELEC_LOCK_BOARD)
+        )
+    }
+
+    fun getDockList(): MutableList<DockTestFragment.DockTestBean> {
+        val dockConfigJson = SPUtils.getDockConfig(mContext!!)
+        if (!dockConfigJson.isNullOrEmpty()) {
+            val tempList: MutableList<DockTestFragment.DockTestBean> =
+                Gson().fromJson(
+                    dockConfigJson,
+                    object : TypeToken<MutableList<DockTestFragment.DockTestBean>>() {}.type
+                )
+            return tempList
+        }
+        return mutableListOf()
+    }
+
+    fun addBoard(
+        address: String,
+        type: Byte?,
+        dockList: MutableList<DockTestFragment.DockTestBean>,
+        callback: () -> Unit
+    ) {
+        if (type == null) {
+            ToastUtils.tip(R.string.please_select_board_type)
+            return
+        }
+        if (address.isEmpty()) {
+            ToastUtils.tip(R.string.please_input_address)
+            return
+        }
+        if (!CommonUtils.isValidHex(address)) {
+            ToastUtils.tip(R.string.please_input_valid_address)
+            return
+        }
+        dockList.add(DockTestFragment.DockTestBean(address.toInt(16).toByte(), type))
+        callback()
+        ToastUtils.tip(R.string.save_success)
+        SPUtils.saveDockConfig(mContext!!, Gson().toJson(dockList))
+    }
+
+    fun getSerialPorts(): List<String> {
+        val serialPorts: MutableList<String> = ArrayList()
+        val devDir = File("/dev")
+
+        if (devDir.isDirectory) {
+            val files = devDir.listFiles()
+            if (files != null) {
+                for (file in files) {
+                    if (isSerialPort(file.name)) {
+                        serialPorts.add(file.absolutePath)
+                    }
+                }
+            }
+        }
+        return serialPorts
+    }
+
+    private fun isSerialPort(fileName: String): Boolean {
+        return fileName.startsWith("ttyS") || fileName.startsWith("ttyUSB")
+    }
+
+    fun setPort(port: String?) {
+        if (port.isNullOrEmpty()) {
+            ToastUtils.tip(R.string.please_select_port)
+            return
+        }
+        ToastUtils.tip(R.string.save_success)
+        SPUtils.savePortConfig(mContext!!, port)
+    }
+}

+ 49 - 2
app/src/main/res/layout/fragment_system_setting.xml

@@ -32,7 +32,7 @@
                 android:text="@string/type" />
 
             <RelativeLayout
-                android:id="@+id/rl_spinner"
+                android:id="@+id/rl_spinner_type"
                 android:layout_width="100dp"
                 android:layout_height="wrap_content"
                 android:layout_marginHorizontal="@dimen/common_spacing_small"
@@ -63,7 +63,7 @@
                 android:layout_width="30dp"
                 android:layout_marginLeft="@dimen/common_spacing_small"
                 android:gravity="center"
-                android:maxLength="2"/>
+                android:maxLength="2" />
 
             <TextView
                 android:id="@+id/tv_add"
@@ -99,5 +99,52 @@
             style="@style/CommonTextView"
             android:text="@string/port_address_config"
             android:textSize="@dimen/common_text_size_big" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginVertical="@dimen/common_spacing_small"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <TextView
+                style="@style/CommonTextView"
+                android:text="@string/port_address" />
+
+            <RelativeLayout
+                android:id="@+id/rl_spinner_port"
+                android:layout_width="100dp"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="@dimen/common_spacing_small"
+                android:background="@drawable/item_rv_technology_sop_bg_normal"
+                android:padding="@dimen/common_spacing_small">
+
+                <TextView
+                    android:id="@+id/tv_port"
+                    style="@style/CommonTextView"
+                    android:layout_centerVertical="true" />
+
+                <ImageView
+                    android:layout_width="@dimen/common_icon_size"
+                    android:layout_height="@dimen/common_icon_size"
+                    android:layout_alignParentRight="true"
+                    android:layout_centerVertical="true"
+                    android:rotation="90"
+                    android:src="@mipmap/arrow" />
+            </RelativeLayout>
+
+            <TextView
+                android:id="@+id/tv_set_port"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing_small"
+                android:background="@drawable/common_btn_bg"
+                android:gravity="center"
+                android:paddingHorizontal="@dimen/common_spacing_big"
+                android:paddingVertical="@dimen/common_text_padding"
+                android:text="@string/settings"
+                android:textColor="@color/white"
+                android:textSize="@dimen/common_text_size" />
+        </LinearLayout>
     </LinearLayout>
 </LinearLayout>

+ 2 - 1
app/src/main/res/layout/item_rv_board.xml

@@ -9,7 +9,8 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:gravity="center_vertical"
-        android:orientation="horizontal">
+        android:orientation="horizontal"
+        android:padding="@dimen/common_spacing_small">
 
         <TextView
             android:id="@+id/tv_board"

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -197,4 +197,7 @@
     <string name="please_select_board_type">请选择主板类型</string>
     <string name="please_input_address">请输入地址</string>
     <string name="please_input_valid_address">请输入合法地址</string>
+    <string name="port_address">串口地址</string>
+    <string name="please_select_port">请选择串口</string>
+    <string name="save_success">保存成功!</string>
 </resources>