diff --git a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt index e24a11d8..56a2b324 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt @@ -4,6 +4,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.EditorInfo +import android.widget.EditText import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager @@ -15,6 +17,17 @@ import com.geeksville.mesh.model.UIViewModel import kotlinx.android.synthetic.main.adapter_message_layout.view.* import kotlinx.android.synthetic.main.messages_fragment.* +// Allows usage like email.on(EditorInfo.IME_ACTION_NEXT, { confirm() }) +fun EditText.on(actionId: Int, func: () -> Unit) { + setOnEditorActionListener { _, receivedActionId, _ -> + + if (actionId == receivedActionId) { + func() + } + + true + } +} class MessagesFragment : ScreenFragment("Messages"), Logging { @@ -116,6 +129,9 @@ class MessagesFragment : ScreenFragment("Messages"), Logging { fun onMessagesChanged(nodesIn: Collection) { messages = nodesIn.toTypedArray() notifyDataSetChanged() // FIXME, this is super expensive and redraws all messages + + // scroll to the last line + messageListView.scrollToPosition(this.itemCount - 1) } } @@ -129,8 +145,18 @@ class MessagesFragment : ScreenFragment("Messages"), Logging { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + messageInputText.on(EditorInfo.IME_ACTION_DONE) { + debug("did IME action") + + val str = messageInputText.text.toString() + model.messagesState.sendMessage(str) + messageInputText.setText("") // blow away the string the user just entered + } + messageListView.adapter = messagesAdapter - messageListView.layoutManager = LinearLayoutManager(requireContext()) + val layoutManager = LinearLayoutManager(requireContext()) + layoutManager.stackFromEnd = true // We want the last rows to always be shown + messageListView.layoutManager = layoutManager model.messagesState.messages.observe(viewLifecycleOwner, Observer { it -> messagesAdapter.onMessagesChanged(it) diff --git a/app/src/main/res/layout/adapter_message_layout.xml b/app/src/main/res/layout/adapter_message_layout.xml index 4b5d90e9..1010e0dd 100644 --- a/app/src/main/res/layout/adapter_message_layout.xml +++ b/app/src/main/res/layout/adapter_message_layout.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="8dp" + android:layout_margin="4dp" android:clipToPadding="false"> + \ No newline at end of file diff --git a/app/src/main/res/layout/messages_fragment.xml b/app/src/main/res/layout/messages_fragment.xml index cd256986..33a271e3 100644 --- a/app/src/main/res/layout/messages_fragment.xml +++ b/app/src/main/res/layout/messages_fragment.xml @@ -6,14 +6,35 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1320300f..c506e4cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,4 +13,5 @@ 2.13 km hey I found the cache, it is over here next to the big tiger. I\'m kinda scared. Some Username + Send Text