Kaynağa Gözat

migrate commit

zhaoyadi 8 ay önce
ebeveyn
işleme
34926a0d79
52 değiştirilmiş dosya ile 746 ekleme ve 229 silme
  1. 0 1
      .idea/misc.xml
  2. 5 1
      xiaodou/src/main/AndroidManifest.xml
  3. 102 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDConnectActivity.kt
  4. 54 44
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDConnectService.kt
  5. 7 7
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDScanBLEActivity.kt
  6. 12 7
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDScanWifiActivity.kt
  7. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDBLEConnectStatus.kt
  8. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDBLEController.kt
  9. 2 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDBLEUtils.kt
  10. 7 15
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEAdapter.kt
  11. 7 7
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEDevice.kt
  12. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEDisableFragment.kt
  13. 9 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEGattCallback.kt
  14. 12 12
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLENormalFragment.kt
  15. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLENotSupportFragment.kt
  16. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEPermissionFragment.kt
  17. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEStatus.kt
  18. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectConnectingFragment.kt
  19. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectErrorFragment.kt
  20. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectFailFragment.kt
  21. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectNotFoundFragment.kt
  22. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectPasswordErrorFragment.kt
  23. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectSuccessFragment.kt
  24. 18 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectTimeoutFragment.kt
  25. 30 13
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiAdapter.kt
  26. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiDisableFragment.kt
  27. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiEntity.kt
  28. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiInfo.kt
  29. 33 15
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiNormalFragment.kt
  30. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPasswordFragment.kt
  31. 47 0
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPasswordWithSsidFragment.kt
  32. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPermissionFragment.kt
  33. 1 1
      xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiStatus.kt
  34. 0 15
      xiaodou/src/main/java/com/luojigou/xiaodou/XDBindFailureActivity.kt
  35. 0 11
      xiaodou/src/main/java/com/luojigou/xiaodou/XDBindSuccessActivity.kt
  36. 0 4
      xiaodou/src/main/java/com/luojigou/xiaodou/XDConnectActivity.kt
  37. 0 13
      xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEGattCallback.kt
  38. 9 0
      xiaodou/src/main/res/drawable/xiaodou.xml
  39. 0 6
      xiaodou/src/main/res/layout/activity_bind_failure.xml
  40. 0 6
      xiaodou/src/main/res/layout/activity_bind_success.xml
  41. 12 0
      xiaodou/src/main/res/layout/activity_connect.xml
  42. 29 0
      xiaodou/src/main/res/layout/fragment_connect_connecting.xml
  43. 29 0
      xiaodou/src/main/res/layout/fragment_connect_error.xml
  44. 31 0
      xiaodou/src/main/res/layout/fragment_connect_fail.xml
  45. 31 0
      xiaodou/src/main/res/layout/fragment_connect_not_found.xml
  46. 29 0
      xiaodou/src/main/res/layout/fragment_connect_password_error.xml
  47. 29 0
      xiaodou/src/main/res/layout/fragment_connect_success.xml
  48. 29 0
      xiaodou/src/main/res/layout/fragment_connect_timeout.xml
  49. 1 1
      xiaodou/src/main/res/layout/fragment_scanwifi_password.xml
  50. 26 0
      xiaodou/src/main/res/layout/fragment_scanwifi_password_with_ssid.xml
  51. 4 37
      xiaodou/src/main/res/layout/item_ble.xml
  52. 22 1
      xiaodou/src/main/res/layout/item_wifi_add.xml

+ 0 - 1
.idea/misc.xml

@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ExternalStorageConfigurationManager" enabled="true" />
   <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">

+ 5 - 1
xiaodou/src/main/AndroidManifest.xml

@@ -46,8 +46,12 @@
             android:name=".XDScanWifiActivity"
             android:theme="@style/XDTheme" />
 
+        <activity
+            android:name=".XDConnectActivity"
+            android:theme="@style/XDTheme" />
+
         <service
-            android:name=".XDScanBLEService"
+            android:name=".XDConnectService"
             android:exported="false"
             android:foregroundServiceType="connectedDevice" />
     </application>

+ 102 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDConnectActivity.kt

