Ver código fonte

配合测试完成BUG修复

JaycePC 4 meses atrás
pai
commit
c1643c417a
100 arquivos alterados com 2393 adições e 2071 exclusões
  1. 3 0
      app/build.gradle
  2. 3 0
      app/src/main/AndroidManifest.xml
  3. 4 4
      app/src/main/java/com/rc/core/ui/activity/BaseActivity.java
  4. 2 2
      app/src/main/java/com/rc/httpcore/client/ApiRepository.kt
  5. 1 1
      app/src/main/java/com/rc/httpcore/client/ChemicalClient.kt
  6. 1 1
      app/src/main/java/com/rc/httpcore/client/retrofit/ApiService.java
  7. 2 2
      app/src/main/java/com/rc/httpcore/client/retrofit/ChemicalRetrofit.kt
  8. 4 1
      app/src/main/java/xn/hxp/app/ChemicalApp.kt
  9. 64 64
      app/src/main/java/xn/hxp/blu/BluetoothConnectionManager.kt
  10. 17 1
      app/src/main/java/xn/hxp/ui/MainActivity.kt
  11. 113 0
      app/src/main/java/xn/hxp/ui/SettingActivity.java
  12. 0 73
      app/src/main/java/xn/hxp/ui/SettingActivity.kt
  13. 7 0
      app/src/main/java/xn/hxp/ui/SettingsBean.kt
  14. 33 5
      app/src/main/java/xn/hxp/ui/StartActivity.java
  15. 1 1
      app/src/main/java/xn/hxp/ui/plan/add/AddActivityHelp.java
  16. 20 116
      app/src/main/java/xn/hxp/ui/still/ChemicalsAlsoActivity.kt
  17. 37 115
      app/src/main/java/xn/hxp/ui/uses/UseActivity.kt
  18. 7 1
      app/src/main/java/xn/hxp/ui/verify/include/FaceDetectView.java
  19. 1489 1537
      app/src/main/java/xn/hxp/ui/warehousing/WarehousingActivity.kt
  20. 5 5
      app/src/main/java/xn/hxp/utils/Tool.java
  21. 199 0
      app/src/main/java/xn/hxp/utils/bluetooth/BleTool.java
  22. 112 112
      app/src/main/java/xn/hxp/utils/bluetooth/BluetoothTool.java
  23. 5 0
      app/src/main/java/xn/hxp/weidith/CabinetOpenDialog.kt
  24. 10 1
      app/src/main/java/xn/hxp/weidith/WeighDialog.kt
  25. 68 0
      app/src/main/java/xn/hxp/weidith/ble/BleScanAdapter.java
  26. 120 0
      app/src/main/java/xn/hxp/weidith/ble/BleSelectorDialog.java
  27. 22 29
      app/src/main/java/xn/hxp/weidith/BluetoothWeighDialog.java
  28. 11 0
      app/src/main/res/drawable-anydpi/ic_ble.xml
  29. 11 0
      app/src/main/res/drawable-anydpi/ic_ble_connected.xml
  30. 11 0
      app/src/main/res/drawable-anydpi/ic_ble_connecting.xml
  31. 11 0
      app/src/main/res/drawable-anydpi/ic_ble_unconnected.xml
  32. BIN
      app/src/main/res/drawable-hdpi/ic_admin.png
  33. BIN
      app/src/main/res/drawable-hdpi/ic_back.png
  34. BIN
      app/src/main/res/drawable-hdpi/ic_ble.png
  35. BIN
      app/src/main/res/drawable-hdpi/ic_ble_connected.png
  36. BIN
      app/src/main/res/drawable-hdpi/ic_ble_connecting.png
  37. BIN
      app/src/main/res/drawable-hdpi/ic_ble_unconnected.png
  38. BIN
      app/src/main/res/drawable-hdpi/ic_celsius.png
  39. BIN
      app/src/main/res/drawable-hdpi/ic_cpu.png
  40. BIN
      app/src/main/res/drawable-hdpi/ic_eixt.png
  41. BIN
      app/src/main/res/drawable-hdpi/ic_et_err.png
  42. BIN
      app/src/main/res/drawable-hdpi/ic_folder.png
  43. BIN
      app/src/main/res/drawable-hdpi/ic_http.png
  44. BIN
      app/src/main/res/drawable-hdpi/ic_ip.png
  45. BIN
      app/src/main/res/drawable-hdpi/ic_mqtt.png
  46. BIN
      app/src/main/res/drawable-hdpi/ic_mqtt_account.png
  47. BIN
      app/src/main/res/drawable-hdpi/ic_mqtt_password.png
  48. BIN
      app/src/main/res/drawable-hdpi/ic_reboot.png
  49. BIN
      app/src/main/res/drawable-hdpi/ic_save.png
  50. BIN
      app/src/main/res/drawable-hdpi/ic_settings.png
  51. BIN
      app/src/main/res/drawable-hdpi/ic_sn.png
  52. BIN
      app/src/main/res/drawable-hdpi/ic_time.png
  53. BIN
      app/src/main/res/drawable-hdpi/ic_ver.png
  54. BIN
      app/src/main/res/drawable-mdpi/ic_admin.png
  55. BIN
      app/src/main/res/drawable-mdpi/ic_back.png
  56. BIN
      app/src/main/res/drawable-mdpi/ic_ble.png
  57. BIN
      app/src/main/res/drawable-mdpi/ic_ble_connected.png
  58. BIN
      app/src/main/res/drawable-mdpi/ic_ble_connecting.png
  59. BIN
      app/src/main/res/drawable-mdpi/ic_ble_unconnected.png
  60. BIN
      app/src/main/res/drawable-mdpi/ic_celsius.png
  61. BIN
      app/src/main/res/drawable-mdpi/ic_cpu.png
  62. BIN
      app/src/main/res/drawable-mdpi/ic_eixt.png
  63. BIN
      app/src/main/res/drawable-mdpi/ic_et_err.png
  64. BIN
      app/src/main/res/drawable-mdpi/ic_folder.png
  65. BIN
      app/src/main/res/drawable-mdpi/ic_http.png
  66. BIN
      app/src/main/res/drawable-mdpi/ic_ip.png
  67. BIN
      app/src/main/res/drawable-mdpi/ic_mqtt.png
  68. BIN
      app/src/main/res/drawable-mdpi/ic_mqtt_account.png
  69. BIN
      app/src/main/res/drawable-mdpi/ic_mqtt_password.png
  70. BIN
      app/src/main/res/drawable-mdpi/ic_reboot.png
  71. BIN
      app/src/main/res/drawable-mdpi/ic_save.png
  72. BIN
      app/src/main/res/drawable-mdpi/ic_settings.png
  73. BIN
      app/src/main/res/drawable-mdpi/ic_sn.png
  74. BIN
      app/src/main/res/drawable-mdpi/ic_time.png
  75. BIN
      app/src/main/res/drawable-mdpi/ic_ver.png
  76. BIN
      app/src/main/res/drawable-xhdpi/ble_mac_hint.png
  77. BIN
      app/src/main/res/drawable-xhdpi/ic_admin.png
  78. BIN
      app/src/main/res/drawable-xhdpi/ic_back.png
  79. BIN
      app/src/main/res/drawable-xhdpi/ic_ble.png
  80. BIN
      app/src/main/res/drawable-xhdpi/ic_ble_connected.png
  81. BIN
      app/src/main/res/drawable-xhdpi/ic_ble_connecting.png
  82. BIN
      app/src/main/res/drawable-xhdpi/ic_ble_unconnected.png
  83. BIN
      app/src/main/res/drawable-xhdpi/ic_celsius.png
  84. BIN
      app/src/main/res/drawable-xhdpi/ic_cpu.png
  85. BIN
      app/src/main/res/drawable-xhdpi/ic_eixt.png
  86. BIN
      app/src/main/res/drawable-xhdpi/ic_et_err.png
  87. BIN
      app/src/main/res/drawable-xhdpi/ic_folder.png
  88. BIN
      app/src/main/res/drawable-xhdpi/ic_http.png
  89. BIN
      app/src/main/res/drawable-xhdpi/ic_ip.png
  90. BIN
      app/src/main/res/drawable-xhdpi/ic_mqtt.png
  91. BIN
      app/src/main/res/drawable-xhdpi/ic_mqtt_account.png
  92. BIN
      app/src/main/res/drawable-xhdpi/ic_mqtt_password.png
  93. BIN
      app/src/main/res/drawable-xhdpi/ic_reboot.png
  94. BIN
      app/src/main/res/drawable-xhdpi/ic_save.png
  95. BIN
      app/src/main/res/drawable-xhdpi/ic_settings.png
  96. BIN
      app/src/main/res/drawable-xhdpi/ic_sn.png
  97. BIN
      app/src/main/res/drawable-xhdpi/ic_time.png
  98. BIN
      app/src/main/res/drawable-xhdpi/ic_ver.png
  99. BIN
      app/src/main/res/drawable-xhdpi/logo.png
  100. 0 0
      app/src/main/res/drawable-xxhdpi/ic_admin.png

+ 3 - 0
app/build.gradle

@@ -133,4 +133,7 @@ dependencies {
     implementation 'com.google.mlkit:face-detection:16.0.0'
     implementation 'com.github.kongzue.DialogXSample:DatePicker:0.0.14'
 
+    implementation 'com.github.Jasonchenlijian:FastBle:2.4.0'
+    implementation 'com.google.android.flexbox:flexbox:3.0.0'
+
 }

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

@@ -75,6 +75,9 @@
         android:theme="@style/Theme.AppFullTheme"
         tools:targetApi="m">
         <activity
+            android:name=".ui.SettingActivity"
+            android:exported="false" />
+        <activity
             android:name=".ui.plan.save_list.SaveListActivity"
             android:exported="false" />
         <activity

+ 4 - 4
app/src/main/java/com/rc/core/ui/activity/BaseActivity.java

@@ -91,14 +91,14 @@ public abstract class BaseActivity extends AppCompatActivity {
         }
     }
 
-    protected abstract void cdFinish();
-
-    protected abstract void cdTime(int cd);
-
     protected abstract ViewBinding setViewBinding();
 
     protected abstract void onInit();
 
+    protected abstract void cdFinish();
+
+    protected abstract void cdTime(int cd);
+
     protected void setCdTime(int cdTime) {
         this.cdTime = cdTime;
     }

+ 2 - 2
app/src/main/java/com/rc/httpcore/client/ApiRepository.kt

@@ -237,9 +237,9 @@ object ApiRepository {
             .observeOn(AndroidSchedulers.mainThread())
     }
 
-    fun backDetail(rfidCode: String): Observable<ReturnDetailsBean> {
+    fun backDetail(rfidCode: String, subId: String): Observable<ReturnDetailsBean> {
         return mClientFactory.createLabClient()
-            .backDetail(rfidCode)
+            .backDetail(rfidCode,subId)
             .subscribeOn(Schedulers.io())
             .observeOn(AndroidSchedulers.mainThread())
     }

+ 1 - 1
app/src/main/java/com/rc/httpcore/client/ChemicalClient.kt

@@ -88,7 +88,7 @@ interface ChemicalClient {
 
     fun updateRfid(ids: String, rfidCode: String?): Observable<String>
 
-    fun backDetail(rfidCode: String): Observable<ReturnDetailsBean>
+    fun backDetail(rfidCode: String, subId: String): Observable<ReturnDetailsBean>
 
     fun chemicalSearchBean(rfidCode: String, subId: String): Observable<ChemicalSearchBean>
 

+ 1 - 1
app/src/main/java/com/rc/httpcore/client/retrofit/ApiService.java

@@ -185,7 +185,7 @@ public interface ApiService {
 
     //归还化学品信息详情
     @GET("chemical/aio/backDetail")
-    Observable<CommonDataResponse<ReturnDetailsBean>> backDetail(@Query("rfidCode") String rfidCode);
+    Observable<CommonDataResponse<ReturnDetailsBean>> backDetail(@Query("rfidCode") String rfidCode, @Query("subId") String subId);
 
     @GET("chemical/stockWait/scanCodeChemical")
     Observable<CommonDataResponse<ChemicalSearchBean>> scanCodeChemical(@Query("label") String label, @Query("subId") String subId);

+ 2 - 2
app/src/main/java/com/rc/httpcore/client/retrofit/ChemicalRetrofit.kt

@@ -455,8 +455,8 @@ class ChemicalRetrofit : ChemicalClient {
             }
     }
 
-    override fun backDetail(rfidCode: String): Observable<ReturnDetailsBean> {
-        return apiService.backDetail(rfidCode)
+    override fun backDetail(rfidCode: String, subId: String): Observable<ReturnDetailsBean> {
+        return apiService.backDetail(rfidCode,subId)
             .map { response ->
                 if (!response.isSuccess()) {
                     throw NetException(response.code, response.message)

+ 4 - 1
app/src/main/java/xn/hxp/app/ChemicalApp.kt

@@ -2,13 +2,13 @@ package xn.hxp.app
 
 import android.app.Application
 import android.content.Context
-import android.graphics.Color
 import android.util.Log
 import androidx.multidex.MultiDex
 import com.blankj.utilcode.util.AppUtils
 import com.blankj.utilcode.util.CrashUtils
 import com.blankj.utilcode.util.FileUtils
 import com.blankj.utilcode.util.LogUtils
+import com.clj.fastble.BleManager
 import com.kongzue.dialogx.DialogX
 import com.kongzue.dialogx.util.TextInfo
 import com.rc.core.util.ScreenAdapter
@@ -53,11 +53,14 @@ class ChemicalApp : Application() {
 
     override fun onCreate() {
         super.onCreate()
+        BleManager.getInstance().enableLog(true).init(this)
+
         DialogX.init(this)
         DialogX.globalTheme = DialogX.THEME.DARK
         DialogX.cancelable = false
         DialogX.cancelableTipDialog = false
         DialogX.tipProgressColor = getColor(R.color.teal_700)
+
         var textInfo = TextInfo()
         textInfo.fontColor = getColor(R.color.teal_700)
         textInfo.fontSizeUnit = TextInfo.FONT_SIZE_UNIT.SP

+ 64 - 64
app/src/main/java/xn/hxp/blu/BluetoothConnectionManager.kt

@@ -1,64 +1,64 @@
-package xn.hxp.blu
-
-import android.bluetooth.BluetoothAdapter
-import android.bluetooth.BluetoothDevice
-import android.bluetooth.BluetoothSocket
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.withContext
-import java.io.IOException
-import java.util.*
-
-object BluetoothConnectionManager {
-    private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
-    private val uuid: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") // SPP UUID
-    private const val connectionTimeoutMillis: Long = 3000 // 连接超时时间3秒钟
-//    suspend fun getDeviceAddress(deviceName: String): String? {
-    suspend fun getDeviceAddress(): String? {
-        return withContext(Dispatchers.IO) {
-            val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
-//            pairedDevices?.find { it.name == deviceName }?.address
-            pairedDevices?.find { it.name == "HF-18" }?.address
-        }
-    }
-
-
-    suspend fun connectToDevice(deviceAddress: String): BluetoothSocket? {
-        val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
-        val device: BluetoothDevice? = bluetoothAdapter?.getRemoteDevice(deviceAddress)
-
-        return withContext(Dispatchers.IO) {
-            var socket: BluetoothSocket? = null
-            val thread = Thread {
-                try {
-                    socket = device?.createRfcommSocketToServiceRecord(uuid)
-                    socket?.connect()
-                } catch (e: IOException) {
-                    e.printStackTrace()
-                    try {
-                        socket?.close()
-                    } catch (closeException: IOException) {
-                        closeException.printStackTrace()
-                    }
-                    socket = null
-                }
-            }
-
-            thread.start()
-            try {
-                thread.join(connectionTimeoutMillis)
-            } catch (e: InterruptedException) {
-                e.printStackTrace()
-            }
-
-            if (thread.isAlive) {
-                socket?.close()
-                thread.interrupt()
-                socket = null
-            }
-
-            socket  // 返回连接成功或为null(失败或超时)
-        }
-    }
-
-
-}
+//package xn.hxp.blu
+//
+//import android.bluetooth.BluetoothAdapter
+//import android.bluetooth.BluetoothDevice
+//import android.bluetooth.BluetoothSocket
+//import kotlinx.coroutines.Dispatchers
+//import kotlinx.coroutines.withContext
+//import java.io.IOException
+//import java.util.*
+//
+//object BluetoothConnectionManager {
+//    private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
+//    private val uuid: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") // SPP UUID
+//    private const val connectionTimeoutMillis: Long = 3000 // 连接超时时间3秒钟
+////    suspend fun getDeviceAddress(deviceName: String): String? {
+//    suspend fun getDeviceAddress(): String? {
+//        return withContext(Dispatchers.IO) {
+//            val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
+////            pairedDevices?.find { it.name == deviceName }?.address
+//            pairedDevices?.find { it.name == "HF-18" }?.address
+//        }
+//    }
+//
+//
+//    suspend fun connectToDevice(deviceAddress: String): BluetoothSocket? {
+//        val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
+//        val device: BluetoothDevice? = bluetoothAdapter?.getRemoteDevice(deviceAddress)
+//
+//        return withContext(Dispatchers.IO) {
+//            var socket: BluetoothSocket? = null
+//            val thread = Thread {
+//                try {
+//                    socket = device?.createRfcommSocketToServiceRecord(uuid)
+//                    socket?.connect()
+//                } catch (e: IOException) {
+//                    e.printStackTrace()
+//                    try {
+//                        socket?.close()
+//                    } catch (closeException: IOException) {
+//                        closeException.printStackTrace()
+//                    }
+//                    socket = null
+//                }
+//            }
+//
+//            thread.start()
+//            try {
+//                thread.join(connectionTimeoutMillis)
+//            } catch (e: InterruptedException) {
+//                e.printStackTrace()
+//            }
+//
+//            if (thread.isAlive) {
+//                socket?.close()
+//                thread.interrupt()
+//                socket = null
+//            }
+//
+//            socket  // 返回连接成功或为null(失败或超时)
+//        }
+//    }
+//
+//
+//}

+ 17 - 1
app/src/main/java/xn/hxp/ui/MainActivity.kt

@@ -10,6 +10,7 @@ import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
 import android.os.Message
+import android.text.TextUtils
 import android.view.KeyEvent
 import android.view.View
 import android.widget.EditText
@@ -19,9 +20,15 @@ import androidx.viewbinding.ViewBinding
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.AppUtils
 import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.SPUtils
 import com.bumptech.glide.Glide
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import com.bumptech.glide.request.RequestOptions
+import com.clj.fastble.BleManager
+import com.clj.fastble.callback.BleScanCallback
+import com.clj.fastble.data.BleDevice
+import com.clj.fastble.scan.BleScanRuleConfig
+import com.kongzue.dialogx.dialogs.PopTip
 import com.lztek.toolkit.Lztek
 import com.rc.core.ui.activity.BaseActivity
 import com.rc.httpcore.HttpClient
@@ -53,9 +60,11 @@ import xn.hxp.utils.RelativeLayoutDebouncer
 import xn.hxp.utils.SharedPreferencesHelper
 import xn.hxp.utils.TimeUpdater
 import xn.hxp.utils.UiManager
+import xn.hxp.utils.bluetooth.BleTool
 import xn.hxp.weidith.CustomDialog
 import java.net.ConnectException
 import java.net.SocketTimeoutException
+import java.util.UUID
 
 //首页 -  登录or 未登录
 public class MainActivity : BaseActivity() {
@@ -162,7 +171,8 @@ public class MainActivity : BaseActivity() {
                         }
 
                         if (input == pwd) {
-//                            UiManager.switcher(this, SettingActivity::class.java)
+                            ActivityUtils.startActivity(SettingActivity::class.java)
+                            finish()
                         } else {
                             showToast("密码错误")
                         }
@@ -175,6 +185,12 @@ public class MainActivity : BaseActivity() {
                 }
             }
         }
+        viewBinding.inc.bleIV.visibility = View.VISIBLE
+        val bleKey = SPUtils.getInstance().getString("bleKey", "")
+        if (null == bleKey || TextUtils.isEmpty(bleKey)) {
+            viewBinding.inc.bleIV.setBackgroundResource(R.drawable.ic_ble_unconnected)
+            PopTip.show("未配置蓝牙称设备!").showLong()
+        }
     }
 
     //获取刷卡信息

+ 113 - 0
app/src/main/java/xn/hxp/ui/SettingActivity.java

@@ -0,0 +1,113 @@
+package xn.hxp.ui;
+
+import android.text.Editable;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.viewbinding.ViewBinding;
+
+import com.blankj.utilcode.util.AppUtils;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.NetworkUtils;
+import com.blankj.utilcode.util.SPUtils;
+import com.blankj.utilcode.util.ToastUtils;
+import com.kongzue.dialogx.dialogs.PopTip;
+import com.kongzue.dialogx.dialogs.WaitDialog;
+import com.rc.core.ui.activity.BaseActivity;
+
+import xn.hxp.databinding.ActivitySettingBinding;
+import xn.hxp.utils.SharedPreferencesHelper;
+import xn.hxp.utils.Tool;
+import xn.hxp.weidith.ble.BleSelectorDialog;
+
+public class SettingActivity extends BaseActivity {
+
+    private ActivitySettingBinding binding;
+
+    @Override
+    protected ViewBinding setViewBinding() {
+        return binding = ActivitySettingBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void onInit() {
+        binding.varBT.setText("版本:" + AppUtils.getAppVersionName());
+        binding.snBT.setText("SN:" + Tool.INSTANCE.getSerialNumber());
+        binding.ipBT.setText(NetworkUtils.getIPAddress(true));
+        binding.rebootBT.setOnClickListener(v -> Tool.INSTANCE.cmd("reboot"));
+        binding.fileBrowserBT.setOnClickListener(v -> Tool.INSTANCE.openFileBrowser());
+        binding.settingBT.setOnClickListener(v -> Tool.INSTANCE.openSetting());
+        binding.barSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> Tool.INSTANCE.showBar(isChecked));
+        binding.httpUriET.setText(Tool.INSTANCE.getBaseUrl().toString());
+        binding.bleTV.setText(SPUtils.getInstance().getString("bleKey", ""));
+        // 前同事代码
+        SettingsBean settingsBean = SharedPreferencesHelper.INSTANCE.getUrlBase(this);
+        if (null != settingsBean) {
+            String cameraSelector = settingsBean.getD();
+            // 后置相机
+            if ("1".equals(cameraSelector)) {
+                binding.cameraRG.check(binding.backRB.getId());
+            }
+            // 默认前置相机
+            else {
+                binding.cameraRG.check(binding.frontRB.getId());
+            }
+            // 管理员密码
+            binding.oldPasswordET.setText(settingsBean.getPwd());
+        }
+        // 测试地址输入
+        binding.httpUriTestBT.setOnClickListener(v -> binding.httpUriET.setText("http://192.168.1.8/api/"));
+        // 西农地址输入
+        binding.httpUriXnBT.setOnClickListener(v -> binding.httpUriET.setText("http://172.16.0.65/api/"));
+        // 蓝牙配置
+        binding.bleTV.setOnClickListener(v -> {
+            BleSelectorDialog bleSelectorDialog = new BleSelectorDialog(SettingActivity.this);
+            bleSelectorDialog.setOnDismissListener(dialog -> binding.bleTV.setText(SPUtils.getInstance().getString("bleKey", "")));
+            bleSelectorDialog.show();
+        });
+        // 保存
+        binding.save.setOnClickListener(v -> save());
+
+    }
+
+    @Override
+    public void onBackPressed() {
+    }
+
+    private void save() {
+        try {
+            Editable httpUriETText = binding.httpUriET.getText();
+            if (null == httpUriETText || TextUtils.isEmpty(httpUriETText)) {
+                binding.httpUriET.setError("请输入Http服务地址");
+                return;
+            }
+            Editable oldPasswordETText = binding.oldPasswordET.getText();
+            if (null == oldPasswordETText || TextUtils.isEmpty(oldPasswordETText)) {
+                binding.oldPasswordET.setError("请输入管理员密码");
+                return;
+            }
+            CharSequence bleTVText = binding.bleTV.getText();
+            if (null == bleTVText || TextUtils.isEmpty(bleTVText)) {
+                PopTip.show("请配置蓝牙称设备");
+                return;
+            }
+            SPUtils.getInstance().put("cameraSelector", binding.backRB.isChecked() ? 1 : 0);
+            SharedPreferencesHelper.INSTANCE.saveUrlBase(this, new SettingsBean(httpUriETText.toString(), httpUriETText.toString(), httpUriETText.toString(), binding.backRB.isChecked() ? "1" : "0", oldPasswordETText.toString()));
+            WaitDialog.show("稍后重启App");
+            binding.backRB.postDelayed(() -> AppUtils.relaunchApp(true), 1500);
+        } catch (Exception e) {
+            ToastUtils.showLong("参数异常无法保存,请核对参数!");
+            LogUtils.e(Log.getStackTraceString(e));
+        }
+    }
+
+    @Override
+    protected void cdFinish() {
+
+    }
+
+    @Override
+    protected void cdTime(int cd) {
+
+    }
+}

+ 0 - 73
app/src/main/java/xn/hxp/ui/SettingActivity.kt

@@ -1,73 +0,0 @@
-//package xn.hxp.ui
-//
-//
-//import android.content.Intent
-//import android.os.Bundle
-//import android.provider.Settings
-//import android.view.LayoutInflater
-//import com.blankj.utilcode.util.ActivityUtils
-//import com.blankj.utilcode.util.GsonUtils
-//import xn.hxp.comm.Constants
-//import xn.hxp.databinding.ActivitySettingBinding
-//import xn.hxp.utils.SharedPreferencesHelper
-//import xn.hxp.utils.UiManager
-//import com.lztek.toolkit.Lztek
-//import com.blankj.utilcode.util.LogUtils
-//import com.rc.httpcore.HttpConfig
-//
-//class SettingActivity : RcBaseActivity<ActivitySettingBinding>() {
-//
-//    private val REQUEST_ENABLE_BT = 1
-//    private var mLztek: Lztek? = null
-//    private var mDeviceNum: String? = null  //设备唯一标识
-//    override fun createViewBinding() = ActivitySettingBinding.inflate(LayoutInflater.from(this))
-//
-//    override fun initViews(savedInstanceState: Bundle?) {
-//        super.initViews(savedInstanceState)
-//        try {
-//            mLztek = Lztek.create(this)
-//            val toUpperCase = mLztek!!.ethMac.toUpperCase()
-//            mDeviceNum = toUpperCase.replace(":", "")
-//            viewBinding.baNo.text = "$mDeviceNum"
-//        } catch (e: Exception) {
-//            showToast("设备编码异常")
-//        }
-//        viewBinding.apiBaseUrl.setText("${HttpConfig.API_BASE_URL}")
-//        viewBinding.apiBaseImgUrl.setText("${HttpConfig.API_BASE_IMG_URL}")
-//        viewBinding.apiBaseQcUrl.setText("${HttpConfig.API_BASE_QC_URL}")
-//        viewBinding.cameraType.setText("${Constants.FACE_TAG}")
-//        try {
-//            val urlBase = SharedPreferencesHelper.getUrlBase(this)
-//            if (urlBase != null) {
-//                viewBinding.apiBaseUrl.setText("${urlBase.a}")
-//                viewBinding.apiBaseImgUrl.setText("${urlBase.b}")
-//                viewBinding.apiBaseQcUrl.setText("${urlBase.c}")
-//                viewBinding.cameraType.setText("${urlBase.d}")
-//            }
-//        } catch (e: Exception) {
-//        }
-//        viewBinding.determine.setOnClickListener {
-//            val a = viewBinding.apiBaseUrl.text.toString()    //api
-//            val b = viewBinding.apiBaseImgUrl.text.toString() //文件图片地址
-//            val c = viewBinding.apiBaseQcUrl.text.toString()  //二维码打印地址
-//            val d = viewBinding.cameraType.text.toString()  //摄像头 前后置
-//            val e = viewBinding.pwd.text.toString()// 工程密码
-//            if (a == null || b == null || c == null || d == null || e == null) {
-//                showToast("配置信息不能为空")
-//                return@setOnClickListener
-//            }
-//            val settingsBean = SettingsBean(a, b, c, "$d", e)
-//            LogUtils.i("======本地数据 $d")
-//            SharedPreferencesHelper.saveUrlBase(this, settingsBean)
-//            ActivityUtils.startActivity(SplashActivity::class.java)
-//            finish()
-//        }
-//
-//        viewBinding.blu.setOnClickListener {
-//
-//            val intent = Intent(Settings.ACTION_SETTINGS)
-//            startActivity(intent)
-//        }
-//    }
-//
-//}

+ 7 - 0
app/src/main/java/xn/hxp/ui/SettingsBean.kt

@@ -1,3 +1,10 @@
 package xn.hxp.ui
 
+/**
+ * a:baseApi
+ * b:fileHttp
+ * c:qrHttp
+ * d:CameraSelector
+ * e:password
+ */
 data class SettingsBean(var a: String, var b: String, var c: String, var d: String,var pwd:String?)

+ 33 - 5
app/src/main/java/xn/hxp/ui/StartActivity.java

@@ -23,6 +23,7 @@ import com.rc.httpcore.client.HttpTool;
 
 import org.json.JSONObject;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -35,6 +36,7 @@ import xn.hxp.utils.SharedPreferencesHelper;
 
 public class StartActivity extends BaseActivity {
     private ActivityStartBinding binding;
+    private ThreadUtils.SimpleTask<LabInfo> checkTask;
 
     private int reTry = 0;
 
@@ -98,16 +100,18 @@ public class StartActivity extends BaseActivity {
         binding.version.setText(AppUtils.getAppVersionName());
 
         // 进去设置页面
-        binding.logo.setOnClickListener(new View.OnClickListener() {
+        binding.logo.setOnLongClickListener(new View.OnLongClickListener() {
             @Override
-            public void onClick(View v) {
-
+            public boolean onLongClick(View v) {
+                ActivityUtils.startActivity(SettingActivity.class);
+                finish();
+                return true;
             }
         });
 
         unreasonableCode();
 
-        ThreadUtils.executeByCachedAtFixRate(new ThreadUtils.SimpleTask<LabInfo>() {
+        checkTask = new ThreadUtils.SimpleTask<LabInfo>() {
             @Override
             public LabInfo doInBackground() throws Throwable {
                 boolean isAvailableByPing = NetworkUtils.isAvailableByPing(HttpUrl.get(HttpConfig.Companion.getAPI_BASE_URL()).host());
@@ -150,7 +154,8 @@ public class StartActivity extends BaseActivity {
                 super.onFail(t);
                 reTry();
             }
-        }, 20, TimeUnit.SECONDS);
+        };
+        ThreadUtils.executeByCachedAtFixRate(checkTask, 20, TimeUnit.SECONDS);
     }
 
     private void reTry() {
@@ -174,4 +179,27 @@ public class StartActivity extends BaseActivity {
         }
     }
 
+    public List<String> splitStringIntoChunks(String inputString, int chunkSize) {
+        if (chunkSize <= 0) {
+            throw new IllegalArgumentException("Chunk size must be greater than 0");
+        }
+
+        List<String> result = new ArrayList<>();
+        int startIndex = 0;
+
+        while (startIndex < inputString.length()) {
+            int endIndex = Math.min(startIndex + chunkSize, inputString.length());
+            String chunk = inputString.substring(startIndex, endIndex);
+            result.add(chunk);
+            startIndex = endIndex;
+        }
+
+        return result;
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        ThreadUtils.cancel(checkTask);
+    }
 }

+ 1 - 1
app/src/main/java/xn/hxp/ui/plan/add/AddActivityHelp.java

@@ -26,7 +26,7 @@ import io.reactivex.rxjava3.functions.Consumer;
 import okhttp3.Response;
 import xn.hxp.ui.plan.room.bean.input_add.HxpChemical;
 import xn.hxp.weidith.BelongingPersonDialog;
-import xn.hxp.weidith.BluetoothWeighDialog;
+import xn.hxp.weidith.ble.BluetoothWeighDialog;
 import xn.hxp.weidith.SelectChemicalDialog;
 import xn.hxp.weidith.SelectTopicDialog;
 import xn.hxp.weidith.prin_label_dialog.PrintLabelDialog;

+ 20 - 116
app/src/main/java/xn/hxp/ui/still/ChemicalsAlsoActivity.kt

@@ -38,7 +38,6 @@ import org.greenrobot.eventbus.ThreadMode
 import retrofit2.HttpException
 import xn.hxp.R
 import xn.hxp.app.ChemicalApp
-import xn.hxp.blu.BluetoothConnectionManager
 import xn.hxp.comm.Constants
 import xn.hxp.databinding.ActivityChemicalsAlsoBinding
 import xn.hxp.receiver.OnSerialScanListener
@@ -48,8 +47,7 @@ import xn.hxp.ui.PrintBean
 import xn.hxp.ui.adapter.ReturningChemicalsAdapter
 import xn.hxp.ui.verify.TwoVerificationActivity
 import xn.hxp.utils.*
-import xn.hxp.utils.bluetooth.BluetoothTool
-import xn.hxp.utils.bluetooth.BluetoothTool.BluetoothCallBack
+import xn.hxp.utils.bluetooth.BleTool
 import xn.hxp.weidith.*
 import java.lang.Runnable
 import java.net.ConnectException
@@ -689,6 +687,9 @@ class ChemicalsAlsoActivity : BaseActivity() {
 
                     //确定 关闭  获取文本值 跳转新的页面
                     override fun viewCloses() {
+                        BleTool.INSTANCE.setBleCallback(null)
+                        BleTool.INSTANCE.disconnect()
+                        closEnd()
                         closEndTwo()
                         try {
                             lifecycleScope.cancel()
@@ -735,87 +736,24 @@ class ChemicalsAlsoActivity : BaseActivity() {
 
     private fun connectToDeviceWithTimeout() {
         showToast("连接中...", Toast.LENGTH_SHORT)
-        lifecycleScope.launch {
-            val deviceAddress = withContext(Dispatchers.IO) {
-                BluetoothConnectionManager.getDeviceAddress()
+        BleTool.INSTANCE.setBleCallback(object : BleTool.BleCallback {
+            override fun onSuccess() {
+                AudioPlayer.getInstance().play(R.raw.qing_zheng_zhong)
             }
-            if (deviceAddress != null) {
-                val socket = withContext(Dispatchers.IO) {
-                    BluetoothConnectionManager.connectToDevice(deviceAddress)
-                }
-                if (socket != null) {
-                    // 连接成功后的处理逻辑
-                    // 在这里使用返回的 BluetoothSocket 对象进行后续操作
-                    AudioPlayer.getInstance().play(R.raw.qing_zheng_zhong)
-                    // 连接成功后的处理逻辑
-                    withContext(Dispatchers.Main) {
-                        do {
-//                            try {
-                            val inputStream = socket!!.inputStream
-                            val bt = ByteArray(1024)
-                            val content = inputStream!!.read(bt)
-                            if (content != null && content > 0) {
-                                val contents = String(
-                                    bt,
-                                    0,
-                                    content,
-                                    StandardCharsets.UTF_8
-                                )
-                                val split = contents.split("\n")
-                                val weight = split[0].trim()
-                                LogUtils.i("===================称重未处理之前=======$contents")
-                                LogUtils.i("===================weight=======$weight")
-                                LogUtils.i("=====称重数据$weight $taskStarted  ${mWeighingValue!!.text.toString()}")
-                                if (weight.toDouble() > 2999) {
-                                    turnOffWeighing()
-                                } else {
-                                    if (weight.toDouble() > 0) {
-                                        if (mWeighingValue!!.text.toString().trim()
-                                                .isNotEmpty()
-                                        ) {
-                                            if (weight.toDouble() == mWeighingValue!!.text.toString()
-                                                    .trim().toDouble()
-                                            ) {
-                                                if (taskStarted == false) {
-                                                    taskStarted = true
-                                                    LogUtils.i("=====执行了")
-                                                    socket.close()
-                                                    delayedTaskToUpdateUI()
-                                                    break
-                                                }
-                                            }
-                                        }
-                                        mWeighingValue!!.setText("$weight")
-                                    } else {
-                                        mWeighingValue!!.setText("")
-                                    }
-                                }
-                                delay(200)
-                            } else {
-//                                jobTow?.cancel()
-                                showToast("请手动输入")
-                                weiView()
-                                break
-                            }
-//                            } catch (e: Exception) {
-//                                jobTow?.cancel()
-//                                weiView()
-//                                break
-//                            }
-                        } while (mWeighDialog != null && mWeighDialog!!.isShowing)
-                    }
 
-                } else {
-                    // 连接失败的处理逻辑
-                    showToast("连接失败或超时", Toast.LENGTH_SHORT)
+            override fun onNotifyFailure(exception: java.lang.Exception?) {
+            }
+
+            override fun onChanged(weight: String) {
+                if (weight.isEmpty()) {
+                    showToast("请手动输入")
                     weiView()
+                } else {
+                    mWeighingValue!!.setText("$weight")
                 }
-            } else {
-                // 根据设备名称获取的设备地址为空,处理无法找到设备的情况
-                showToast("找不到设备", Toast.LENGTH_SHORT)
-                weiView()
             }
-        }
+        })
+        BleTool.INSTANCE.connect()
     }
 
     private fun showToast(message: String, duration: Int) {
@@ -833,42 +771,6 @@ class ChemicalsAlsoActivity : BaseActivity() {
         }
     }
 
-    var taskStarted = false
-
-    // 声明一个全局的 Handler 变量
-    private var mHandlerTime: Handler? = null
-
-    // 在需要执行任务的地方调用这个函数
-    private fun delayedTaskToUpdateUI() {
-        // 初始化 Handler,并关联到主线程 Looper
-        mHandlerTime = Handler(Looper.getMainLooper())
-
-        // 定义一个延迟执行的任务
-        val updateUITask = Runnable {
-            LogUtils.i("=====执行了")
-            // 在这里执行更新 UI 的操作
-            // 例如,更新 TextView 的文本
-            // textView.text = "Updated text"
-            closEnd()
-            taskStarted = false
-            // 执行完更新操作后,可以关闭 Handler
-            mHandlerTime?.removeCallbacksAndMessages(null)
-            mHandlerTime = null
-        }
-        // 延迟 3 秒执行任务
-        mHandlerTime?.postDelayed(updateUITask, 3300)
-    }
-
-
-    //超过量程
-    private fun turnOffWeighing() {
-        showToast("超过量程,手动输入")
-        mJoinType = 2
-        mWeighingValue!!.isEnabled = true
-//        jobTow?.cancel()
-
-    }
-
     private fun closEnd() {
 //        jobTow?.cancel()
 
@@ -1431,7 +1333,7 @@ class ChemicalsAlsoActivity : BaseActivity() {
     //刷卡信息  调用当前化学品信息 进行归还
     private fun handleScanEvent(cont: String) {
         showLoading("查询中...")
-        val disposable = ApiRepository.backDetail(cont)
+        val disposable = ApiRepository.backDetail(cont, ChemicalApp.subjectId.toString())
             .subscribe({ data ->
                 dismissLoading()
                 mDataBean = data
@@ -1529,6 +1431,8 @@ class ChemicalsAlsoActivity : BaseActivity() {
 
     override fun onDestroy() {
         super.onDestroy()
+        BleTool.INSTANCE.setBleCallback(null)
+        BleTool.INSTANCE.disconnect()
         mPortScanHelper.onPause()
         try {
 //            jobTow?.cancel()

+ 37 - 115
app/src/main/java/xn/hxp/ui/uses/UseActivity.kt

@@ -1,11 +1,9 @@
 package xn.hxp.ui.uses
 
-import android.os.Bundle
 import android.os.CountDownTimer
 import android.os.Handler
 import android.os.Looper
 import android.view.KeyEvent
-import android.view.LayoutInflater
 import android.view.View
 import android.widget.EditText
 import android.widget.Toast
@@ -13,12 +11,22 @@ import androidx.core.content.ContextCompat
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.viewbinding.ViewBinding
+import com.blankj.utilcode.util.LogUtils
 import com.bumptech.glide.Glide
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import com.bumptech.glide.request.RequestOptions
-import xn.hxp.app.ChemicalApp
+import com.rc.core.ui.activity.BaseActivity
+import com.rc.httpcore.HttpConfig
+import com.rc.httpcore.bean.ChemistryBean
+import com.rc.httpcore.bean.LockVoListBean
+import com.rc.httpcore.bean.TimeWarBean
+import com.rc.httpcore.bean.UseBean
+import com.rc.httpcore.bean.UsePostDataBean
+import com.rc.httpcore.client.ApiRepository
+import com.rc.httpcore.client.HttpTool
+import kotlinx.coroutines.cancel
 import xn.hxp.R
-import xn.hxp.blu.BluetoothConnectionManager
+import xn.hxp.app.ChemicalApp
 import xn.hxp.comm.Constants
 import xn.hxp.databinding.ActivityUseBinding
 import xn.hxp.ui.adapter.CabinetDoorAdapter
@@ -26,22 +34,18 @@ import xn.hxp.ui.adapter.CabinetDoorRighAdapter
 import xn.hxp.ui.adapter.UsageLabelDialogAdapter
 import xn.hxp.ui.adapter.UseListAdapter
 import xn.hxp.ui.verify.TwoVerificationActivity
-import xn.hxp.utils.*
+import xn.hxp.utils.AudioPlayer
+import xn.hxp.utils.BigDecimalUtils
+import xn.hxp.utils.HandlerUtil
+import xn.hxp.utils.SharedPreferencesHelper
+import xn.hxp.utils.TimeUpdater
+import xn.hxp.utils.UiManager
+import xn.hxp.utils.bluetooth.BleTool
 import xn.hxp.weidith.CustomDialog
 import xn.hxp.weidith.StorageDialog
 import xn.hxp.weidith.UsageLabelDialog
 import xn.hxp.weidith.WeighDialog
-import com.blankj.utilcode.util.LogUtils
-import com.rc.core.ui.activity.BaseActivity
-import com.rc.httpcore.HttpClient
-import com.rc.httpcore.HttpConfig
-import com.rc.httpcore.bean.*
-import com.rc.httpcore.client.ApiRepository
-import com.rc.httpcore.client.HttpTool
-import kotlinx.coroutines.*
-import java.lang.Runnable
 import java.math.BigDecimal
-import java.nio.charset.StandardCharsets
 
 //化学品 领用
 class UseActivity : BaseActivity() {
@@ -491,6 +495,9 @@ class UseActivity : BaseActivity() {
                 }
 
                 override fun viewCloses() {
+                    BleTool.INSTANCE.setBleCallback(null)
+                    BleTool.INSTANCE.disconnect()
+                    closEnd()
                     closEndTwo()
                     try {
                         lifecycleScope.cancel()
@@ -538,87 +545,24 @@ class UseActivity : BaseActivity() {
 
     private fun connectToDeviceWithTimeout() {
         showToast("连接中...", Toast.LENGTH_SHORT)
-        lifecycleScope.launch {
-            val deviceAddress = withContext(Dispatchers.IO) {
-                BluetoothConnectionManager.getDeviceAddress()
+        BleTool.INSTANCE.setBleCallback(object : BleTool.BleCallback {
+            override fun onSuccess() {
+                AudioPlayer.getInstance().play(R.raw.qing_zheng_zhong)
             }
-            if (deviceAddress != null) {
-                val socket = withContext(Dispatchers.IO) {
-                    BluetoothConnectionManager.connectToDevice(deviceAddress)
-                }
-                if (socket != null) {
-                    // 连接成功后的处理逻辑
-                    // 在这里使用返回的 BluetoothSocket 对象进行后续操作
-                    AudioPlayer.getInstance().play(R.raw.qing_zheng_zhong)
-                    // 连接成功后的处理逻辑
-                    withContext(Dispatchers.Main) {
-                        do {
-//                            try {
-                            val inputStream = socket!!.inputStream
-                            val bt = ByteArray(1024)
-                            val content = inputStream!!.read(bt)
-                            if (content != null && content > 0) {
-                                val contents = String(
-                                    bt,
-                                    0,
-                                    content,
-                                    StandardCharsets.UTF_8
-                                )
-                                val split = contents.split("\n")
-                                val weight = split[0].trim()
-                                LogUtils.i("===================称重未处理之前=======$contents")
-                                LogUtils.i("===================weight=======$weight")
-                                LogUtils.i("=====称重数据$weight $taskStarted  ${mWeighingValue!!.text.toString()}")
-                                if (weight.toDouble() > 2999) {
-                                    turnOffWeighing()
-                                } else {
-                                    if (weight.toDouble() > 0) {
-                                        if (mWeighingValue!!.text.toString().trim()
-                                                .isNotEmpty()
-                                        ) {
-                                            if (weight.toDouble() == mWeighingValue!!.text.toString()
-                                                    .trim().toDouble()
-                                            ) {
-                                                if (taskStarted == false) {
-                                                    taskStarted = true
-                                                    LogUtils.i("=====执行了")
-                                                    socket.close()
-                                                    delayedTaskToUpdateUI()
-                                                    break
-                                                }
-                                            }
-                                        }
-                                        mWeighingValue!!.setText("$weight")
-                                    } else {
-                                        mWeighingValue!!.setText("")
-                                    }
-                                }
-                                delay(200)
-                            } else {
-//                                jobTow?.cancel()
-                                showToast("请手动输入")
-                                weiView()
-                                break
-                            }
-//                            } catch (e: Exception) {
-//                                jobTow?.cancel()
-//                                weiView()
-//                                break
-//                            }
-                        } while (mWeighDialog != null && mWeighDialog!!.isShowing)
-                    }
 
-                } else {
-                    // 连接失败的处理逻辑
-                    showToast("连接失败或超时", Toast.LENGTH_SHORT)
+            override fun onNotifyFailure(exception: java.lang.Exception?) {
+            }
+
+            override fun onChanged(weight: String) {
+                if (weight.isEmpty()) {
+                    showToast("请手动输入")
                     weiView()
+                } else {
+                    mWeighingValue!!.setText("$weight")
                 }
-            } else {
-                // 根据设备名称获取的设备地址为空,处理无法找到设备的情况
-                showToast("找不到设备", Toast.LENGTH_SHORT)
-                weiView()
             }
-        }
+        })
+        BleTool.INSTANCE.connect()
     }
 
     private fun showToast(message: String, duration: Int) {
@@ -719,30 +663,6 @@ class UseActivity : BaseActivity() {
 
     var taskStarted = false
 
-    // 声明一个全局的 Handler 变量
-    private var mHandlerTime: Handler? = null
-
-    // 在需要执行任务的地方调用这个函数
-    private fun delayedTaskToUpdateUI() {
-        // 初始化 Handler,并关联到主线程 Looper
-        mHandlerTime = Handler(Looper.getMainLooper())
-
-        // 定义一个延迟执行的任务
-        val updateUITask = Runnable {
-            LogUtils.i("=====执行了")
-            // 在这里执行更新 UI 的操作
-            // 例如,更新 TextView 的文本
-            // textView.text = "Updated text"
-            closEnd()
-            taskStarted = false
-            // 执行完更新操作后,可以关闭 Handler
-            mHandlerTime?.removeCallbacksAndMessages(null)
-            mHandlerTime = null
-        }
-        // 延迟 3 秒执行任务
-        mHandlerTime?.postDelayed(updateUITask, 3300)
-    }
-
     //超过量程
     private fun turnOffWeighing() {
         showToast("超过量程,手动输入")
@@ -1326,6 +1246,8 @@ class UseActivity : BaseActivity() {
 
     override fun onDestroy() {
         super.onDestroy()
+        BleTool.INSTANCE.setBleCallback(null)
+        BleTool.INSTANCE.disconnect()
 //        jobTow?.cancel()
         try {
             handlerUtil.stopAllTasks()

+ 7 - 1
app/src/main/java/xn/hxp/ui/verify/include/FaceDetectView.java

@@ -21,6 +21,7 @@ import com.blankj.utilcode.util.FileUtils;
 import com.blankj.utilcode.util.GsonUtils;
 import com.blankj.utilcode.util.ImageUtils;
 import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.SPUtils;
 import com.blankj.utilcode.util.ThreadUtils;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.mlkit.vision.face.FaceDetection;
@@ -109,7 +110,12 @@ public class FaceDetectView extends RelativeLayout {
                     photoFile = new File(facePicPath, "face.jpg");
                     outputFileOptions = new ImageCapture.OutputFileOptions.Builder(photoFile).build();
                     // 选择摄像头
-                    CameraSelector cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA;
+                    CameraSelector cameraSelector;
+                    if (0 == SPUtils.getInstance().getInt("cameraSelector", 0)) {
+                        cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA;
+                    } else {
+                        cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
+                    }
                     // 解绑之前的用例
                     cameraProvider.unbindAll();
                     // 绑定用例到相机

Diferenças do arquivo suprimidas por serem muito extensas
+ 1489 - 1537
app/src/main/java/xn/hxp/ui/warehousing/WarehousingActivity.kt


+ 5 - 5
app/src/main/java/xn/hxp/utils/Tool.java

@@ -41,7 +41,7 @@ public enum Tool {
     }
 
     public void openSetting() {
-        openApp("display.interactive.hsetting");
+        openApp("com.android.settings");
     }
 
     public void openApp(String packageName) {
@@ -52,10 +52,6 @@ public enum Tool {
         cmd("settings put global bluetooth_on " + (isEnable ? "1" : "0"));
     }
 
-    public void openAdb() {
-        cmd("setprop persist.internet_adb_enable 1");
-    }
-
     public ShellUtils.CommandResult stopApp(String packageName) {
         return ShellUtils.execCmd("am force-stop " + packageName, true);
     }
@@ -85,6 +81,10 @@ public enum Tool {
         }
     }
 
+    public void showBar(boolean isShow) {
+        lztek.navigationBarSlideShow(isShow);
+    }
+
     public String checkUrl(String url) {
         try {
             String uriStr = url;

+ 199 - 0
app/src/main/java/xn/hxp/utils/bluetooth/BleTool.java

@@ -0,0 +1,199 @@
+package xn.hxp.utils.bluetooth;
+
+import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattService;
+import android.util.Log;
+
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.SPUtils;
+import com.clj.fastble.BleManager;
+import com.clj.fastble.callback.BleGattCallback;
+import com.clj.fastble.callback.BleNotifyCallback;
+import com.clj.fastble.callback.BleScanCallback;
+import com.clj.fastble.data.BleDevice;
+import com.clj.fastble.data.BleScanState;
+import com.clj.fastble.exception.BleException;
+import com.clj.fastble.scan.BleScanRuleConfig;
+
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+public enum BleTool {
+    INSTANCE;
+
+    private final String SERVICE_UUID = "0000fff0-0000-1000-8000-00805f9b34fb";
+    private final String CHARACTERISTIC_UUID = "0000fff1-0000-1000-8000-00805f9b34fb";
+
+    private BleScanCallback bleScanCallback;
+    private BleCallback bleCallback;
+    private BleDevice bleDevice;
+    private BleNotifyCallback bleNotifyCallback;
+
+    public interface BleCallback {
+        void onSuccess();
+
+        void onNotifyFailure(Exception exception);
+
+        void onChanged(String data);
+    }
+
+    public void setBleCallback(BleCallback bleCallback) {
+        this.bleCallback = bleCallback;
+    }
+
+    public void connect() {
+        if (BleManager.getInstance().getScanSate() != BleScanState.STATE_SCANNING) {
+            BleManager.getInstance().disconnectAllDevice();
+            BleScanRuleConfig bleScanRuleConfig = new BleScanRuleConfig.Builder().setScanTimeOut(1000).build();
+            BleManager.getInstance().initScanRule(bleScanRuleConfig);
+            if (null == bleScanCallback) {
+                bleScanCallback = new BleScanCallback() {
+                    @Override
+                    public void onScanFinished(List<BleDevice> scanResultList) {
+                        try {
+                            String bleMac = SPUtils.getInstance().getString("bleMac", "");
+                            for (int i = 0; i < scanResultList.size(); i++) {
+                                BleDevice bleDevice = scanResultList.get(i);
+                                if (bleDevice.getMac().equals(bleMac)) {
+                                    BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
+                                        @Override
+                                        public void onStartConnect() {
+                                            LogUtils.e("开始连接", bleDevice.getName(), bleDevice.getMac());
+                                        }
+
+                                        @Override
+                                        public void onConnectFail(BleDevice bleDevice, BleException exception) {
+                                            LogUtils.e(bleDevice.getMac(), bleDevice.getName(), exception.getDescription());
+                                            if (null != bleCallback) {
+                                                bleCallback.onNotifyFailure(new Exception(exception.getDescription()));
+                                            }
+                                        }
+
+                                        @Override
+                                        public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
+                                            BleTool.INSTANCE.bleDevice = bleDevice;
+                                            LogUtils.d("连接成功", bleDevice.getName(), bleDevice.getMac());
+                                            if (null != gatt) {
+                                                List<BluetoothGattService> bluetoothGattServiceList = gatt.getServices();
+                                                if (null != bluetoothGattServiceList) {
+                                                    BluetoothGattService bluetoothGattService = null;
+                                                    for (int i = 0; i < bluetoothGattServiceList.size(); i++) {
+                                                        BluetoothGattService gattService = bluetoothGattServiceList.get(i);
+                                                        if (SERVICE_UUID.equals(gattService.getUuid().toString())) {
+                                                            bluetoothGattService = gattService;
+                                                            break;
+                                                        }
+                                                    }
+                                                    if (null != bluetoothGattService) {
+                                                        List<BluetoothGattCharacteristic> bluetoothGattCharacteristicList = bluetoothGattService.getCharacteristics();
+                                                        if (null != bluetoothGattCharacteristicList) {
+                                                            BluetoothGattCharacteristic bluetoothGattCharacteristic = null;
+                                                            for (int i = 0; i < bluetoothGattCharacteristicList.size(); i++) {
+                                                                BluetoothGattCharacteristic gattCharacteristic = bluetoothGattCharacteristicList.get(i);
+                                                                if (null != gattCharacteristic) {
+                                                                    if (CHARACTERISTIC_UUID.equals(gattCharacteristic.getUuid().toString())) {
+                                                                        bluetoothGattCharacteristic = gattCharacteristic;
+                                                                        break;
+                                                                    }
+                                                                }
+                                                            }
+
+                                                            if (bluetoothGattCharacteristic != null) {
+                                                                if (null == bleNotifyCallback) {
+                                                                    bleNotifyCallback = new BleNotifyCallback() {
+                                                                        @Override
+                                                                        public void onNotifySuccess() {
+                                                                            if (null != bleCallback) {
+
+                                                                                bleCallback.onSuccess();
+                                                                            }
+                                                                            LogUtils.d("订阅成功");
+                                                                        }
+
+                                                                        @Override
+                                                                        public void onNotifyFailure(BleException exception) {
+                                                                            if (null != bleCallback) {
+                                                                                bleCallback.onNotifyFailure(new Exception(exception.getDescription()));
+                                                                            }
+                                                                            LogUtils.e("订阅失败", exception);
+                                                                        }
+
+                                                                        @Override
+                                                                        public void onCharacteristicChanged(byte[] data) {
+                                                                            if (null != bleCallback) {
+                                                                                String string = new String(data, StandardCharsets.UTF_8);
+                                                                                String[] split = string.split("\n", -1);
+                                                                                LogUtils.d("处理前的蓝牙数据", data, split);
+                                                                                if (split.length > 0) {
+                                                                                    String line = split[0].trim();
+                                                                                    bleCallback.onChanged(line);
+                                                                                }
+                                                                            }
+                                                                        }
+                                                                    };
+                                                                }
+                                                                BleManager.getInstance().notify(bleDevice, SERVICE_UUID, CHARACTERISTIC_UUID, bleNotifyCallback);
+                                                            } else {
+                                                                if (null != bleCallback) {
+                                                                    bleCallback.onNotifyFailure(new Exception("ble_gatt_service is not found"));
+                                                                }
+                                                            }
+                                                        } else {
+                                                            if (null != bleCallback) {
+                                                                bleCallback.onNotifyFailure(new Exception("ble_gatt_service is null"));
+                                                            }
+                                                        }
+                                                    } else {
+                                                        if (null != bleCallback) {
+                                                            bleCallback.onNotifyFailure(new Exception("ble_gatt_service is not found"));
+                                                        }
+                                                    }
+                                                } else {
+                                                    if (null != bleCallback) {
+                                                        bleCallback.onNotifyFailure(new Exception("ble_service is null"));
+                                                    }
+                                                }
+                                            }
+                                        }
+
+                                        @Override
+                                        public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
+                                            LogUtils.e(isActiveDisConnected, device.getMac(), device.getName(), status);
+                                        }
+                                    });
+                                    break;
+                                }
+                            }
+                        } catch (Exception e) {
+                            LogUtils.e(Log.getStackTraceString(e));
+                            if (null != bleCallback) {
+                                bleCallback.onNotifyFailure(e);
+                            }
+                        }
+                    }
+
+                    @Override
+                    public void onScanStarted(boolean success) {
+
+                    }
+
+                    @Override
+                    public void onScanning(BleDevice bleDevice) {
+
+                    }
+                };
+            }
+            BleManager.getInstance().scan(bleScanCallback);
+        }
+    }
+
+    public void disconnect() {
+        try {
+            BleManager.getInstance().removeNotifyCallback(bleDevice, CHARACTERISTIC_UUID);
+        } catch (Exception e) {
+            LogUtils.e(Log.getStackTraceString(e));
+        }
+        BleManager.getInstance().disconnectAllDevice();
+    }
+}

+ 112 - 112
app/src/main/java/xn/hxp/utils/bluetooth/BluetoothTool.java

@@ -1,112 +1,112 @@
-package xn.hxp.utils.bluetooth;
-
-import android.annotation.SuppressLint;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothSocket;
-import android.util.Log;
-
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.Utils;
-
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Set;
-import java.util.UUID;
-
-import xn.hxp.utils.Tool;
-
-public enum BluetoothTool {
-    INSTANCE;
-    BluetoothAdapter bluetoothAdapter;
-    private UUID uuid;
-    private byte[] buffer = new byte[1024];
-    private BluetoothDevice bluetoothDevice;
-    private BluetoothSocket bluetoothSocket;
-    private InputStream inputStream;
-
-    private BluetoothTool() {
-        uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
-        BluetoothManager bluetoothManager = Utils.getApp().getSystemService(BluetoothManager.class);
-        bluetoothAdapter = bluetoothManager.getAdapter();
-    }
-
-    @SuppressLint("MissingPermission")
-    public void connect(BluetoothCallBack bluetoothCallBack) {
-        if (!bluetoothAdapter.isEnabled()) {
-            Tool.INSTANCE.setBluetooth(true);
-        }
-        bluetoothDevice = getWeighDevice();
-        if (null == bluetoothDevice) {
-            bluetoothCallBack.connectFailed("未找到蓝牙称");
-            return;
-        }
-        try {
-            bluetoothSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);
-            LogUtils.d("连接蓝牙前");
-            bluetoothSocket.connect();
-            inputStream = bluetoothSocket.getInputStream();
-            int bytesRead;
-            String weight = "";
-            LogUtils.d("读取蓝牙数据前");
-            while (null != bluetoothSocket && bluetoothSocket.isConnected() && null != inputStream && (bytesRead = inputStream.read(buffer)) != -1) {
-                // 处理读取的数据
-                String data = new String(buffer, 0, bytesRead, StandardCharsets.UTF_8);
-                String[] split = data.split("\n", -1);
-                LogUtils.d("处理前的蓝牙数据", data, split);
-                if (split.length > 0) {
-                    String line = split[0].trim();
-                    if (!weight.equals(line)) {
-                        weight = line;
-                        bluetoothCallBack.callBack(weight);
-                    }
-                }
-                Thread.sleep(5);
-            }
-        } catch (Exception e) {
-            disconnect();
-            LogUtils.e(Log.getStackTraceString(e));
-        }
-    }
-
-    public void disconnect() {
-        if (null != bluetoothDevice) {
-            bluetoothDevice = null;
-        }
-        if (null != bluetoothSocket && bluetoothSocket.isConnected()) {
-            try {
-                inputStream.close();
-                inputStream = null;
-                bluetoothSocket.close();
-                bluetoothSocket = null;
-            } catch (Exception e) {
-                LogUtils.e(Log.getStackTraceString(e));
-            }
-        }
-    }
-
-    public interface BluetoothCallBack {
-        void callBack(String weight);
-
-        void connectFailed(String msg);
-    }
-
-    @SuppressLint("MissingPermission")
-    private BluetoothDevice getWeighDevice() {
-        if (null != bluetoothDevice) {
-            return bluetoothDevice;
-        }
-        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
-        if (!pairedDevices.isEmpty()) {
-            // There are paired devices. Get the name and address of each paired device.
-            for (BluetoothDevice device : pairedDevices) {
-                String deviceName = device.getName();
-                if ("HF-18".equals(deviceName)) {
-                    return device;
-                }
-            }
-        }
-        return null;
-    }
-}
+//package xn.hxp.utils.bluetooth;
+//
+//import android.annotation.SuppressLint;
+//import android.bluetooth.BluetoothAdapter;
+//import android.bluetooth.BluetoothDevice;
+//import android.bluetooth.BluetoothManager;
+//import android.bluetooth.BluetoothSocket;
+//import android.util.Log;
+//
+//import com.blankj.utilcode.util.LogUtils;
+//import com.blankj.utilcode.util.Utils;
+//
+//import java.io.InputStream;
+//import java.nio.charset.StandardCharsets;
+//import java.util.Set;
+//import java.util.UUID;
+//
+//import xn.hxp.utils.Tool;
+//
+//public enum BluetoothTool {
+//    INSTANCE;
+//    BluetoothAdapter bluetoothAdapter;
+//    private UUID uuid;
+//    private byte[] buffer = new byte[1024];
+//    private BluetoothDevice bluetoothDevice;
+//    private BluetoothSocket bluetoothSocket;
+//    private InputStream inputStream;
+//
+//    private BluetoothTool() {
+//        uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
+//        BluetoothManager bluetoothManager = Utils.getApp().getSystemService(BluetoothManager.class);
+//        bluetoothAdapter = bluetoothManager.getAdapter();
+//    }
+//
+//    @SuppressLint("MissingPermission")
+//    public void connect(BluetoothCallBack bluetoothCallBack) {
+//        if (!bluetoothAdapter.isEnabled()) {
+//            Tool.INSTANCE.setBluetooth(true);
+//        }
+//        bluetoothDevice = getWeighDevice();
+//        if (null == bluetoothDevice) {
+//            bluetoothCallBack.connectFailed("未找到蓝牙称");
+//            return;
+//        }
+//        try {
+//            bluetoothSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);
+//            LogUtils.d("连接蓝牙前");
+//            bluetoothSocket.connect();
+//            inputStream = bluetoothSocket.getInputStream();
+//            int bytesRead;
+//            String weight = "";
+//            LogUtils.d("读取蓝牙数据前");
+//            while (null != bluetoothSocket && bluetoothSocket.isConnected() && null != inputStream && (bytesRead = inputStream.read(buffer)) != -1) {
+//                // 处理读取的数据
+//                String data = new String(buffer, 0, bytesRead, StandardCharsets.UTF_8);
+//                String[] split = data.split("\n", -1);
+//                LogUtils.d("处理前的蓝牙数据", data, split);
+//                if (split.length > 0) {
+//                    String line = split[0].trim();
+//                    if (!weight.equals(line)) {
+//                        weight = line;
+//                        bluetoothCallBack.callBack(weight);
+//                    }
+//                }
+//                Thread.sleep(5);
+//            }
+//        } catch (Exception e) {
+//            disconnect();
+//            LogUtils.e(Log.getStackTraceString(e));
+//        }
+//    }
+//
+//    public void disconnect() {
+//        if (null != bluetoothDevice) {
+//            bluetoothDevice = null;
+//        }
+//        if (null != bluetoothSocket && bluetoothSocket.isConnected()) {
+//            try {
+//                inputStream.close();
+//                inputStream = null;
+//                bluetoothSocket.close();
+//                bluetoothSocket = null;
+//            } catch (Exception e) {
+//                LogUtils.e(Log.getStackTraceString(e));
+//            }
+//        }
+//    }
+//
+//    public interface BluetoothCallBack {
+//        void callBack(String weight);
+//
+//        void connectFailed(String msg);
+//    }
+//
+//    @SuppressLint("MissingPermission")
+//    private BluetoothDevice getWeighDevice() {
+//        if (null != bluetoothDevice) {
+//            return bluetoothDevice;
+//        }
+//        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
+//        if (!pairedDevices.isEmpty()) {
+//            // There are paired devices. Get the name and address of each paired device.
+//            for (BluetoothDevice device : pairedDevices) {
+//                String deviceName = device.getName();
+//                if ("HF-18".equals(deviceName)) {
+//                    return device;
+//                }
+//            }
+//        }
+//        return null;
+//    }
+//}

+ 5 - 0
app/src/main/java/xn/hxp/weidith/CabinetOpenDialog.kt

@@ -69,6 +69,11 @@ class CabinetOpenDialog(
         mCountDownHandler.sendEmptyMessage(Constants.WHAT_COUNT_DOWN_TWO)
     }
 
+    override fun onDetachedFromWindow() {
+        super.onDetachedFromWindow()
+        closHandle()
+    }
+
     interface IClickLit {
         fun onClickClo()//关闭后调用归还api
         fun onOpenClick()//再次开门

+ 10 - 1
app/src/main/java/xn/hxp/weidith/WeighDialog.kt

@@ -7,6 +7,7 @@ import android.graphics.drawable.ColorDrawable
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
+import android.text.TextUtils
 import android.view.Gravity
 import android.view.MotionEvent
 import android.view.Window
@@ -14,6 +15,7 @@ import android.view.WindowManager
 import android.widget.EditText
 import android.widget.ImageView
 import android.widget.TextView
+import android.widget.Toast
 import androidx.lifecycle.lifecycleScope
 import com.bumptech.glide.Glide
 import com.bumptech.glide.load.engine.DiskCacheStrategy
@@ -39,10 +41,11 @@ class WeighDialog(
             WindowManager.LayoutParams.WRAP_CONTENT
         )
     }
+
     private var mHandler: Handler = Handler(Looper.getMainLooper())
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        if (ChemicalApp.confs!!.weighHintPicture!=null){
+        if (ChemicalApp.confs!!.weighHintPicture != null) {
             LogUtils.i("======称重示意图:${HttpConfig.API_BASE_IMG_URL}${ChemicalApp.confs!!.weighHintPicture}")
             val findViewById = findViewById<ImageView>(R.id.imgView)
             // 使用 Glide 加载网络图片
@@ -64,6 +67,12 @@ class WeighDialog(
 
         val tvClose = findViewById<TextView>(R.id.tvClose)
         tvClose.setOnClickListener {
+            val weigh = findViewById<TextView>(R.id.weigh).text.toString()
+            if (TextUtils.isEmpty(weigh)) {
+                Toast.makeText(ct, "请输入重量", Toast.LENGTH_SHORT).show()
+                return@setOnClickListener
+            }
+
             dismiss()
             lint.viewCloses()
         }

+ 68 - 0
app/src/main/java/xn/hxp/weidith/ble/BleScanAdapter.java

@@ -0,0 +1,68 @@
+package xn.hxp.weidith.ble;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+
+import com.clj.fastble.data.BleDevice;
+
+import java.util.List;
+
+import xn.hxp.databinding.ItemBleBinding;
+
+public class BleScanAdapter extends BaseAdapter {
+    private Context context;
+    private List<BleDevice> deviceList;
+
+    public BleScanAdapter(Context context, List<BleDevice> deviceList) {
+        this.context = context;
+        this.deviceList = deviceList;
+    }
+
+    @Override
+    public int getCount() {
+        return null == deviceList ? 0 : deviceList.size();
+    }
+
+    @Override
+    public BleDevice getItem(int position) {
+        return deviceList.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return 0;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder viewHolder;
+        if (convertView == null) {
+            ItemBleBinding binding = ItemBleBinding.inflate(LayoutInflater.from(context), parent, false);
+            convertView = binding.getRoot();
+            viewHolder = new ViewHolder(binding);
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (ViewHolder) convertView.getTag();
+        }
+        BleDevice bleDevice = getItem(position);
+        if (null != bleDevice) {
+            String mac = bleDevice.getMac();
+            String name = bleDevice.getName();
+            viewHolder.binding.bleMac.setText(TextUtils.isEmpty(mac) ? "" : mac);
+            viewHolder.binding.bleName.setText(TextUtils.isEmpty(name) ? "" : name);
+        }
+        return convertView;
+    }
+
+    static class ViewHolder {
+        ItemBleBinding binding;
+
+        public ViewHolder(ItemBleBinding binding) {
+            this.binding = binding;
+        }
+    }
+}

+ 120 - 0
app/src/main/java/xn/hxp/weidith/ble/BleSelectorDialog.java

@@ -0,0 +1,120 @@
+package xn.hxp.weidith.ble;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.AdapterView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatDialog;
+
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.SPUtils;
+import com.clj.fastble.BleManager;
+import com.clj.fastble.callback.BleScanCallback;
+import com.clj.fastble.data.BleDevice;
+import com.clj.fastble.data.BleScanState;
+import com.clj.fastble.scan.BleScanRuleConfig;
+import com.kongzue.dialogx.dialogs.PopTip;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import xn.hxp.databinding.DialogBleSelectorBinding;
+
+public class BleSelectorDialog extends AppCompatDialog {
+    private Context context;
+    private DialogBleSelectorBinding binding;
+    private List<BleDevice> deviceList = new ArrayList<>();
+    private BleScanAdapter bleScanAdapter;
+
+    public BleSelectorDialog(@NonNull Context context) {
+        super(context);
+        this.context = context;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = DialogBleSelectorBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+        setCancelable(false);
+        setCanceledOnTouchOutside(false);
+        if (BleManager.getInstance().isBlueEnable()) {
+            BleManager.getInstance().disconnectAllDevice();
+        } else {
+            BleManager.getInstance().enableBluetooth();
+        }
+        bleScanAdapter = new BleScanAdapter(context, deviceList);
+        binding.bleLV.setAdapter(bleScanAdapter);
+        binding.bleLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                SPUtils.getInstance().put("bleMac", deviceList.get(position).getMac());
+                SPUtils.getInstance().put("bleName", deviceList.get(position).getName());
+                SPUtils.getInstance().put("bleKey", deviceList.get(position).getKey());
+                dismiss();
+            }
+        });
+        binding.ok.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                binding.ok.setVisibility(View.GONE);
+                binding.cancel.setVisibility(View.VISIBLE);
+                binding.bleLV.setVisibility(View.VISIBLE);
+                binding.loadingLAV.setVisibility(View.VISIBLE);
+                binding.loadingLAV.playAnimation();
+                BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
+                        .setScanTimeOut(1000)
+                        .build();
+                BleManager.getInstance().initScanRule(scanRuleConfig);
+                BleManager.getInstance().scan(new BleScanCallback() {
+                    @Override
+                    public void onScanFinished(List<BleDevice> scanResultList) {
+                        if (null != scanResultList && !scanResultList.isEmpty()) {
+                            for (int i = 0; i < scanResultList.size(); i++) {
+                                BleDevice bleDevice = scanResultList.get(i);
+                                String name = bleDevice.getName();
+                                if (!TextUtils.isEmpty(name)) {
+                                    deviceList.add(bleDevice);
+                                }
+                            }
+                            LogUtils.d(deviceList.size());
+                            if (!deviceList.isEmpty()) {
+                                bleScanAdapter.notifyDataSetChanged();
+                                binding.loadingLAV.cancelAnimation();
+                                binding.loadingLAV.setVisibility(View.GONE);
+                            } else {
+                                PopTip.show("未找到蓝牙称!");
+                            }
+                        }
+                    }
+
+                    @Override
+                    public void onScanStarted(boolean success) {
+                    }
+
+                    @Override
+                    public void onScanning(BleDevice bleDevice) {
+                    }
+                });
+            }
+        });
+        binding.cancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismiss();
+            }
+        });
+    }
+
+    @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        binding.loadingLAV.cancelAnimation();
+        if (BleManager.getInstance().getScanSate() == BleScanState.STATE_SCANNING) {
+            BleManager.getInstance().cancelScan();
+        }
+    }
+}

+ 22 - 29
app/src/main/java/xn/hxp/weidith/BluetoothWeighDialog.java

@@ -1,4 +1,4 @@
-package xn.hxp.weidith;
+package xn.hxp.weidith.ble;
 
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
@@ -29,7 +29,7 @@ import xn.hxp.R;
 import xn.hxp.app.ChemicalApp;
 import xn.hxp.databinding.DialogBluetoothWeighBinding;
 import xn.hxp.ui.plan.add.AddActivity;
-import xn.hxp.utils.bluetooth.BluetoothTool;
+import xn.hxp.utils.bluetooth.BleTool;
 
 public class BluetoothWeighDialog extends AppCompatDialog {
     private DialogBluetoothWeighBinding binding;
@@ -70,18 +70,31 @@ public class BluetoothWeighDialog extends AppCompatDialog {
         // 规格
         binding.specsTV.setText(hxpChemicalVo.getSpecNum() + hxpChemicalVo.getSpecUnit());
         // 蓝牙称
-        ThreadUtils.executeByCached(new ThreadUtils.SimpleTask<Object>() {
+        BleTool.INSTANCE.setBleCallback(new BleTool.BleCallback() {
             @Override
-            public Object doInBackground() throws Throwable {
-                BluetoothTool.INSTANCE.connect(bluetoothCallBack);
-                return null;
+            public void onSuccess() {
+
             }
 
             @Override
-            public void onSuccess(Object result) {
+            public void onNotifyFailure(Exception exception) {
+                dialogCallBack.cancel(BluetoothWeighDialog.this, exception.getMessage());
+            }
 
+            @Override
+            public void onChanged(String weight) {
+                hxpChemicalVo.setWeigh(Double.parseDouble(weight));
+                binding.weighTV.setText(weight + "g");
+                if (binding.weightRL.getVisibility() != View.VISIBLE) {
+                    binding.weightRL.setVisibility(View.VISIBLE);
+                }
+                if (binding.loadingLAV.getVisibility() == View.VISIBLE) {
+                    binding.loadingLAV.cancelAnimation();
+                    binding.loadingLAV.setVisibility(View.GONE);
+                }
             }
         });
+        BleTool.INSTANCE.connect();
         // 确认
         binding.confirmBT.setOnClickListener(v -> {
             Editable netWtETText = binding.netWtET.getText();
@@ -151,7 +164,8 @@ public class BluetoothWeighDialog extends AppCompatDialog {
     @Override
     protected void onStop() {
         super.onStop();
-        BluetoothTool.INSTANCE.disconnect();
+        BleTool.INSTANCE.setBleCallback(null);
+        BleTool.INSTANCE.disconnect();
     }
 
 
@@ -163,25 +177,4 @@ public class BluetoothWeighDialog extends AppCompatDialog {
         void cancel(BluetoothWeighDialog bluetoothWeighDialog, String msg);
     }
 
-    BluetoothTool.BluetoothCallBack bluetoothCallBack = new BluetoothTool.BluetoothCallBack() {
-        @Override
-        public void callBack(String weight) {
-            hxpChemicalVo.setWeigh(Double.parseDouble(weight));
-            ThreadUtils.runOnUiThread(() -> {
-                binding.weighTV.setText(weight + "g");
-                if (binding.weightRL.getVisibility() != View.VISIBLE) {
-                    binding.weightRL.setVisibility(View.VISIBLE);
-                }
-                if (binding.loadingLAV.getVisibility() == View.VISIBLE) {
-                    binding.loadingLAV.cancelAnimation();
-                    binding.loadingLAV.setVisibility(View.GONE);
-                }
-            });
-        }
-
-        @Override
-        public void connectFailed(String msg) {
-            dialogCallBack.cancel(BluetoothWeighDialog.this, msg);
-        }
-    };
 }

+ 11 - 0
app/src/main/res/drawable-anydpi/ic_ble.xml

@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="#333333"
+    android:alpha="0.6">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z"/>
+</vector>

+ 11 - 0
app/src/main/res/drawable-anydpi/ic_ble_connected.xml

@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="#54E533"
+    android:alpha="0.8">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M7,12l-2,-2 -2,2 2,2 2,-2zM17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88zM19,10l-2,2 2,2 2,-2 -2,-2z"/>
+</vector>

+ 11 - 0
app/src/main/res/drawable-anydpi/ic_ble_connecting.xml

@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="#33E59B"
+    android:alpha="0.8">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M11,24h2v-2h-2v2zM7,24h2v-2L7,22v2zM15,24h2v-2h-2v2zM17.71,5.71L12,0h-1v7.59L6.41,3 5,4.41 10.59,10 5,15.59 6.41,17 11,12.41L11,20h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,3.83l1.88,1.88L13,7.59L13,3.83zM14.88,14.29L13,16.17v-3.76l1.88,1.88z"/>
+</vector>

+ 11 - 0
app/src/main/res/drawable-anydpi/ic_ble_unconnected.xml

@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="#E53348"
+    android:alpha="0.8">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M13,5.83l1.88,1.88 -1.6,1.6 1.41,1.41 3.02,-3.02L12,2h-1v5.03l2,2v-3.2zM5.41,4L4,5.41 10.59,12 5,17.59 6.41,19 11,14.41V22h1l4.29,-4.29 2.3,2.29L20,18.59 5.41,4zM13,18.17v-3.76l1.88,1.88L13,18.17z"/>
+</vector>

BIN
app/src/main/res/drawable-hdpi/ic_admin.png


BIN
app/src/main/res/drawable-hdpi/ic_back.png


BIN
app/src/main/res/drawable-hdpi/ic_ble.png


BIN
app/src/main/res/drawable-hdpi/ic_ble_connected.png


BIN
app/src/main/res/drawable-hdpi/ic_ble_connecting.png


BIN
app/src/main/res/drawable-hdpi/ic_ble_unconnected.png


BIN
app/src/main/res/drawable-hdpi/ic_celsius.png


BIN
app/src/main/res/drawable-hdpi/ic_cpu.png


BIN
app/src/main/res/drawable-hdpi/ic_eixt.png


BIN
app/src/main/res/drawable-hdpi/ic_et_err.png


BIN
app/src/main/res/drawable-hdpi/ic_folder.png


BIN
app/src/main/res/drawable-hdpi/ic_http.png


BIN
app/src/main/res/drawable-hdpi/ic_ip.png


BIN
app/src/main/res/drawable-hdpi/ic_mqtt.png


BIN
app/src/main/res/drawable-hdpi/ic_mqtt_account.png


BIN
app/src/main/res/drawable-hdpi/ic_mqtt_password.png


BIN
app/src/main/res/drawable-hdpi/ic_reboot.png


BIN
app/src/main/res/drawable-hdpi/ic_save.png


BIN
app/src/main/res/drawable-hdpi/ic_settings.png


BIN
app/src/main/res/drawable-hdpi/ic_sn.png


BIN
app/src/main/res/drawable-hdpi/ic_time.png


BIN
app/src/main/res/drawable-hdpi/ic_ver.png


BIN
app/src/main/res/drawable-mdpi/ic_admin.png


BIN
app/src/main/res/drawable-mdpi/ic_back.png


BIN
app/src/main/res/drawable-mdpi/ic_ble.png


BIN
app/src/main/res/drawable-mdpi/ic_ble_connected.png


BIN
app/src/main/res/drawable-mdpi/ic_ble_connecting.png


BIN
app/src/main/res/drawable-mdpi/ic_ble_unconnected.png


BIN
app/src/main/res/drawable-mdpi/ic_celsius.png


BIN
app/src/main/res/drawable-mdpi/ic_cpu.png


BIN
app/src/main/res/drawable-mdpi/ic_eixt.png


BIN
app/src/main/res/drawable-mdpi/ic_et_err.png


BIN
app/src/main/res/drawable-mdpi/ic_folder.png


BIN
app/src/main/res/drawable-mdpi/ic_http.png


BIN
app/src/main/res/drawable-mdpi/ic_ip.png


BIN
app/src/main/res/drawable-mdpi/ic_mqtt.png


BIN
app/src/main/res/drawable-mdpi/ic_mqtt_account.png


BIN
app/src/main/res/drawable-mdpi/ic_mqtt_password.png


BIN
app/src/main/res/drawable-mdpi/ic_reboot.png


BIN
app/src/main/res/drawable-mdpi/ic_save.png


BIN
app/src/main/res/drawable-mdpi/ic_settings.png


BIN
app/src/main/res/drawable-mdpi/ic_sn.png


BIN
app/src/main/res/drawable-mdpi/ic_time.png


BIN
app/src/main/res/drawable-mdpi/ic_ver.png


BIN
app/src/main/res/drawable-xhdpi/ble_mac_hint.png


BIN
app/src/main/res/drawable-xhdpi/ic_admin.png


BIN
app/src/main/res/drawable-xhdpi/ic_back.png


BIN
app/src/main/res/drawable-xhdpi/ic_ble.png


BIN
app/src/main/res/drawable-xhdpi/ic_ble_connected.png


BIN
app/src/main/res/drawable-xhdpi/ic_ble_connecting.png


BIN
app/src/main/res/drawable-xhdpi/ic_ble_unconnected.png


BIN
app/src/main/res/drawable-xhdpi/ic_celsius.png


BIN
app/src/main/res/drawable-xhdpi/ic_cpu.png


BIN
app/src/main/res/drawable-xhdpi/ic_eixt.png


BIN
app/src/main/res/drawable-xhdpi/ic_et_err.png


BIN
app/src/main/res/drawable-xhdpi/ic_folder.png


BIN
app/src/main/res/drawable-xhdpi/ic_http.png


BIN
app/src/main/res/drawable-xhdpi/ic_ip.png


BIN
app/src/main/res/drawable-xhdpi/ic_mqtt.png


BIN
app/src/main/res/drawable-xhdpi/ic_mqtt_account.png


BIN
app/src/main/res/drawable-xhdpi/ic_mqtt_password.png


BIN
app/src/main/res/drawable-xhdpi/ic_reboot.png


BIN
app/src/main/res/drawable-xhdpi/ic_save.png


BIN
app/src/main/res/drawable-xhdpi/ic_settings.png


BIN
app/src/main/res/drawable-xhdpi/ic_sn.png


BIN
app/src/main/res/drawable-xhdpi/ic_time.png


BIN
app/src/main/res/drawable-xhdpi/ic_ver.png


BIN
app/src/main/res/drawable-xhdpi/logo.png


+ 0 - 0
app/src/main/res/drawable-xxhdpi/ic_admin.png


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff