feat: add text/plain intent to send message (#1389)

This commit is contained in:
Espié.R 2024-11-30 18:12:08 +01:00 committed by GitHub
parent 716a3f535f
commit d76eac258b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 228 additions and 0 deletions

View file

@ -79,6 +79,7 @@ import com.geeksville.mesh.ui.components.ScannedQrCodeDialog
import com.geeksville.mesh.ui.map.MapFragment
import com.geeksville.mesh.ui.navigateToMessages
import com.geeksville.mesh.ui.navigateToNavGraph
import com.geeksville.mesh.ui.navigateToShareMessage
import com.geeksville.mesh.ui.theme.AppTheme
import com.geeksville.mesh.util.Exceptions
import com.geeksville.mesh.util.LanguageUtils
@ -337,6 +338,13 @@ class MainActivity : AppCompatActivity(), Logging {
Intent.ACTION_MAIN -> {
}
Intent.ACTION_SEND -> {
val text = intent.getStringExtra(Intent.EXTRA_TEXT)
if (text != null) {
shareMessages(text)
}
}
else -> {
warn("Unexpected action $appLinkAction")
}
@ -607,6 +615,13 @@ class MainActivity : AppCompatActivity(), Logging {
}
}
private fun shareMessages(message: String?) {
model.setCurrentTab(0)
if (message != null) {
supportFragmentManager.navigateToShareMessage(message)
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)

View file

@ -61,6 +61,15 @@ internal fun FragmentManager.navigateToMessages(contactKey: String) {
.addToBackStack(null)
.commit()
}
internal fun FragmentManager.navigateToPreInitMessages(contactKey: String, message: String) {
val messagesFragment = MessagesFragment().apply {
arguments = bundleOf("contactKey" to contactKey, "message" to message)
}
beginTransaction()
.add(R.id.mainActivityLayout, messagesFragment)
.addToBackStack(null)
.commit()
}
@AndroidEntryPoint
class MessagesFragment : Fragment(), Logging {
@ -123,6 +132,9 @@ class MessagesFragment : Fragment(), Logging {
}
contactKey = arguments?.getString("contactKey").toString()
if (arguments?.getString("message") != null) {
binding.messageInputText.setText(arguments?.getString("message").toString())
}
val channelIndex = contactKey[0].digitToIntOrNull()
val nodeId = contactKey.substring(1)
val channelName = channelIndex?.let { model.channels.value.getChannel(it)?.name }

View file

@ -0,0 +1,128 @@
package com.geeksville.mesh.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.core.os.bundleOf
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.R
import com.geeksville.mesh.databinding.ShareFragmentBinding
import com.geeksville.mesh.model.Contact
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.ui.theme.AppTheme
import dagger.hilt.android.AndroidEntryPoint
internal fun FragmentManager.navigateToShareMessage(message: String) {
val shareFragment = ShareFragment().apply {
arguments = bundleOf("message" to message)
}
beginTransaction()
.add(R.id.mainActivityLayout, shareFragment)
.addToBackStack(null)
.commit()
}
@AndroidEntryPoint
class ShareFragment : ScreenFragment("Messages"), Logging {
private val model: UIViewModel by activityViewModels()
private var _binding: ShareFragmentBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val contacts get() = model.contactList.value
private var selectedContact = mutableStateOf("")
private fun shareMessage(contact: Contact) {
debug("calling MessagesFragment filter:${contact.contactKey}")
parentFragmentManager.navigateToPreInitMessages(
contact.contactKey,
arguments?.getString("message").toString()
)
}
private fun onClick(contact: Contact) {
if (selectedContact.value == contact.contactKey) {
selectedContact.value = ""
binding.shareButton.isEnabled = false
} else {
selectedContact.value = contact.contactKey
binding.shareButton.isEnabled = true
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = ShareFragmentBinding.inflate(inflater, container, false)
return binding.root
}
@Suppress("LongMethod", "CyclomaticComplexMethod")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.toolbar.setNavigationOnClickListener {
parentFragmentManager.popBackStack()
}
binding.shareButton.isEnabled = false
binding.shareButton.setOnClickListener {
debug("User clicked shareButton")
val contact = contacts.find { c -> c.contactKey == selectedContact.value }
if (contact != null) {
shareMessage(contact)
}
}
binding.contactListView.setContent {
val contacts by model.contactList.collectAsStateWithLifecycle()
AppTheme {
ShareContactListView(
contacts = contacts,
selectedContact = selectedContact.value,
onClick = ::onClick,
)
}
}
}
}
@Composable
fun ShareContactListView(
contacts: List<Contact>,
selectedContact: String,
onClick: (Contact) -> Unit,
) {
LazyColumn(
modifier = Modifier
.fillMaxSize(),
contentPadding = PaddingValues(6.dp),
) {
items(contacts, key = { it.contactKey }) { contact ->
val selected = contact.contactKey == selectedContact
ContactItem(
contact = contact,
selected = selected,
onClick = { onClick(contact) },
onLongClick = {},
)
}
}
}