@@ -0,0 +1,102 @@
+package com.luojigou.hardware.xiaodou
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.fragment.app.Fragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectConnectingFragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectErrorFragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectFailFragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectNotFoundFragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectPasswordErrorFragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectSuccessFragment
+import com.luojigou.hardware.xiaodou.connect.XDConnectTimeoutFragment
+import com.luojigou.hardware.xiaodou.wifi.XDScanWifiInfo
+import com.luojigou.xiaodou.R
+
+class XDConnectActivity : AppCompatActivity() {
+    companion object {
+        fun startConnect(context: Context, device: XDScanWifiInfo) {
+            val intent = Intent(context, XDConnectActivity::class.java)
+            intent.putExtra(XDConnectService.ACTION_SELECT_WIFI_DEVICE_DATA, device)
+            context.startActivity(intent)
+        }
+    }
+
+    private val timeoutFragment = XDConnectTimeoutFragment()
+    private val errorFragment = XDConnectErrorFragment()
+    private val successFragment = XDConnectSuccessFragment()
+    private val connectingFragment = XDConnectConnectingFragment()
+    private val failFragment = XDConnectFailFragment()
+    private val notFoundFragment = XDConnectNotFoundFragment()
+    private val passwordErrorFragment = XDConnectPasswordErrorFragment()
+
+    private val connectReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent) {
+            setFragment(
+                when (intent.action) {
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_TIMEOUT -> timeoutFragment
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_ERROR -> errorFragment
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_SUCCESS -> successFragment
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_CONNECTING -> connectingFragment
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_FAIL -> failFragment
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_NOT_FOUND -> notFoundFragment
+                    XDConnectService.ACTION_CONNECT_WIFI_RESULT_PASSWORD_ERROR -> passwordErrorFragment
+                    else -> errorFragment
+                }
+            )
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_connect)
+        setFragment(connectingFragment)
+
+        val intentFilter = IntentFilter()
+        intentFilter.apply {
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_TIMEOUT)
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_ERROR)
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_SUCCESS)
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_CONNECTING)
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_FAIL)
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_NOT_FOUND)
+            addAction(XDConnectService.ACTION_CONNECT_WIFI_RESULT_PASSWORD_ERROR)
+        }
+
+        ContextCompat.registerReceiver(
+            this,
+            connectReceiver,
+            intentFilter,
+            ContextCompat.RECEIVER_EXPORTED,
+        )
+
+        val device = intent.getParcelableExtra<XDScanWifiInfo>(XDConnectService.ACTION_SELECT_WIFI_DEVICE_DATA)
+
+        if (device != null) {
+            val intent = Intent(XDConnectService.ACTION_SELECT_WIFI_DEVICE)
+            intent.putExtra(XDConnectService.ACTION_SELECT_WIFI_DEVICE_DATA, device)
+            sendBroadcast(intent)
+        }
+    }
+
+    private fun setFragment(fragment: Fragment) {
+        val fragmentManager = supportFragmentManager;
+        val beginTransaction = fragmentManager.beginTransaction()
+        if (fragmentManager.findFragmentById(R.id.fragment_container) == null) {
+            beginTransaction.add(R.id.fragment_container, fragment)
+        } else {
+            beginTransaction.replace(R.id.fragment_container, fragment)
+        }
+        beginTransaction.commit()
+    }
+
+    override fun onDestroy() {
+        unregisterReceiver(connectReceiver)
+        super.onDestroy()
+    }
+}

+ 54 - 44
xiaodou/src/main/java/com/luojigou/xiaodou/XDScanBLEService.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDConnectService.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou
+package com.luojigou.hardware.xiaodou
 
 import android.annotation.SuppressLint
 import android.app.Service
@@ -25,15 +25,14 @@ import androidx.core.app.NotificationChannelCompat
 import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationManagerCompat
 import androidx.core.content.ContextCompat
-import com.luojigou.xiaodou.ble.XDBLEUtils
-import com.luojigou.xiaodou.ble.XDScanBLEDevice
-import com.luojigou.xiaodou.wifi.XDScanWifiInfo
+import com.luojigou.hardware.xiaodou.ble.XDBLEUtils
+import com.luojigou.hardware.xiaodou.wifi.XDScanWifiInfo
 import java.util.UUID
 import kotlin.concurrent.thread
 
 
 @SuppressLint("MissingPermission")
-class XDScanBLEService : Service() {
+class XDConnectService : Service() {
     companion object {
         const val ACTION_START_SCAN = "com.luojigou.xiaodou.ble.ACTION_START_SCAN"
         const val ACTION_STOP_SCAN = "com.luojigou.xiaodou.ble.ACTION_STOP_SCAN"
@@ -52,9 +51,15 @@ class XDScanBLEService : Service() {
         const val ACTION_CONNECT_BLE_RESULT_SUCCESS = "com.luojigou.xiaodou.ble.ACTION_CONNECT_BLE_RESULT_SUCCESS"
 
         const val ACTION_CONNECT_WIFI = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI"
-        const val ACTION_CONNECT_WIFI_RESULT_ERROR = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_ERROR"
-        const val ACTION_CONNECT_WIFI_RESULT_SUCCESS = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_SUCCESS"
-
+        const val ACTION_CONNECT_WIFI_RESULT_TIMEOUT = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_TIMEOUT" // -2
+        const val ACTION_CONNECT_WIFI_RESULT_ERROR = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_ERROR" // -1
+        const val ACTION_CONNECT_WIFI_RESULT_SUCCESS = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_SUCCESS" // 0
+        const val ACTION_CONNECT_WIFI_RESULT_CONNECTING = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_CONNECTING" // 1
+        const val ACTION_CONNECT_WIFI_RESULT_FAIL = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_FAIL" // 2
+        const val ACTION_CONNECT_WIFI_RESULT_NOT_FOUND = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_NOT_FOUND" // 3
+        const val ACTION_CONNECT_WIFI_RESULT_PASSWORD_ERROR = "com.luojigou.xiaodou.ble.ACTION_CONNECT_WIFI_RESULT_PASSWORD_ERROR" // 4
+
+        private val deviceServiceUuidMask = UUID.fromString("0000af00-0000-1000-8000-00805f9b34fb")
         private val wifiConnectServiceUUID = UUID.fromString("0000ae80-0000-1000-8000-00805f9b34fb")
         private val wifiConnectWriteUUID = UUID.fromString("0000ae81-0000-1000-8000-00805f9b34fb")
         private val wifiConnectNotifyUUID = UUID.fromString("0000ae82-0000-1000-8000-00805f9b34fb")
@@ -63,7 +68,7 @@ class XDScanBLEService : Service() {
         private val bleChannelName = "BLE-CHANNEL"
     }
 
-    private val bluetoothDevices: MutableMap<XDScanBLEDevice, BluetoothDevice> = HashMap()
+    private val bluetoothDevices: MutableMap<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice, BluetoothDevice> = HashMap()
 
     private lateinit var bluetoothManager: BluetoothManager
 
@@ -84,10 +89,13 @@ class XDScanBLEService : Service() {
                 ACTION_SELECT_BLE_DEVICE -> {
                     val bleDevice = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                         intent.getParcelableExtra(
-                            ACTION_SELECT_BLE_DEVICE_DATA, XDScanBLEDevice::class.java
+                            ACTION_SELECT_BLE_DEVICE_DATA,
+                            com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice::class.java
                         )
                     } else {
-                        intent.getParcelableExtra<XDScanBLEDevice>(ACTION_SELECT_BLE_DEVICE)
+                        intent.getParcelableExtra<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice>(
+                            ACTION_SELECT_BLE_DEVICE
+                        )
                     }
 
                     bleDevice?.let { connectBLE(it) }
@@ -104,6 +112,10 @@ class XDScanBLEService : Service() {
 
                     wifiInfo?.let { connectWifi(wifiInfo) }
                 }
+
+                ACTION_CONNECT_WIFI -> {
+
+                }
             }
         }
     }
@@ -150,7 +162,9 @@ class XDScanBLEService : Service() {
             result.apply {
                 if (device.name == null) return
 
-                val device = XDScanBLEDevice(
+                if (!device.name.startsWith("XiaoDouAI")) return
+
+                val device = com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice(
                     name = device.name ?: "unknown",
                     bondState = device.bondState.toString(),
                     rssi = rssi.toString(),
@@ -256,7 +270,7 @@ class XDScanBLEService : Service() {
         sendBroadcast(intent)
     }
 
-    private fun connectBLE(device: XDScanBLEDevice) {
+    private fun connectBLE(device: com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) {
         broadcastUpdate(ACTION_CONNECT_BLE)
         val bleDevice = bluetoothDevices[device] ?: return
 
@@ -271,11 +285,19 @@ class XDScanBLEService : Service() {
     private fun connectWifi(device: XDScanWifiInfo) {
         if (bluetoothGatt == null || writeCharacteristic == null) return
 
-        bluetoothGatt!!.writeCharacteristic(
-            writeCharacteristic!!,
-            XDBLEUtils.convertToConnectRequest(device.ssid, device.password),
-            BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE,
+        val bytes = XDBLEUtils.convertToConnectRequest(
+            device.ssid, device.password
         )
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            bluetoothGatt!!.writeCharacteristic(
+                writeCharacteristic!!,
+                bytes, BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE,
+            )
+        } else {
+            writeCharacteristic!!.setValue(bytes)
+            bluetoothGatt!!.writeCharacteristic(writeCharacteristic!!)
+        }
     }
 
     override fun onDestroy() {
@@ -341,31 +363,13 @@ class XDScanBLEService : Service() {
             }
         }
 
-        override fun onCharacteristicChanged(
-            gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic
-        ) {
-            super.onCharacteristicChanged(gatt, characteristic)
-            gatt.readCharacteristic(characteristic)
-            Log.d("XDScanBLEService", "onCharacteristicChanged1:")
-        }
-
         override fun onCharacteristicChanged(
             gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, value: ByteArray
         ) {
             super.onCharacteristicChanged(gatt, characteristic, value)
-            val result = XDBLEUtils.parseConnectResponse(value)
-            Log.d("XDScanBLEService", "onCharacteristicChanged2: $result")
-        }
-
-        override fun onCharacteristicRead(
-            gatt: BluetoothGatt,
-            characteristic: BluetoothGattCharacteristic,
-            value: ByteArray,
-            status: Int
-        ) {
-            super.onCharacteristicRead(gatt, characteristic, value, status)
-            val result = XDBLEUtils.parseConnectResponse(value)
-            Log.d("XDScanBLEService", "onCharacteristicRead: $result")
+            val response = XDBLEUtils.parseConnectResponse(value)
+            response.toAction()
+            Log.d("XDScanBLEService", "onCharacteristicChanged: $response")
         }
 
         override fun onCharacteristicWrite(
@@ -377,13 +381,19 @@ class XDScanBLEService : Service() {
                 Log.d("XDScanBLEService", "onCharacteristicWrite: success")
             }
         }
+    }
 
-        override fun onDescriptorRead(
-            gatt: BluetoothGatt, descriptor: BluetoothGattDescriptor, status: Int, value: ByteArray
-        ) {
-            super.onDescriptorRead(gatt, descriptor, status, value)
-            val result = XDBLEUtils.parseConnectResponse(value)
-            Log.d("XDScanBLEService", "onDescriptorRead: $result")
+    private fun Int.toAction() {
+        when (this) {
+            -99 -> {}
+            -2 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_TIMEOUT)
+            -1 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_ERROR)
+            0 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_SUCCESS)
+            1 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_CONNECTING)
+            2 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_FAIL)
+            3 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_NOT_FOUND)
+            4 -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_PASSWORD_ERROR)
+            else -> broadcastUpdate(ACTION_CONNECT_WIFI_RESULT_ERROR)
         }
     }
 }

+ 7 - 7
xiaodou/src/main/java/com/luojigou/xiaodou/XDScanBLEActivity.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDScanBLEActivity.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou
+package com.luojigou.hardware.xiaodou
 
 import android.Manifest
 import android.bluetooth.BluetoothAdapter
@@ -13,11 +13,11 @@ import android.os.Bundle
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.app.ActivityCompat
 import androidx.fragment.app.Fragment
-import com.luojigou.xiaodou.ble.XDScanBLEDisableFragment
-import com.luojigou.xiaodou.ble.XDScanBLENormalFragment
-import com.luojigou.xiaodou.ble.XDScanBLENotSupportFragment
-import com.luojigou.xiaodou.ble.XDScanBLEPermissionFragment
-import com.luojigou.xiaodou.ble.XDScanBLEStatus
+import com.luojigou.hardware.xiaodou.ble.XDScanBLEDisableFragment
+import com.luojigou.hardware.xiaodou.ble.XDScanBLENotSupportFragment
+import com.luojigou.hardware.xiaodou.ble.XDScanBLEPermissionFragment
+import com.luojigou.hardware.xiaodou.ble.XDScanBLEStatus
+import com.luojigou.xiaodou.R
 
 
 class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
@@ -36,7 +36,7 @@ class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
     }
 
     private val disableFragment = XDScanBLEDisableFragment(this)
