zhaoyadi vor 8 Monaten
Ursprung
Commit
e2b3c820c0
44 geänderte Dateien mit 395 neuen und 123 gelöschten Zeilen
  1. 0 1
      .idea/codeStyles/Project.xml
  2. 1 1
      demo/src/main/AndroidManifest.xml
  3. 5 1
      xiaodou/build.gradle
  4. 12 4
      xiaodou/src/main/AndroidManifest.xml
  5. 90 0
      xiaodou/src/main/java/com/luojigou/product/ProductSelectActivity.kt
  6. 24 0
      xiaodou/src/main/java/com/luojigou/product/base/BaseActivity.kt
  7. 15 13
      xiaodou/src/main/java/com/luojigou/product/xiaodou/XDConnectActivity.kt
  8. 15 15
      xiaodou/src/main/java/com/luojigou/product/xiaodou/XDConnectService.kt
  9. 31 0
      xiaodou/src/main/java/com/luojigou/product/xiaodou/XDIntroduceActivity.kt
  10. 16 14
      xiaodou/src/main/java/com/luojigou/product/xiaodou/XDScanBLEActivity.kt
  11. 12 10
      xiaodou/src/main/java/com/luojigou/product/xiaodou/XDScanWifiActivity.kt
  12. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDBLEConnectStatus.kt
  13. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDBLEController.kt
  14. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDBLEUtils.kt
  15. 6 6
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEAdapter.kt
  16. 12 8
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEDevice.kt
  17. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEDisableFragment.kt
  18. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEGattCallback.kt
  19. 14 8
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLENormalFragment.kt
  20. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLENotSupportFragment.kt
  21. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEPermissionFragment.kt
  22. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEStatus.kt
  23. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectConnectingFragment.kt
  24. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectErrorFragment.kt
  25. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectFailFragment.kt
  26. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectNotFoundFragment.kt
  27. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectPasswordErrorFragment.kt
  28. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectSuccessFragment.kt
  29. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectTimeoutFragment.kt
  30. 8 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiAdapter.kt
  31. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiDisableFragment.kt
  32. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiEntity.kt
  33. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiInfo.kt
  34. 3 3
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiNormalFragment.kt
  35. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiPasswordFragment.kt
  36. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiPasswordWithSsidFragment.kt
  37. 2 2
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiPermissionFragment.kt
  38. 1 1
      xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiStatus.kt
  39. 24 0
      xiaodou/src/main/res-xiaodou/layout/activity_xd_introduce.xml
  40. 27 0
      xiaodou/src/main/res/drawable/ic_lock.xml
  41. 11 0
      xiaodou/src/main/res/layout/activity_product_select.xml
  42. 8 0
      xiaodou/src/main/res/layout/fragment_scanble_normal.xml
  43. 20 0
      xiaodou/src/main/res/layout/item_product.xml
  44. 5 1
      xiaodou/src/main/res/values/themes.xml

+ 0 - 1
.idea/codeStyles/Project.xml

@@ -1,7 +1,6 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
     <JetCodeStyleSettings>
-      <option name="WRAP_EXPRESSION_BODY_FUNCTIONS" value="2" />
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
     </JetCodeStyleSettings>
     <codeStyleSettings language="Dart">

+ 1 - 1
demo/src/main/AndroidManifest.xml

@@ -10,7 +10,7 @@
         android:theme="@style/Theme.Xiaodou">
 
         <activity
-            android:name="com.luojigou.xiaodou.XDScanBLEActivity"
+            android:name="com.luojigou.product.ProductSelectActivity"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />

+ 5 - 1
xiaodou/build.gradle

@@ -5,7 +5,7 @@ plugins {
 }
 
 android {
-    namespace 'com.luojigou.xiaodou'
+    namespace 'com.luojigou.product'
     compileSdk 33
 
     defaultConfig {
@@ -33,6 +33,10 @@ android {
                     'libs',
                     'src/main/cpp/libs'
             ]
+
+            res{
+                srcDir("src/main/res-xiaodou")
+            }
         }
     }
     buildFeatures {

+ 12 - 4
xiaodou/src/main/AndroidManifest.xml

@@ -39,19 +39,27 @@
 
     <application>
         <activity
-            android:name=".XDScanBLEActivity"
+            android:name=".ProductSelectActivity"
             android:theme="@style/XDTheme" />
 
         <activity
-            android:name=".XDScanWifiActivity"
+            android:name=".xiaodou.XDScanBLEActivity"
             android:theme="@style/XDTheme" />
 
         <activity
-            android:name=".XDConnectActivity"
+            android:name=".xiaodou.XDScanWifiActivity"
+            android:theme="@style/XDTheme" />
+
+        <activity
+            android:name=".xiaodou.XDConnectActivity"
+            android:theme="@style/XDTheme" />
+
+        <activity
+            android:name=".xiaodou.XDIntroduceActivity"
             android:theme="@style/XDTheme" />
 
         <service
-            android:name=".XDConnectService"
+            android:name=".xiaodou.XDConnectService"
             android:exported="false"
             android:foregroundServiceType="connectedDevice" />
     </application>

+ 90 - 0
xiaodou/src/main/java/com/luojigou/product/ProductSelectActivity.kt

@@ -0,0 +1,90 @@
+package com.luojigou.product
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.luojigou.product.base.BaseActivity
+import com.luojigou.product.xiaodou.XDIntroduceActivity
+import com.google.android.material.R.drawable as MaterialDrawable
+
+class ProductSelectActivity : BaseActivity() {
+    private lateinit var productAdapter: ProductAdapter
+    private lateinit var productLayoutManager: GridLayoutManager
+    private lateinit var productRecyclerView: RecyclerView
+
+    private val productList = listOf(
+        ProductModel(0, "小逗AI学习机", MaterialDrawable.ic_clock_black_24dp),
+        ProductModel(1, "中逗AI学习机", MaterialDrawable.ic_keyboard_black_24dp),
+        ProductModel(2, "大逗AI学习机", MaterialDrawable.material_ic_calendar_black_24dp),
+    )
+
+    override fun onCreate(savedInstanceState: android.os.Bundle?) {
+        super.onCreate(savedInstanceState)
+        setTitle("支持的设备列表")
+
+        productRecyclerView = findViewById(R.id.rv_product_list)
+
+        productAdapter = ProductAdapter(productList)
+        productAdapter.setOnItemClickListener { p ->
+            when (p.id) {
+                0 -> startActivity(Intent(this, XDIntroduceActivity::class.java))
+                1 -> { // TODO: 跳转到中逗AI学习机
+                }
+
+                2 -> { // TODO: 跳转到大逗AI学习机
+                }
+            }
+        }
+        productLayoutManager = GridLayoutManager(this, 2)
+        productRecyclerView.layoutManager = productLayoutManager
+        productRecyclerView.adapter = productAdapter
+    }
+
+    override fun getLayoutId(): Int = R.layout.activity_product_select
+
+    class ProductAdapter() : RecyclerView.Adapter<ViewHolder>() {
+        private val dataList = ArrayList<ProductModel>()
+
+        private var onItemClickListener: ((ProductModel) -> Unit)? = null
+
+        constructor(list: List<ProductModel>) : this() {
+            dataList.addAll(list)
+        }
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+            val itemView = LayoutInflater.from(parent.context)
+                .inflate(R.layout.item_product, parent, false)
+            return ViewHolder(itemView)
+        }
+
+        override fun getItemCount(): Int = dataList.size
+
+        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+            val product = dataList[position]
+            holder.name.text = product.name
+            holder.img.setImageResource(product.icon)
+
+            holder.itemView.setOnClickListener {
+                onItemClickListener?.invoke(product)
+            }
+        }
+
+        fun setOnItemClickListener(listener: (ProductModel) -> Unit) {
+            onItemClickListener = listener
+        }
+    }
+
+    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val name = itemView.findViewById<android.widget.TextView>(R.id.tv_product_name)
+        val img = itemView.findViewById<android.widget.ImageView>(R.id.iv_product_img)
+    }
+
+    data class ProductModel(
+        val id: Int,
+        val name: String,
+        val icon: Int,
+    )
+}

