WiFi管理

This commit is contained in:
2026-05-11 09:43:31 +08:00
parent 2c94ba767d
commit c91b646857
13 changed files with 501 additions and 35 deletions

View File

@@ -17,7 +17,7 @@ class AddDeviceAdapter(private val devices: List<Device>, private val onItemClic
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val ivIcon: ImageView = itemView.findViewById(R.id.ivDeviceIcon2)
val tvName: TextView = itemView.findViewById(R.id.tvDeviceName2) // 注意:ID 要和布局中一致
val tvName: TextView = itemView.findViewById(R.id.tvDeviceName2) // ID 要和布局中一致
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

View File

@@ -0,0 +1,37 @@
package com.example.defenseapplication.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.defenseapplication.databinding.ItemAddLinkedUserBinding
data class UserItem(val name: String, val phone: String)
class AddLinkedUserAdapter(
private val data: List<UserItem>,
private val selectedIds: MutableSet<String>,
private val onItemClick: (String, Boolean) -> Unit
) : RecyclerView.Adapter<AddLinkedUserAdapter.ViewHolder>() {
inner class ViewHolder(val binding: ItemAddLinkedUserBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: UserItem) {
binding.tvUserName.text = "${item.name}-${item.phone}"
binding.cbSelect.isChecked = selectedIds.contains(item.phone)
binding.cbSelect.setOnClickListener {
val isChecked = binding.cbSelect.isChecked
onItemClick(item.phone, isChecked)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemAddLinkedUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(data[position])
}
override fun getItemCount(): Int = data.size
}

View File

@@ -0,0 +1,61 @@
package com.example.defenseapplication.liveVideo
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AddLinkedUserAdapter
import com.example.defenseapplication.adapter.UserItem
import com.example.defenseapplication.databinding.AddLinkedUserActivityBinding
import com.gyf.immersionbar.ImmersionBar
class AddLinkedUserActivity : AppCompatActivity() {
private lateinit var binding: AddLinkedUserActivityBinding
private val selectedPhoneSet = mutableSetOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = AddLinkedUserActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.topBar)
.init()
initRecyclerView()
initListener()
}
private fun initRecyclerView() {
val mockData = listOf(
UserItem("王五", "13566666666"),
UserItem("赵六", "15733333333")
)
binding.rvAddLinkedUser.layoutManager = LinearLayoutManager(this)
binding.rvAddLinkedUser.adapter =
AddLinkedUserAdapter(mockData, selectedPhoneSet) { phone, isChecked ->
if (isChecked) {
selectedPhoneSet.add(phone)
} else {
selectedPhoneSet.remove(phone)
}
}
}
private fun initListener() {
binding.btnAddLinkedUser.setOnClickListener {
if (selectedPhoneSet.isEmpty()) {
Toast.makeText(this, getString(R.string.please_select_at_least_one_user), Toast.LENGTH_SHORT).show()
} else {
val message = getString(R.string.selected_users_voice, selectedPhoneSet.size)
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
binding.ivBack.setOnClickListener {
finish()
}
}
}

View File

@@ -12,7 +12,7 @@ import com.example.defenseapplication.adapter.LinkedUserAdapter
import com.example.defenseapplication.databinding.LinkedUserActivityBinding
import com.example.defenseapplication.view.CustomDialogFragmentText
import com.gyf.immersionbar.ImmersionBar
//关联用户页面
class LinkedUserActivity : AppCompatActivity() {
private lateinit var binding: LinkedUserActivityBinding
@@ -176,8 +176,8 @@ class LinkedUserActivity : AppCompatActivity() {
}
binding.btnAddLinkedUser.setOnClickListener {
val intent = Intent(this, LinkedUserSearchActivity::class.java)
startActivityForResult(intent, REQUEST_CODE_SEARCH)
val intent = Intent(this, AddLinkedUserActivity::class.java)
startActivity(intent)
}
}

View File

@@ -78,8 +78,10 @@ class SettingsActivity : BaseActivity() {
val intent = Intent(this, LinkedUserActivity::class.java)
startActivity( intent)
}
binding.itemWifiManage.setOnClickListener {
val intent = Intent(this, WiFiManagementActivity::class.java)
startActivity(intent)
}
}
}

