195 lines
7.3 KiB
Kotlin
195 lines
7.3 KiB
Kotlin
package com.example.defenseapplication.home
|
|
|
|
import android.Manifest
|
|
import android.app.Activity
|
|
import android.content.Intent
|
|
import android.content.pm.PackageManager
|
|
import android.os.Build
|
|
import android.os.Bundle
|
|
import android.os.Handler
|
|
import android.os.Looper
|
|
import android.view.View
|
|
import android.widget.Toast
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.recyclerview.widget.GridLayoutManager
|
|
import com.example.defenseapplication.R
|
|
import com.example.defenseapplication.adapter.AddDeviceAdapter
|
|
import com.example.defenseapplication.adapter.Device
|
|
import com.example.defenseapplication.databinding.AddDeviceActivityBinding
|
|
import com.gyf.immersionbar.ImmersionBar
|
|
import com.maning.mlkitscanner.scan.MNScanManager
|
|
import com.maning.mlkitscanner.scan.callback.act.MNScanCallback
|
|
|
|
//添加设备页面
|
|
class AddDeviceActivity : AppCompatActivity() {
|
|
|
|
private lateinit var binding: AddDeviceActivityBinding
|
|
private lateinit var adapter: AddDeviceAdapter
|
|
private val mainHandler = Handler(Looper.getMainLooper())
|
|
|
|
private val requestPermissionsLauncher = registerForActivityResult(
|
|
ActivityResultContracts.RequestMultiplePermissions()
|
|
) { permissions ->
|
|
val cameraGranted = permissions[Manifest.permission.CAMERA] ?: false
|
|
|
|
val storageGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
permissions[Manifest.permission.READ_MEDIA_IMAGES] ?: false
|
|
} else {
|
|
permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: false
|
|
}
|
|
|
|
if (cameraGranted && storageGranted) {
|
|
startScan()
|
|
} else {
|
|
Toast.makeText(this, R.string.permission_denied, Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
|
|
private fun checkPermissionsAndScan() {
|
|
val cameraPermission = ContextCompat.checkSelfPermission(
|
|
this,
|
|
Manifest.permission.CAMERA
|
|
)
|
|
|
|
val storagePermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
ContextCompat.checkSelfPermission(
|
|
this,
|
|
Manifest.permission.READ_MEDIA_IMAGES
|
|
)
|
|
} else {
|
|
ContextCompat.checkSelfPermission(
|
|
this,
|
|
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
|
)
|
|
}
|
|
|
|
if (cameraPermission == PackageManager.PERMISSION_GRANTED &&
|
|
storagePermission == PackageManager.PERMISSION_GRANTED) {
|
|
startScan()
|
|
} else {
|
|
val permissionsToRequest = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
arrayOf(
|
|
Manifest.permission.CAMERA,
|
|
Manifest.permission.READ_MEDIA_IMAGES
|
|
)
|
|
} else {
|
|
arrayOf(
|
|
Manifest.permission.CAMERA,
|
|
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
|
)
|
|
}
|
|
requestPermissionsLauncher.launch(permissionsToRequest)
|
|
}
|
|
}
|
|
|
|
private fun startScan() {
|
|
MNScanManager.startScan(this, object: MNScanCallback {
|
|
override fun onActivityResult(resultCode: Int, data: Intent?) {
|
|
when (resultCode) {
|
|
MNScanManager.RESULT_SUCCESS -> {
|
|
val result = data?.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS)
|
|
if (!result.isNullOrEmpty()) {
|
|
ToastUtils.showToast(this@AddDeviceActivity, "扫码成功: $result")
|
|
} else {
|
|
ToastUtils.showToast(this@AddDeviceActivity, "扫码结果为空")
|
|
}
|
|
}
|
|
MNScanManager.RESULT_FAIL -> {
|
|
val error = data?.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR)
|
|
ToastUtils.showToast(this@AddDeviceActivity, "扫码失败: $error")
|
|
}
|
|
MNScanManager.RESULT_CANCLE -> {
|
|
ToastUtils.showToast(this@AddDeviceActivity, "扫码取消")
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
binding = AddDeviceActivityBinding.inflate(layoutInflater)
|
|
setContentView(binding.root)
|
|
ImmersionBar.with(this)
|
|
.statusBarDarkFont(true)
|
|
.titleBar(binding.topBar)
|
|
.init()
|
|
binding.ivBack.setOnClickListener {
|
|
finish()
|
|
}
|
|
|
|
binding.btnScanAdd.setOnClickListener {
|
|
checkPermissionsAndScan()
|
|
}
|
|
|
|
// 开始播放扫描动画,动画结束后再显示设备列表
|
|
startScanAnimationThenShowList()
|
|
}
|
|
|
|
private fun startScanAnimationThenShowList() {
|
|
// 显示动画层
|
|
binding.animationContainer.visibility = View.VISIBLE
|
|
binding.rvDevices.visibility = View.GONE
|
|
|
|
// 设置帧动画并启动
|
|
binding.ivScanAnimation.setImageResource(R.drawable.device_frame_animation)
|
|
val scanDrawable = binding.ivScanAnimation.drawable
|
|
if (scanDrawable is android.graphics.drawable.AnimationDrawable) {
|
|
scanDrawable.start()
|
|
}
|
|
|
|
// 模拟扫描过程
|
|
mainHandler.postDelayed({
|
|
// 停止动画
|
|
(binding.ivScanAnimation.drawable as? android.graphics.drawable.AnimationDrawable)?.stop()
|
|
// 隐藏动画层,显示列表
|
|
binding.animationContainer.visibility = View.GONE
|
|
binding.rvDevices.visibility = View.VISIBLE
|
|
setupDeviceList() // 加载设备列表
|
|
}, 3000) // 动画播放时长,可根据实际帧动画总时长调整
|
|
}
|
|
|
|
private fun setupDeviceList() {
|
|
val devices = listOf(
|
|
Device(getString(R.string.smart_hanging_defense), "device1"),
|
|
Device(getString(R.string.smart_defense_device), "device2")
|
|
)
|
|
|
|
if (devices.isEmpty()) {
|
|
|
|
binding.rvDevices.visibility = View.GONE
|
|
} else {
|
|
|
|
binding.rvDevices.visibility = View.VISIBLE
|
|
|
|
binding.rvDevices.layoutManager = GridLayoutManager(this, 2)
|
|
adapter = AddDeviceAdapter(devices) { device ->
|
|
val intent = Intent(this, AddFamilyActivity::class.java)
|
|
intent.putExtra("device_name", device.name)
|
|
startActivity(intent)
|
|
}
|
|
binding.rvDevices.adapter = adapter
|
|
}
|
|
}
|
|
override fun onPause() {
|
|
super.onPause()
|
|
// 停止所有可见 item 的动画
|
|
for (i in 0 until binding.rvDevices.childCount) {
|
|
val child = binding.rvDevices.getChildAt(i)
|
|
val holder = binding.rvDevices.getChildViewHolder(child) as? AddDeviceAdapter.ViewHolder
|
|
holder?.stopAnimation()
|
|
}
|
|
}
|
|
|
|
override fun onResume() {
|
|
super.onResume()
|
|
// 重新启动所有可见 item 的动画
|
|
for (i in 0 until binding.rvDevices.childCount) {
|
|
val child = binding.rvDevices.getChildAt(i)
|
|
val holder = binding.rvDevices.getChildViewHolder(child) as? AddDeviceAdapter.ViewHolder
|
|
holder?.startAnimation()
|
|
}
|
|
}
|
|
} |