-    private val normalFragment = XDScanBLENormalFragment(this)
+    private val normalFragment = com.luojigou.hardware.xiaodou.ble.XDScanBLENormalFragment(this)
     private val permissionFragment = XDScanBLEPermissionFragment(this)
     private val notsupportFragment = XDScanBLENotSupportFragment(this)
 

+ 12 - 7
xiaodou/src/main/java/com/luojigou/xiaodou/XDScanWifiActivity.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDScanWifiActivity.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou
+package com.luojigou.hardware.xiaodou
 
 import android.content.BroadcastReceiver
 import android.content.Context
@@ -11,10 +11,11 @@ import android.os.Build
 import android.os.Bundle
 import androidx.appcompat.app.AppCompatActivity
 import androidx.fragment.app.Fragment
-import com.luojigou.xiaodou.wifi.XDScanWifiDisableFragment
-import com.luojigou.xiaodou.wifi.XDScanWifiNormalFragment
-import com.luojigou.xiaodou.wifi.XDScanWifiPermissionFragment
-import com.luojigou.xiaodou.wifi.XDScanWifiStatus
+import com.luojigou.hardware.xiaodou.wifi.XDScanWifiDisableFragment
+import com.luojigou.hardware.xiaodou.wifi.XDScanWifiNormalFragment
+import com.luojigou.hardware.xiaodou.wifi.XDScanWifiPermissionFragment
+import com.luojigou.hardware.xiaodou.wifi.XDScanWifiStatus
+import com.luojigou.xiaodou.R
 
 class XDScanWifiActivity : AppCompatActivity(), XDScanWifiStatus.Host {
     companion object {
@@ -40,6 +41,10 @@ class XDScanWifiActivity : AppCompatActivity(), XDScanWifiStatus.Host {
         setContentView(R.layout.activity_scanwifi)
 
         wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
+    }
+
+    override fun onResume() {
+        super.onResume()
         setupReceiver()
         checkWifiPermissionAndEnable()
     }
@@ -108,8 +113,8 @@ class XDScanWifiActivity : AppCompatActivity(), XDScanWifiStatus.Host {
         return wifiManager.wifiState != WifiManager.WIFI_STATE_DISABLED
     }
 
-    override fun onDestroy() {
+    override fun onPause() {
         teardownReceiver()
-        super.onDestroy()
+        super.onPause()
     }
 }

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDBLEConnectStatus.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDBLEConnectStatus.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 sealed class XDBLEConnectStatus() {
     object Waiting : XDBLEConnectStatus()

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDBLEController.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDBLEController.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.content.Context
 

+ 2 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDBLEUtils.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDBLEUtils.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.util.Log
 
@@ -11,6 +11,7 @@ object XDBLEUtils {
 
     const val END_BYTE: Byte = 255.toByte()
     fun parseConnectResponse(data: ByteArray): Int {
+        if (data.size < 17) return -99
         Log.d("XDBLEUtils", "parseConnectResponse: ${data.decodeToString()}")
         return data[16] - '0'.code
     }

+ 7 - 15
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEAdapter.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEAdapter.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.annotation.SuppressLint
 import android.view.LayoutInflater
@@ -13,9 +13,9 @@ import com.luojigou.xiaodou.R
 
 @SuppressLint("MissingPermission")
 class XDScanBLEAdapter(
-    private val itemClickListener: (XDScanBLEDevice) -> Unit,
+    private val itemClickListener: (com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) -> Unit,
 ) : RecyclerView.Adapter<XDScanBLEAdapter.ViewHolder>() {
-    private val list: MutableSet<XDScanBLEDevice> = ArraySet()
+    private val list: MutableSet<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice> = ArraySet()
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
         val itemView: View =
@@ -29,11 +29,8 @@ class XDScanBLEAdapter(
         val item = list.elementAt(position)
 
         holder.apply {
+            img.setImageResource(R.drawable.xiaodou)
             name.text = item.name
-            bondState.text = item.bondState
-            rssi.text = item.rssi
-            address.text = item.address
-            addressType.text = item.addressType
         }
 
         holder.itemView.setOnClickListener {
@@ -42,24 +39,19 @@ class XDScanBLEAdapter(
     }
 
     @SuppressLint("NotifyDataSetChanged")
-    fun setValues(values: List<XDScanBLEDevice>) {
+    fun setValues(values: List<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice>) {
         list.clear()
         list.addAll(values)
         notifyDataSetChanged()
     }
 
-    fun addValue(value: XDScanBLEDevice) {
+    fun addValue(value: com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) {
         list.add(value)
         notifyItemChanged(list.size - 1)
     }
 
     class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val img = itemView.findViewById<ImageView>(R.id.iv_ble)
-        val id = itemView.findViewById<TextView>(R.id.tv_ble_id)
+        val img = itemView.findViewById<ImageView>(R.id.iv_ble_icon)
         val name = itemView.findViewById<TextView>(R.id.tv_ble_name)
-        val bondState = itemView.findViewById<TextView>(R.id.tv_ble_bond_tate)
-        val rssi = itemView.findViewById<TextView>(R.id.tv_ble_rssi)
-        val address = itemView.findViewById<TextView>(R.id.tv_ble_address)
-        val addressType = itemView.findViewById<TextView>(R.id.tv_ble_address_type)
     }
 }

+ 7 - 7
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEDevice.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEDevice.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.os.Parcel
 import android.os.Parcelable
@@ -15,10 +15,10 @@ data class XDScanBLEDevice(
     // Parcelable Creator
     companion object {
         @JvmField
-        val CREATOR: Parcelable.Creator<XDScanBLEDevice> = object :
-            Parcelable.Creator<XDScanBLEDevice> {
-            override fun createFromParcel(source: Parcel): XDScanBLEDevice {
-                return XDScanBLEDevice(
+        val CREATOR: Parcelable.Creator<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice> = object :
+            Parcelable.Creator<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice> {
+            override fun createFromParcel(source: Parcel): com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice {
+                return com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice(
                     source.readString()!!,
                     source.readString()!!,
                     source.readString()!!,
@@ -27,7 +27,7 @@ data class XDScanBLEDevice(
                 )
             }
 
-            override fun newArray(size: Int): Array<XDScanBLEDevice?> {
+            override fun newArray(size: Int): Array<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice?> {
                 return arrayOfNulls(size)
             }
         }
@@ -52,7 +52,7 @@ data class XDScanBLEDevice(
     }
 
     override fun equals(other: Any?): Boolean {
-        return if (other is XDScanBLEDevice) {
+        return if (other is com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) {
             address == other.address && addressType == other.addressType
         } else {
             false

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEDisableFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEDisableFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.annotation.SuppressLint
 import android.bluetooth.BluetoothAdapter

+ 9 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEGattCallback.kt

@@ -0,0 +1,9 @@
+package com.luojigou.hardware.xiaodou.ble
+
+import android.annotation.SuppressLint
+import android.bluetooth.BluetoothGattCallback
+
+@SuppressLint("MissingPermission")
+class XDScanBLEGattCallback : BluetoothGattCallback() {
+
+}

+ 12 - 12
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLENormalFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLENormalFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.annotation.SuppressLint
 import android.content.BroadcastReceiver
@@ -17,12 +17,12 @@ import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.luojigou.xiaodou.R
-import com.luojigou.xiaodou.XDScanBLEService
-import com.luojigou.xiaodou.XDScanBLEService.Companion.ACTION_SCAN_RESULT
-import com.luojigou.xiaodou.XDScanBLEService.Companion.ACTION_SCAN_RESULT_DATA
-import com.luojigou.xiaodou.XDScanBLEService.Companion.ACTION_START_SCAN
-import com.luojigou.xiaodou.XDScanBLEService.Companion.ACTION_STOP_SCAN
-import com.luojigou.xiaodou.XDScanWifiActivity
+import com.luojigou.hardware.xiaodou.XDConnectService
+import com.luojigou.hardware.xiaodou.XDConnectService.Companion.ACTION_SCAN_RESULT
+import com.luojigou.hardware.xiaodou.XDConnectService.Companion.ACTION_SCAN_RESULT_DATA
+import com.luojigou.hardware.xiaodou.XDConnectService.Companion.ACTION_START_SCAN
+import com.luojigou.hardware.xiaodou.XDConnectService.Companion.ACTION_STOP_SCAN
+import com.luojigou.hardware.xiaodou.XDScanWifiActivity
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.MainScope
 
@@ -30,8 +30,8 @@ import kotlinx.coroutines.MainScope
 class XDScanBLENormalFragment(private val host: XDScanBLEStatus.Host) : Fragment(),
     CoroutineScope by MainScope() {
     private val adapter = XDScanBLEAdapter {
-        val intent = Intent(XDScanBLEService.ACTION_SELECT_BLE_DEVICE)
-        intent.putExtra(XDScanBLEService.ACTION_SELECT_BLE_DEVICE_DATA, it)
+        val intent = Intent(XDConnectService.ACTION_SELECT_BLE_DEVICE)
+        intent.putExtra(XDConnectService.ACTION_SELECT_BLE_DEVICE_DATA, it)
         requireActivity().sendBroadcast(intent)
         XDScanWifiActivity.start(requireContext())
     }
@@ -108,21 +108,21 @@ class XDScanBLENormalFragment(private val host: XDScanBLEStatus.Host) : Fragment
 
         ContextCompat.startForegroundService(
             requireContext(),
-            Intent(requireContext(), XDScanBLEService::class.java),
+            Intent(requireContext(), XDConnectService::class.java),
         )
     }
 
     private fun stopService() {
         requireContext().stopService(
             Intent(
-                requireContext(), XDScanBLEService::class.java
+                requireContext(), XDConnectService::class.java
             )
         )
     }
 
     private fun restartScan() {
         setAdapterValue(listOf())
-        val intent = Intent(XDScanBLEService.ACTION_RESTART_SCAN)
+        val intent = Intent(XDConnectService.ACTION_RESTART_SCAN)
         requireActivity().sendBroadcast(intent)
     }
 

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLENotSupportFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLENotSupportFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.os.Bundle
 import android.view.LayoutInflater

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEPermissionFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEPermissionFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 import android.Manifest
 import android.os.Build

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEStatus.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEStatus.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.ble
+package com.luojigou.hardware.xiaodou.ble
 
 sealed class XDScanBLEStatus {
     object Disabled : XDScanBLEStatus()

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectConnectingFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectConnectingFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_connecting, container, false)
+    }
+}

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectErrorFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectErrorFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_error, container, false)
+    }
+}

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectFailFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectFailFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_fail, container, false)
+    }
+}

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectNotFoundFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectNotFoundFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_not_found, container, false)
+    }
+}

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectPasswordErrorFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectPasswordErrorFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_password_error, container, false)
+    }
+}

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectSuccessFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectSuccessFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_success, container, false)
+    }
+}