View File

@@ -1,18 +1,36 @@
package com.example.defenseapplication.liveVideo
import android.Manifest
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.net.wifi.ScanResult
import android.net.wifi.WifiManager
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import android.text.Editable
import android.text.TextWatcher
import android.view.Gravity
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.PopupWindow
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.app.ActivityCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.DeviceInfoActivityBinding
import com.example.defenseapplication.databinding.LinkedUserActivityBinding
import com.example.defenseapplication.adapter.WifiListAdapter
import com.example.defenseapplication.databinding.DialogWifiListBinding
import com.example.defenseapplication.databinding.WifiManagementActivityBinding
import com.gyf.immersionbar.ImmersionBar
class WiFiManagementActivity : AppCompatActivity() {
private lateinit var binding: WifiManagementActivityBinding
private lateinit var wifiManager: WifiManager
private lateinit var wifiScanReceiver: BroadcastReceiver
private var popupWindow: PopupWindow? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = WifiManagementActivityBinding.inflate(layoutInflater)
@@ -24,5 +42,118 @@ class WiFiManagementActivity : AppCompatActivity() {
binding.ivBack.setOnClickListener {
finish()
}
binding.btnSelectWifi.setOnClickListener {
showWifiListDialog()
}
binding.etWifiName.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
updateBottomButtonVisibility()
}
})
wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
if (success) {
updateWifiList()
}
}
}
//点击确定成功失败吐司
binding.btnConfirm.setOnClickListener {
// if(){
// ToastUtils.showSuccess(this, getString(R.string.wifi_connection_success))
// }else{
// ToastUtils.showError(this, getString(R.string.wifi_connection_failed))
// }
}
}
private fun showWifiListDialog() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE),
1001)
return
}
if (!wifiManager.isWifiEnabled) {
wifiManager.isWifiEnabled = true
}
wifiManager.startScan()
val dialogBinding = DialogWifiListBinding.inflate(LayoutInflater.from(this))
popupWindow = PopupWindow(
dialogBinding.root,
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
isFocusable = true
setBackgroundDrawable(null)
setOnDismissListener {
binding.maskView.visibility = android.view.View.GONE
}
showAtLocation(window.decorView, Gravity.BOTTOM, 0, 0)
}
binding.maskView.visibility = android.view.View.VISIBLE
dialogBinding.rvWifiList.layoutManager = LinearLayoutManager(this@WiFiManagementActivity)
val wifiList = getWifiList()
dialogBinding.rvWifiList.adapter = WifiListAdapter(wifiList) { wifiName ->
binding.etWifiName.setText(wifiName)
popupWindow?.dismiss()
}
}
private fun updateBottomButtonVisibility() {
val wifiName = binding.etWifiName.text.toString().trim()
binding.bottomButtonLayout.visibility =
if (wifiName.isNotEmpty()) android.view.View.VISIBLE else android.view.View.GONE
}
private fun getWifiList(): List<String> {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
return emptyList()
}
val results: List<ScanResult> = wifiManager.scanResults
return results.map { it.SSID }.distinct()
}
private fun updateWifiList() {
popupWindow?.contentView?.findViewById<androidx.recyclerview.widget.RecyclerView>(R.id.rvWifiList)?.let { recyclerView ->
val wifiList = getWifiList()
recyclerView.adapter = WifiListAdapter(wifiList) { wifiName ->
binding.etWifiName.setText(wifiName)
popupWindow?.dismiss()
}
}
}
override fun onStart() {
super.onStart()
val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
registerReceiver(wifiScanReceiver, intentFilter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(wifiScanReceiver)
popupWindow?.dismiss()
}
}