ha-android/app/src/main/java/io/homeassistant/companion/android/nfc/NfcSetupActivity.kt

142 lines
5.0 KiB
Kotlin

package io.homeassistant.companion.android.nfc
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.nfc.NfcAdapter
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.BaseActivity
import io.homeassistant.companion.android.common.R as commonR
import io.homeassistant.companion.android.nfc.views.LoadNfcView
import io.homeassistant.companion.android.util.UrlUtil
import io.homeassistant.companion.android.util.compose.HomeAssistantAppTheme
import kotlinx.coroutines.launch
@AndroidEntryPoint
class NfcSetupActivity : BaseActivity() {
private val viewModel: NfcViewModel by viewModels()
private var mNfcAdapter: NfcAdapter? = null
private var simpleWrite = false
private var messageId: Int = -1
private val nfcStateChangedReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == NfcAdapter.ACTION_ADAPTER_STATE_CHANGED) viewModel.checkNfcEnabled()
}
}
companion object {
val TAG = NfcSetupActivity::class.simpleName
const val EXTRA_TAG_VALUE = "tag_value"
const val EXTRA_MESSAGE_ID = "message_id"
const val NAV_WELCOME = "nfc_welcome"
const val NAV_READ = "nfc_read"
const val NAV_WRITE = "nfc_write"
const val NAV_EDIT = "nfc_edit"
fun newInstance(context: Context, tagId: String? = null, messageId: Int = -1): Intent {
return Intent(context, NfcSetupActivity::class.java).apply {
putExtra(EXTRA_MESSAGE_ID, messageId)
if (tagId != null) {
putExtra(EXTRA_TAG_VALUE, tagId)
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
intent.getStringExtra(EXTRA_TAG_VALUE)?.let {
simpleWrite = true
viewModel.writeNewTagSimple(it)
}
setContent {
HomeAssistantAppTheme {
LoadNfcView(
viewModel = viewModel,
startDestination = if (simpleWrite) NAV_WRITE else NAV_WELCOME,
pressedUpAtRoot = { finish() }
)
}
}
mNfcAdapter = NfcAdapter.getDefaultAdapter(this)
messageId = intent.getIntExtra(EXTRA_MESSAGE_ID, -1)
}
override fun onResume() {
super.onResume()
viewModel.checkNfcEnabled()
mNfcAdapter?.let {
NFCUtil.enableNFCInForeground(it, this, javaClass)
}
registerReceiver(
nfcStateChangedReceiver,
IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)
)
}
override fun onPause() {
super.onPause()
mNfcAdapter?.let {
NFCUtil.disableNFCInForeground(it, this)
}
unregisterReceiver(nfcStateChangedReceiver)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (intent.action == NfcAdapter.ACTION_TECH_DISCOVERED) {
lifecycleScope.launch {
val nfcTagToWriteUUID = viewModel.nfcTagIdentifier
// Create new nfc tag
if (!viewModel.nfcEventShouldWrite) {
val url = NFCUtil.extractUrlFromNFCIntent(intent)
val nfcTagId = UrlUtil.splitNfcTagId(url)
if (nfcTagId == null) {
viewModel.onNfcReadEmpty()
} else {
viewModel.onNfcReadSuccess(nfcTagId)
}
} else {
try {
val nfcTagUrl = "https://www.home-assistant.io/tag/$nfcTagToWriteUUID"
NFCUtil.createNFCMessage(nfcTagUrl, intent)
Log.d(TAG, "Wrote nfc tag with url: $nfcTagUrl")
// If we are a simple write it means the frontend asked us to write. This means
// we should return the user as fast as possible back to the UI to continue what
// they were doing!
if (simpleWrite) {
val message = commonR.string.nfc_write_tag_success
Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show()
setResult(messageId)
finish()
} else {
viewModel.onNfcWriteSuccess(nfcTagToWriteUUID!!)
}
} catch (e: Exception) {
viewModel.onNfcWriteFailure()
Log.e(TAG, "Unable to write tag.", e)
}
}
}
}
}
}