+ 24 - 0
xiaodou/src/main/java/com/luojigou/product/base/BaseActivity.kt

@@ -0,0 +1,24 @@
+package com.luojigou.product.base
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+
+abstract class BaseActivity : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(getLayoutId())
+    }
+
+    @LayoutRes
+    protected abstract fun getLayoutId(): Int
+
+    protected fun setTitle(title: String) {
+        supportActionBar?.run {
+            this.title = title
+            this.setDisplayHomeAsUpEnabled(true)
+            this.setBackgroundDrawable(ColorDrawable(0x00000000))
+        }
+    }
+}

+ 15 - 13
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDConnectActivity.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/XDConnectActivity.kt

@@ -1,24 +1,24 @@
-package com.luojigou.hardware.xiaodou
+package com.luojigou.product.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
+import com.luojigou.product.R
+import com.luojigou.product.base.BaseActivity
+import com.luojigou.product.xiaodou.connect.XDConnectConnectingFragment
+import com.luojigou.product.xiaodou.connect.XDConnectErrorFragment
+import com.luojigou.product.xiaodou.connect.XDConnectFailFragment
+import com.luojigou.product.xiaodou.connect.XDConnectNotFoundFragment
+import com.luojigou.product.xiaodou.connect.XDConnectPasswordErrorFragment
+import com.luojigou.product.xiaodou.connect.XDConnectSuccessFragment
+import com.luojigou.product.xiaodou.connect.XDConnectTimeoutFragment
+import com.luojigou.product.xiaodou.wifi.XDScanWifiInfo
 
-class XDConnectActivity : AppCompatActivity() {
+class XDConnectActivity : BaseActivity() {
     companion object {
         fun startConnect(context: Context, device: XDScanWifiInfo) {
             val intent = Intent(context, XDConnectActivity::class.java)
@@ -54,7 +54,7 @@ class XDConnectActivity : AppCompatActivity() {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_connect)
+        setTitle("连接Wi-Fi")
         setFragment(connectingFragment)
 
         val intentFilter = IntentFilter()
@@ -84,6 +84,8 @@ class XDConnectActivity : AppCompatActivity() {
         }
     }
 
+    override fun getLayoutId(): Int = R.layout.activity_connect
+
     private fun setFragment(fragment: Fragment) {
         val fragmentManager = supportFragmentManager;
         val beginTransaction = fragmentManager.beginTransaction()

+ 15 - 15
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDConnectService.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/XDConnectService.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou
+package com.luojigou.product.xiaodou
 
 import android.annotation.SuppressLint
 import android.app.Service
@@ -25,8 +25,9 @@ import androidx.core.app.NotificationChannelCompat
 import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationManagerCompat
 import androidx.core.content.ContextCompat
-import com.luojigou.hardware.xiaodou.ble.XDBLEUtils
-import com.luojigou.hardware.xiaodou.wifi.XDScanWifiInfo
+import com.luojigou.product.xiaodou.ble.XDBLEUtils
+import com.luojigou.product.xiaodou.ble.XDScanBLEDevice
+import com.luojigou.product.xiaodou.wifi.XDScanWifiInfo
 import java.util.UUID
 import kotlin.concurrent.thread
 
@@ -68,7 +69,7 @@ class XDConnectService : Service() {
         private val bleChannelName = "BLE-CHANNEL"
     }
 
-    private val bluetoothDevices: MutableMap<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice, BluetoothDevice> = HashMap()
+    private val bluetoothDevices: MutableList<XDScanBLEDevice> = mutableListOf()
 
     private lateinit var bluetoothManager: BluetoothManager
 
@@ -90,12 +91,10 @@ class XDConnectService : Service() {
                     val bleDevice = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                         intent.getParcelableExtra(
                             ACTION_SELECT_BLE_DEVICE_DATA,
-                            com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice::class.java
+                            XDScanBLEDevice::class.java
                         )
                     } else {
-                        intent.getParcelableExtra<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice>(
-                            ACTION_SELECT_BLE_DEVICE
-                        )
+                        intent.getParcelableExtra(ACTION_SELECT_BLE_DEVICE)
                     }
 
                     bleDevice?.let { connectBLE(it) }
@@ -164,19 +163,19 @@ class XDConnectService : Service() {
 
                 if (!device.name.startsWith("XiaoDouAI")) return
 
-                val device = com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice(
+                val device = XDScanBLEDevice(
                     name = device.name ?: "unknown",
                     bondState = device.bondState.toString(),
                     rssi = rssi.toString(),
                     address = device.address,
                     addressType = device.type.toString(),
+                    device = device
                 )
 
-                if (!bluetoothDevices.contains(device)) {
-                    bluetoothDevices[device] = result.device
+                if (bluetoothDevices.firstOrNull { it.address == device.address } == null) {
+                    bluetoothDevices.add(device)
                 }
             }
-
         }
     }
 
@@ -265,14 +264,15 @@ class XDConnectService : Service() {
     private fun sendResult() {
         val intent = Intent(ACTION_SCAN_RESULT)
         intent.putParcelableArrayListExtra(
-            ACTION_SCAN_RESULT_DATA, ArrayList(bluetoothDevices.keys)
+            ACTION_SCAN_RESULT_DATA, ArrayList(bluetoothDevices)
         )
         sendBroadcast(intent)
     }
 
-    private fun connectBLE(device: com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) {
+    private fun connectBLE(device: XDScanBLEDevice) {
         broadcastUpdate(ACTION_CONNECT_BLE)
-        val bleDevice = bluetoothDevices[device] ?: return
+        val bleDevice = bluetoothDevices.firstOrNull { it.address == device.address }?.device
+            ?: return
 
         bluetoothGatt = bleDevice.connectGatt(
             this,

+ 31 - 0
xiaodou/src/main/java/com/luojigou/product/xiaodou/XDIntroduceActivity.kt

@@ -0,0 +1,31 @@
+package com.luojigou.product.xiaodou
+
+import android.content.Intent
+import android.view.View
+import android.widget.Button
+import com.luojigou.product.R
+import com.luojigou.product.base.BaseActivity
+
+class XDIntroduceActivity : BaseActivity(), View.OnClickListener {
+
+    private lateinit var buttonStart: Button
+
+    override fun onCreate(savedInstanceState: android.os.Bundle?) {
+        super.onCreate(savedInstanceState)
+        setTitle("连接引导")
+
+        buttonStart = findViewById(R.id.btn_xd_start)
+        buttonStart.setOnClickListener(this)
+    }
+
+    override fun getLayoutId(): Int = R.layout.activity_xd_introduce
+
+    override fun onClick(v: View?) {
+        when (v?.id) {
+            R.id.btn_xd_start -> {
+                val intent = Intent(this, XDScanBLEActivity::class.java)
+                startActivity(intent)
+            }
+        }
+    }
+}

+ 16 - 14
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/XDScanBLEActivity.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/XDScanBLEActivity.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou
+package com.luojigou.product.xiaodou
 
 import android.Manifest
 import android.bluetooth.BluetoothAdapter
@@ -10,17 +10,18 @@ import android.content.IntentFilter
 import android.content.pm.PackageManager
 import android.os.Build
 import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
 import androidx.core.app.ActivityCompat
 import androidx.fragment.app.Fragment
-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
+import com.luojigou.product.R
+import com.luojigou.product.base.BaseActivity
+import com.luojigou.product.xiaodou.ble.XDScanBLEDisableFragment
+import com.luojigou.product.xiaodou.ble.XDScanBLENormalFragment
+import com.luojigou.product.xiaodou.ble.XDScanBLENotSupportFragment
+import com.luojigou.product.xiaodou.ble.XDScanBLEPermissionFragment
+import com.luojigou.product.xiaodou.ble.XDScanBLEStatus
 
 
-class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
+class XDScanBLEActivity : BaseActivity(), XDScanBLEStatus.Host {
     private val permissions: Array<String> by lazy {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
             arrayOf(
@@ -36,7 +37,7 @@ class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
     }
 
     private val disableFragment = XDScanBLEDisableFragment(this)
-    private val normalFragment = com.luojigou.hardware.xiaodou.ble.XDScanBLENormalFragment(this)
+    private val normalFragment = XDScanBLENormalFragment(this)
     private val permissionFragment = XDScanBLEPermissionFragment(this)
     private val notsupportFragment = XDScanBLENotSupportFragment(this)
 
@@ -70,9 +71,12 @@ class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_scanble)
+        setTitle("请选择要连接的设备")
     }
 
+    override fun getLayoutId(): Int = R.layout.activity_scanble
+
+
     override fun onResume() {
         super.onResume()
         registerReceiver(broadcastReceiver, IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED))
@@ -86,8 +90,7 @@ class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
 
     private fun checkBluetoothPermissionAndEnable() {
         val bluetoothAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
-        val bluetoothLEAvailable =
-            packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
+        val bluetoothLEAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
 
         if (!bluetoothAvailable || !bluetoothLEAvailable) {
             setFragment(notsupportFragment)
@@ -122,6 +125,5 @@ class XDScanBLEActivity : AppCompatActivity(), XDScanBLEStatus.Host {
         beginTransaction.commit()
     }
 
-    override fun onStatusChanged(status: XDScanBLEStatus) =
-        checkBluetoothPermissionAndEnable()
+    override fun onStatusChanged(status: XDScanBLEStatus) = checkBluetoothPermissionAndEnable()
 }

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou
+package com.luojigou.product.xiaodou
 
 import android.content.BroadcastReceiver
 import android.content.Context
@@ -9,15 +9,15 @@ import android.net.ConnectivityManager
 import android.net.wifi.WifiManager
 import android.os.Build
 import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
 import androidx.fragment.app.Fragment
-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 {
+import com.luojigou.product.R
+import com.luojigou.product.base.BaseActivity
+import com.luojigou.product.xiaodou.wifi.XDScanWifiDisableFragment
+import com.luojigou.product.xiaodou.wifi.XDScanWifiNormalFragment
+import com.luojigou.product.xiaodou.wifi.XDScanWifiPermissionFragment
+import com.luojigou.product.xiaodou.wifi.XDScanWifiStatus
+
+class XDScanWifiActivity : BaseActivity(), XDScanWifiStatus.Host {
     companion object {
         fun start(context: Context) {
             context.startActivity(Intent(context, XDScanWifiActivity::class.java))
@@ -38,11 +38,13 @@ class XDScanWifiActivity : AppCompatActivity(), XDScanWifiStatus.Host {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_scanwifi)
+        setTitle("请选择要连接的Wi-Fi")
 
         wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
     }
 
+    override fun getLayoutId(): Int = R.layout.activity_scanwifi
+
     override fun onResume() {
         super.onResume()
         setupReceiver()

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

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

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

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

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
 import android.util.Log
 

+ 6 - 6
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEAdapter.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEAdapter.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
 import android.annotation.SuppressLint
 import android.view.LayoutInflater
@@ -8,14 +8,14 @@ import android.widget.ImageView
 import android.widget.TextView
 import androidx.collection.ArraySet
 import androidx.recyclerview.widget.RecyclerView
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 
 @SuppressLint("MissingPermission")
 class XDScanBLEAdapter(
-    private val itemClickListener: (com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) -> Unit,
+    private val itemClickListener: (com.luojigou.product.xiaodou.ble.XDScanBLEDevice) -> Unit,
 ) : RecyclerView.Adapter<XDScanBLEAdapter.ViewHolder>() {
-    private val list: MutableSet<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice> = ArraySet()
+    private val list: MutableSet<com.luojigou.product.xiaodou.ble.XDScanBLEDevice> = ArraySet()
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
         val itemView: View =
@@ -39,13 +39,13 @@ class XDScanBLEAdapter(
     }
 
     @SuppressLint("NotifyDataSetChanged")
-    fun setValues(values: List<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice>) {
+    fun setValues(values: List<com.luojigou.product.xiaodou.ble.XDScanBLEDevice>) {
         list.clear()
         list.addAll(values)
         notifyDataSetChanged()
     }
 
-    fun addValue(value: com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) {
+    fun addValue(value: com.luojigou.product.xiaodou.ble.XDScanBLEDevice) {
         list.add(value)
         notifyItemChanged(list.size - 1)
     }

+ 12 - 8
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLEDevice.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLEDevice.kt

@@ -1,5 +1,6 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
+import android.bluetooth.BluetoothDevice
 import android.os.Parcel
 import android.os.Parcelable
 import java.util.Objects
@@ -10,24 +11,26 @@ data class XDScanBLEDevice(
     val bondState: String,
     val address: String,
     val addressType: String,
+    val device: BluetoothDevice,
 ) : Parcelable {
 
     // Parcelable Creator
     companion object {
         @JvmField
-        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(
+        val CREATOR: Parcelable.Creator<XDScanBLEDevice> = object :
+            Parcelable.Creator<XDScanBLEDevice> {
+            override fun createFromParcel(source: Parcel): XDScanBLEDevice {
+                return XDScanBLEDevice(
                     source.readString()!!,
                     source.readString()!!,
                     source.readString()!!,
                     source.readString()!!,
-                    source.readString()!!
+                    source.readString()!!,
+                    source.readParcelable(BluetoothDevice::class.java.classLoader)!!
                 )
             }
 
-            override fun newArray(size: Int): Array<com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice?> {
+            override fun newArray(size: Int): Array<XDScanBLEDevice?> {
                 return arrayOfNulls(size)
             }
         }
@@ -40,6 +43,7 @@ data class XDScanBLEDevice(
         dest.writeString(bondState)
         dest.writeString(address)
         dest.writeString(addressType)
+        dest.writeParcelable(device, flags)
     }
 
     // 实现 describeContents 方法(通常返回0)
@@ -52,7 +56,7 @@ data class XDScanBLEDevice(
     }
 
     override fun equals(other: Any?): Boolean {
-        return if (other is com.luojigou.hardware.xiaodou.ble.XDScanBLEDevice) {
+        return if (other is XDScanBLEDevice) {
             address == other.address && addressType == other.addressType
         } else {
             false

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
 import android.annotation.SuppressLint
 import android.bluetooth.BluetoothAdapter
@@ -11,7 +11,7 @@ import android.widget.Button
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.fragment.app.Fragment
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 @SuppressLint("MissingPermission")
 class XDScanBLEDisableFragment(private val host: XDScanBLEStatus.Host) : Fragment() {

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

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

+ 14 - 8
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/ble/XDScanBLENormalFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/ble/XDScanBLENormalFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
 import android.annotation.SuppressLint
 import android.content.BroadcastReceiver
@@ -10,19 +10,20 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.Button
+import android.widget.ProgressBar
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
-import com.luojigou.xiaodou.R
-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 com.luojigou.product.R
+import com.luojigou.product.xiaodou.XDConnectService
+import com.luojigou.product.xiaodou.XDConnectService.Companion.ACTION_SCAN_RESULT
+import com.luojigou.product.xiaodou.XDConnectService.Companion.ACTION_SCAN_RESULT_DATA
+import com.luojigou.product.xiaodou.XDConnectService.Companion.ACTION_START_SCAN
+import com.luojigou.product.xiaodou.XDConnectService.Companion.ACTION_STOP_SCAN
+import com.luojigou.product.xiaodou.XDScanWifiActivity
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.MainScope
 
@@ -42,6 +43,8 @@ class XDScanBLENormalFragment(private val host: XDScanBLEStatus.Host) : Fragment
 
     private lateinit var restartScanButton: Button
 
+    private lateinit var scanProgress: ProgressBar
+
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
     ): View? {
@@ -54,6 +57,7 @@ class XDScanBLENormalFragment(private val host: XDScanBLEStatus.Host) : Fragment
         selectWifi = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
             it.data
         }
+        scanProgress = view.findViewById(R.id.scan_progress)
 
         restartScanButton = view.findViewById<Button>(R.id.scan_again)
         restartScanButton.setOnClickListener { restartScan() }
@@ -75,10 +79,12 @@ class XDScanBLENormalFragment(private val host: XDScanBLEStatus.Host) : Fragment
             override fun onReceive(context: Context?, intent: Intent) {
                 when (intent.action) {
                     ACTION_START_SCAN -> {
+                        scanProgress.visibility = View.VISIBLE
                         restartScanButton.visibility = View.INVISIBLE
                     }
 
                     ACTION_STOP_SCAN -> {
+                        scanProgress.visibility = View.INVISIBLE
                         restartScanButton.visibility = View.VISIBLE
                     }
 

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

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
 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
+import com.luojigou.product.R
 
 class XDScanBLENotSupportFragment(private val host: XDScanBLEStatus.Host) : Fragment() {
     override fun onCreateView(

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.ble
+package com.luojigou.product.xiaodou.ble
 
 import android.Manifest
 import android.os.Build
@@ -11,7 +11,7 @@ import android.widget.Button
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.fragment.app.Fragment
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 class XDScanBLEPermissionFragment(private val host: XDScanBLEStatus.Host) : Fragment() {
     private lateinit var requestPermission: ActivityResultLauncher<Array<String>>

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

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

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectConnectingFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectConnectingFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectConnectingFragment : Fragment() {
     override fun onCreateView(

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectErrorFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectErrorFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectErrorFragment : Fragment() {
     override fun onCreateView(

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectFailFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectFailFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectFailFragment : Fragment() {
     override fun onCreateView(

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectNotFoundFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectNotFoundFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectNotFoundFragment : Fragment() {
     override fun onCreateView(

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectPasswordErrorFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectPasswordErrorFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectPasswordErrorFragment : Fragment() {
     override fun onCreateView(

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectSuccessFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectSuccessFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectSuccessFragment : Fragment() {
     override fun onCreateView(

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/connect/XDConnectTimeoutFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/connect/XDConnectTimeoutFragment.kt

@@ -1,11 +1,11 @@
-package com.luojigou.hardware.xiaodou.connect
+package com.luojigou.product.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
+import com.luojigou.product.R
 
 class XDConnectTimeoutFragment : Fragment() {
     override fun onCreateView(

+ 8 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiAdapter.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiAdapter.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.wifi
+package com.luojigou.product.xiaodou.wifi
 
 import android.net.wifi.ScanResult
 import android.os.Build
@@ -8,7 +8,7 @@ import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.recyclerview.widget.RecyclerView
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 class XDScanWifiAdapter(
     private val itemClickListener: (ScanResult) -> Unit,
@@ -49,6 +49,12 @@ class XDScanWifiAdapter(
                 holder.name.text = item.BSSID
             }
 
+            if (item.capabilities.contains("WPA")) {
+                holder.img.setImageResource(R.drawable.ic_lock)
+            } else {
+                holder.img.setImageIcon(null)
+            }
+
             holder.itemView.setOnClickListener {
                 itemClickListener.invoke(item)
             }

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.wifi
+package com.luojigou.product.xiaodou.wifi
 
 import android.content.Intent
 import android.net.wifi.WifiManager
@@ -12,7 +12,7 @@ import android.widget.Button
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.fragment.app.Fragment
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 class XDScanWifiDisableFragment(private val host: XDScanWifiStatus.Host) : Fragment() {
     private val openWifi: ActivityResultLauncher<Intent> =

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

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

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

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

+ 3 - 3
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiNormalFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiNormalFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.wifi
+package com.luojigou.product.xiaodou.wifi
 
 import android.annotation.SuppressLint
 import android.content.BroadcastReceiver
@@ -16,8 +16,8 @@ import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
-import com.luojigou.xiaodou.R
-import com.luojigou.hardware.xiaodou.XDConnectActivity
+import com.luojigou.product.R
+import com.luojigou.product.xiaodou.XDConnectActivity
 
 @SuppressLint("MissingPermission")
 class XDScanWifiNormalFragment(private val host: XDScanWifiStatus.Host) : Fragment() {

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.wifi
+package com.luojigou.product.xiaodou.wifi
 
 import android.os.Bundle
 import android.view.LayoutInflater
@@ -7,7 +7,7 @@ import android.view.ViewGroup
 import android.widget.Button
 import android.widget.EditText
 import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 class XDScanWifiPasswordFragment(private val onPasswordEdit: (password: String) -> Unit) :
     BottomSheetDialogFragment() {

+ 2 - 2
xiaodou/src/main/java/com/luojigou/hardware/xiaodou/wifi/XDScanWifiPasswordWithSsidFragment.kt → xiaodou/src/main/java/com/luojigou/product/xiaodou/wifi/XDScanWifiPasswordWithSsidFragment.kt

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.wifi
+package com.luojigou.product.xiaodou.wifi
 
 import android.content.Context
 import android.os.Bundle
@@ -9,7 +9,7 @@ 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
+import com.luojigou.product.R
 
 class XDScanWifiPasswordWithSsidFragment(private val onPasswordEdit: (ssid: String, password: String) -> Unit) :
     BottomSheetDialogFragment() {

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

@@ -1,4 +1,4 @@
-package com.luojigou.hardware.xiaodou.wifi
+package com.luojigou.product.xiaodou.wifi
 
 import android.os.Build
 import android.os.Bundle
@@ -10,7 +10,7 @@ import android.widget.Button
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.fragment.app.Fragment
-import com.luojigou.xiaodou.R
+import com.luojigou.product.R
 
 class XDScanWifiPermissionFragment(private val host: XDScanWifiStatus.Host) : Fragment() {
     private val requestPermission: ActivityResultLauncher<Array<String>> =

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

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

+ 24 - 0
xiaodou/src/main/res-xiaodou/layout/activity_xd_introduce.xml

@@ -0,0 +1,24 @@
+<?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">
+
+    <TextView
+        android:id="@+id/tv_xd_introduce"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="这里是连接指导说明"
+        app:layout_constraintBottom_toTopOf="@id/btn_xd_start"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <Button
+        android:id="@+id/btn_xd_start"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:text="确认并进入下一步"
+        app:layout_constraintBottom_toBottomOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 27 - 0
xiaodou/src/main/res/drawable/ic_lock.xml

@@ -0,0 +1,27 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:pathData="M5,13a2,2 0,0 1,2 -2h10a2,2 0,0 1,2 2v6a2,2 0,0 1,-2 2h-10a2,2 0,0 1,-2 -2v-6z"
+      android:strokeLineJoin="round"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="currentColor"
+      android:strokeLineCap="round"/>
+  <path
+      android:pathData="M11,16a1,1 0,1 0,2 0a1,1 0,0 0,-2 0"
+      android:strokeLineJoin="round"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="currentColor"
+      android:strokeLineCap="round"/>
+  <path
+      android:pathData="M8,11v-4a4,4 0,1 1,8 0v4"
+      android:strokeLineJoin="round"
+      android:strokeWidth="2"
+      android:fillColor="#00000000"
+      android:strokeColor="currentColor"
+      android:strokeLineCap="round"/>
+</vector>

+ 11 - 0
xiaodou/src/main/res/layout/activity_product_select.xml

@@ -0,0 +1,11 @@
+<?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.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_product_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 8 - 0
xiaodou/src/main/res/layout/fragment_scanble_normal.xml

@@ -9,6 +9,14 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
+    <ProgressBar
+        android:id="@+id/scan_progress"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/scan_again"

+ 20 - 0
xiaodou/src/main/res/layout/item_product.xml

@@ -0,0 +1,20 @@
+<?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="wrap_content"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/iv_product_img"
+        android:layout_width="match_parent"
+        android:layout_height="160dp"
+        android:layout_margin="16dp" />
+
+    <TextView
+        android:id="@+id/tv_product_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:text="" />
+
+</LinearLayout>

+ 5 - 1
xiaodou/src/main/res/values/themes.xml

@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <style name="XDTheme" parent="Theme.Material3.Light.NoActionBar">
+
+    <style name="XDTheme" parent="Theme.Material3.Light">
+        <item name="statusBarBackground">@android:color/transparent</item>
+        <item name="android:statusBarColor">@android:color/transparent</item>
+        <item name="android:windowLightStatusBar">true</item>
     </style>
 </resources>