+ 18 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectTimeoutFragment.kt

@@ -0,0 +1,18 @@
+package com.luojigou.hardware.xiaodou.connect
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.luojigou.xiaodou.R
+
+class XDConnectTimeoutFragment : Fragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return inflater.inflate(R.layout.fragment_connect_timeout, container, false)
+    }
+}

+ 30 - 13
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiAdapter.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiAdapter.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.net.wifi.ScanResult
 import android.os.Build
@@ -12,29 +12,46 @@ import com.luojigou.xiaodou.R
 
 class XDScanWifiAdapter(
     private val itemClickListener: (ScanResult) -> Unit,
+    private val addClickListener: () -> Unit,
 ) : RecyclerView.Adapter<XDScanWifiAdapter.ViewHolder>() {
     private val list: MutableList<ScanResult> = ArrayList()
 
+    override fun getItemViewType(position: Int): Int =
+        if (position == list.size) 1 else 0
+
+
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
-        val itemView: View = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_wifi, parent, false)
-        return ViewHolder(itemView)
+        if (viewType == 1) {
+            val itemView: View = LayoutInflater.from(parent.context)
+                .inflate(R.layout.item_wifi_add, parent, false)
+            return ViewHolder(itemView)
+        } else {
+            val itemView: View = LayoutInflater.from(parent.context)
+                .inflate(R.layout.item_wifi, parent, false)
+            return ViewHolder(itemView)
+        }
     }
 
     override fun getItemCount(): Int =
-        list.size
+        list.size + 1
 
     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
-        val item = list[position]
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-            holder.name.text = item.wifiSsid?.toString()
+        if (position == list.size) {
+            holder.itemView.setOnClickListener {
+                addClickListener.invoke()
+            }
         } else {
-            holder.name.text = item.BSSID
-        }
+            val item = list[position]
+
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                holder.name.text = item.wifiSsid?.toString()
+            } else {
+                holder.name.text = item.BSSID
+            }
 
-        holder.itemView.setOnClickListener {
-            itemClickListener.invoke(item)
+            holder.itemView.setOnClickListener {
+                itemClickListener.invoke(item)
+            }
         }
     }
 

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiDisableFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiDisableFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.content.Intent
 import android.net.wifi.WifiManager

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiEntity.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiEntity.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 data class XDScanWifiEntity(
     val ssid:String,

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiInfo.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiInfo.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.os.Parcel
 import android.os.Parcelable

+ 33 - 15
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiNormalFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiNormalFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.annotation.SuppressLint
 import android.content.BroadcastReceiver
@@ -17,17 +17,16 @@ import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.luojigou.xiaodou.R
-import com.luojigou.xiaodou.XDScanBLEService
+import com.luojigou.hardware.xiaodou.XDConnectActivity
 
 @SuppressLint("MissingPermission")
 class XDScanWifiNormalFragment(private val host: XDScanWifiStatus.Host) : Fragment() {
     private lateinit var wifiScanReceiver: BroadcastReceiver
 
-    private val adapter = XDScanWifiAdapter { wifi ->
-        XDScanWifiPasswordFragment {
-            val intent = Intent(XDScanBLEService.ACTION_SELECT_WIFI_DEVICE)
-            intent.putExtra(
-                XDScanBLEService.ACTION_SELECT_WIFI_DEVICE_DATA, XDScanWifiInfo(
+    private val adapter = XDScanWifiAdapter(
+        { wifi ->
+            XDScanWifiPasswordFragment {
+                val wifi = XDScanWifiInfo(
                     ssid = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                         val s = wifi.wifiSsid.toString()
                         s.substring(1, s.length - 1)
@@ -35,10 +34,29 @@ class XDScanWifiNormalFragment(private val host: XDScanWifiStatus.Host) : Fragme
                         wifi.BSSID
                     }, password = it
                 )
+
+                XDConnectActivity.startConnect(
+                    requireContext(),
+                    wifi
+                )
+            }.show(
+                requireActivity().supportFragmentManager,
+                "password"
             )
-            requireActivity().sendBroadcast(intent)
-        }.show(requireActivity().supportFragmentManager, "password")
-    }
+        },
+        {
+            XDScanWifiPasswordWithSsidFragment { ssid, pwd ->
+                XDConnectActivity.startConnect(
+                    requireContext(),
+                    XDScanWifiInfo(ssid, pwd)
+                )
+
+            }.show(
+                requireActivity().supportFragmentManager,
+                "password"
+            )
+        },
+    )
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
@@ -57,9 +75,8 @@ class XDScanWifiNormalFragment(private val host: XDScanWifiStatus.Host) : Fragme
         recyclerView.adapter = adapter
     }
 
-    override fun onAttach(context: Context) {
-        super.onAttach(context)
-
+    override fun onResume() {
+        super.onResume()
         wifiScanReceiver = object : BroadcastReceiver() {
             override fun onReceive(context: Context?, intent: Intent) {
                 when (intent.action) {
@@ -87,8 +104,9 @@ class XDScanWifiNormalFragment(private val host: XDScanWifiStatus.Host) : Fragme
         host.getWifiManager().startScan()
     }
 
-    override fun onDetach() {
+    override fun onPause() {
         requireContext().unregisterReceiver(wifiScanReceiver)
-        super.onDetach()
+        host.getWifiManager().disconnect()
+        super.onPause()
     }
 }

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiPasswordFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPasswordFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.os.Bundle
 import android.view.LayoutInflater

+ 47 - 0
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPasswordWithSsidFragment.kt

@@ -0,0 +1,47 @@
+package com.luojigou.hardware.xiaodou.wifi
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.Button
+import android.widget.EditText
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+import com.luojigou.xiaodou.R
+
+class XDScanWifiPasswordWithSsidFragment(private val onPasswordEdit: (ssid: String, password: String) -> Unit) :
+    BottomSheetDialogFragment() {
+
+    private lateinit var ssid: EditText
+    private lateinit var pwd: EditText
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+    ): View {
+        return inflater.inflate(R.layout.fragment_scanwifi_password_with_ssid, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        ssid = view.findViewById<EditText>(R.id.et_ssid)
+        pwd = view.findViewById<EditText>(R.id.et_pwd)
+        val button = view.findViewById<Button>(R.id.btn_pwd)
+
+        button.setOnClickListener {
+            val ssidText = ssid.getText()
+            val pwdText = pwd.getText()
+            onPasswordEdit.invoke(ssidText.toString(), pwdText.toString())
+            dismiss()
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+
+        ssid.requestFocus()
+        val ims = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+        ims.showSoftInput(ssid, InputMethodManager.SHOW_IMPLICIT)
+    }
+}

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiPermissionFragment.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPermissionFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.os.Build
 import android.os.Bundle

+ 1 - 1
xiaodou/src/main/java/com/luojigou/xiaodou/wifi/XDScanWifiStatus.kt → xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiStatus.kt

@@ -1,4 +1,4 @@
-package com.luojigou.xiaodou.wifi
+package com.luojigou.hardware.xiaodou.wifi
 
 import android.net.wifi.WifiManager
 

+ 0 - 15
xiaodou/src/main/java/com/luojigou/xiaodou/XDBindFailureActivity.kt

@@ -1,15 +0,0 @@
-package com.luojigou.xiaodou
-
-import android.content.Context
-import android.net.wifi.WifiManager
-import android.os.Bundle
-import android.util.Log
-import androidx.appcompat.app.AppCompatActivity
-
-class XDBindFailureActivity : AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_bind_failure)
-  }
-}

+ 0 - 11
xiaodou/src/main/java/com/luojigou/xiaodou/XDBindSuccessActivity.kt

@@ -1,11 +0,0 @@
-package com.luojigou.xiaodou
-
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-
-class XDBindSuccessActivity : AppCompatActivity() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_bind_success)
-    }
-}

+ 0 - 4
xiaodou/src/main/java/com/luojigou/xiaodou/XDConnectActivity.kt

@@ -1,4 +0,0 @@
-package com.luojigou.xiaodou
-
-class XDConnectActivity {
-}

+ 0 - 13
xiaodou/src/main/java/com/luojigou/xiaodou/ble/XDScanBLEGattCallback.kt

@@ -1,13 +0,0 @@
-package com.luojigou.xiaodou.ble
-
-import android.annotation.SuppressLint
-import android.bluetooth.BluetoothGatt
-import android.bluetooth.BluetoothGattCallback
-import android.bluetooth.BluetoothProfile
-import android.util.Log
-import com.luojigou.xiaodou.XDScanBLEService
-
-@SuppressLint("MissingPermission")
-class XDScanBLEGattCallback : BluetoothGattCallback() {
-
-}

Dosya farkı çok büyük olduğundan ihmal edildi
+ 9 - 0
xiaodou/src/main/res/drawable/xiaodou.xml


+ 0 - 6
xiaodou/src/main/res/layout/activity_bind_failure.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 6
xiaodou/src/main/res/layout/activity_bind_success.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 12 - 0
xiaodou/src/main/res/layout/activity_connect.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/fragment_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toBottomOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
xiaodou/src/main/res/layout/fragment_connect_connecting.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ProgressBar
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="连接中"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
xiaodou/src/main/res/layout/fragment_connect_error.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        android:src="@android:drawable/stat_notify_error"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="连接出错"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 31 - 0
xiaodou/src/main/res/layout/fragment_connect_fail.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <ImageView
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        android:src="@android:drawable/stat_notify_error"
+        android:background="@android:color/holo_red_dark"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="连接失败"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 31 - 0
xiaodou/src/main/res/layout/fragment_connect_not_found.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+
+    <ImageView
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        android:background="@android:color/darker_gray"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="连接的WIFI不存在"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
xiaodou/src/main/res/layout/fragment_connect_password_error.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        android:background="@android:color/holo_red_light"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="WIFI密码错误"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
xiaodou/src/main/res/layout/fragment_connect_success.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        android:background="@android:color/holo_green_light"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="配网成功"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
xiaodou/src/main/res/layout/fragment_connect_timeout.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/pb_connecting"
+        android:layout_width="320dp"
+        android:layout_height="400dp"
+        android:paddingLeft="140dp"
+        android:paddingTop="180dp"
+        android:paddingRight="140dp"
+        android:paddingBottom="180dp"
+        android:background="@android:color/holo_blue_light"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_connecting"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="配网超时"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/pb_connecting" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
xiaodou/src/main/res/layout/fragment_scanwifi_password.xml

@@ -15,5 +15,5 @@
         android:id="@+id/btn_pwd"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="这是一个底部滑出对话框" />
+        android:text="确定" />
 </LinearLayout>

+ 26 - 0
xiaodou/src/main/res/layout/fragment_scanwifi_password_with_ssid.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="16dp">
+
+    <EditText
+        android:id="@+id/et_ssid"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:focusable="auto"
+        android:hint="请在此输入wifi名称" />
+
+    <EditText
+        android:id="@+id/et_pwd"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:hint="请在此输入wifi密码" />
+
+    <Button
+        android:id="@+id/btn_pwd"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="确定" />
+</LinearLayout>

+ 4 - 37
xiaodou/src/main/res/layout/item_ble.xml

@@ -5,49 +5,16 @@
     android:orientation="vertical">
 
     <ImageView
-        android:id="@+id/iv_ble"
+        android:id="@+id/iv_ble_icon"
         android:layout_width="match_parent"
-        android:layout_height="100dp" />
-
-    <TextView
-        android:id="@+id/tv_ble_id"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:text="" />
+        android:layout_margin="16dp"
+        android:layout_height="160dp" />
 
     <TextView
         android:id="@+id/tv_ble_name"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:text="" />
-
-    <TextView
-        android:id="@+id/tv_ble_bond_tate"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:text="" />
-
-    <TextView
-        android:id="@+id/tv_ble_rssi"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:text="" />
-
-    <TextView
-        android:id="@+id/tv_ble_address"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="start"
+        android:layout_gravity="center_horizontal"
         android:text="" />
 
-    <TextView
-        android:id="@+id/tv_ble_address_type"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:text="" />
 </LinearLayout>

+ 22 - 1
xiaodou/src/main/res/layout/item_wifi_add.xml

@@ -1,6 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="48dp">
 
+    <ImageView
+        android:id="@+id/iv_wifi_rssi"
+        android:layout_width="48dp"
+        android:layout_height="0dp"
+        android:contentDescription="wifi rssi"
+        android:src="@android:drawable/ic_menu_add"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_wifi_name"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:gravity="center_vertical"
+        android:text="手动添加一个WIFI"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toRightOf="@id/iv_wifi_rssi"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 </androidx.constraintlayout.widget.ConstraintLayout>

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor