diff --git a/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt index a2fac603..fa0d0526 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt @@ -2,7 +2,6 @@ package com.tutpro.baresip import android.app.Activity import android.content.Context -import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.os.SystemClock @@ -11,10 +10,12 @@ import android.view.MenuItem import android.view.View import android.view.WindowManager import android.view.inputmethod.InputMethodManager -import android.widget.* +import android.widget.EditText +import android.widget.ImageButton +import android.widget.ListView +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer -import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.tutpro.baresip.databinding.ActivityChatBinding class ChatActivity : AppCompatActivity() { @@ -78,63 +79,21 @@ class ChatActivity : AppCompatActivity() { listView = binding.messages chatMessages = uaPeerMessages(aor, peerUri) - mlAdapter = MessageListAdapter(this, chatMessages) + mlAdapter = MessageListAdapter(this, peerUri, chatMessages) - val messagesObserver = Observer { mlAdapter.notifyDataSetChanged() } + val messagesObserver = Observer { + chatMessages.clear() + chatMessages.addAll(uaPeerMessages(aor, peerUri)) + mlAdapter.notifyDataSetChanged() + } BaresipService.messageUpdate.observe(this, messagesObserver) listView.adapter = mlAdapter - listView.isLongClickable = true + //listView.isLongClickable = true val footerView = View(applicationContext) listView.addFooterView(footerView) listView.smoothScrollToPosition(mlAdapter.count - 1) - listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ -> - val dialogClickListener = DialogInterface.OnClickListener { _, which -> - when (which) { - DialogInterface.BUTTON_POSITIVE -> { - val i = Intent(this, ContactActivity::class.java) - val b = Bundle() - b.putBoolean("new", true) - b.putString("uri", peerUri) - i.putExtras(b) - startActivity(i) - } - DialogInterface.BUTTON_NEGATIVE -> { - Message.messages().remove(chatMessages[pos]) - chatMessages.removeAt(pos) - mlAdapter.notifyDataSetChanged() - if (chatMessages.size == 0) { - listView.removeFooterView(footerView) - } - Message.save() - } - DialogInterface.BUTTON_NEUTRAL -> { - } - } - } - val builder = MaterialAlertDialogBuilder(this@ChatActivity, R.style.AlertDialogTheme) - if (Contact.contactName(peerUri) == peerUri) - with (builder) { - setTitle(R.string.confirmation) - setMessage(String.format(getString(R.string.long_message_question), - chatPeer)) - setNeutralButton(getString(R.string.cancel), dialogClickListener) - setNegativeButton(getString(R.string.delete), dialogClickListener) - setPositiveButton(getString(R.string.add_contact), dialogClickListener) - show() - } - else - with (builder) { - setTitle(R.string.confirmation) - setMessage(getText(R.string.short_message_question)) - setNeutralButton(getString(R.string.cancel), dialogClickListener) - setNegativeButton(getString(R.string.delete), dialogClickListener) - show() - } - true - } - newMessage = binding.text newMessage.onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus -> if (hasFocus) { @@ -185,10 +144,9 @@ class ChatActivity : AppCompatActivity() { newMessage.requestFocus() BaresipService.chatTexts.remove("$aor::$peerUri") } - mlAdapter.clear() - chatMessages = uaPeerMessages(aor, peerUri) - mlAdapter = MessageListAdapter(this, chatMessages) - listView.adapter = mlAdapter + chatMessages.clear() + chatMessages.addAll(uaPeerMessages(aor, peerUri)) + mlAdapter.notifyDataSetChanged() } override fun onPause() { diff --git a/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt index e7038332..bc397401 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt @@ -1,18 +1,23 @@ package com.tutpro.baresip import android.content.Context +import android.content.DialogInterface +import android.content.Intent import android.graphics.Typeface -import androidx.core.content.ContextCompat +import android.os.Bundle import android.text.format.DateUtils.isToday import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.* - +import android.widget.ArrayAdapter +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +import com.google.android.material.dialog.MaterialAlertDialogBuilder import java.text.DateFormat import java.util.* -class MessageListAdapter(private val ctx: Context, private val rows: ArrayList) : +class MessageListAdapter(private val ctx: Context, private val peerUri: String, private val rows: ArrayList) : ArrayAdapter(ctx, R.layout.message, rows) { private val layoutInflater = LayoutInflater.from(context) @@ -37,6 +42,56 @@ class MessageListAdapter(private val ctx: Context, private val rows: ArrayList + when (which) { + DialogInterface.BUTTON_POSITIVE -> { + val i = Intent(ctx, ContactActivity::class.java) + val b = Bundle() + b.putBoolean("new", true) + b.putString("uri", peerUri) + i.putExtras(b) + ctx.startActivity(i) + } + DialogInterface.BUTTON_NEGATIVE -> { + Message.messages().remove(rows[position]) + Message.save() + rows.removeAt(position) + this.notifyDataSetChanged() + //if (rows.size == 0) { + // listView.removeFooterView(footerView) + //} + } + DialogInterface.BUTTON_NEUTRAL -> { + } + } + } + val builder = MaterialAlertDialogBuilder(ctx, R.style.AlertDialogTheme) + val chatPeer = Contact.contactName(peerUri) + if (Contact.contactName(peerUri) == peerUri) + with (builder) { + setTitle(R.string.confirmation) + setMessage(String.format(ctx.getString(R.string.long_message_question), + chatPeer)) + setNeutralButton(ctx.getString(R.string.cancel), dialogClickListener) + setNegativeButton(ctx.getString(R.string.delete), dialogClickListener) + setPositiveButton(ctx.getString(R.string.add_contact), dialogClickListener) + show() + } + else + with (builder) { + setTitle(R.string.confirmation) + setMessage(ctx.getText(R.string.short_message_question)) + setNeutralButton(ctx.getString(R.string.cancel), dialogClickListener) + setNegativeButton(ctx.getString(R.string.delete), dialogClickListener) + show() + } + } + + viewHolder.layoutView.setOnClickListener(listener) + viewHolder.infoView.setOnClickListener(listener) + viewHolder.textView.setOnClickListener(listener) + val message = rows[position] val down = (message.direction == R.drawable.arrow_down_green) || diff --git a/app/src/main/res/layout/message.xml b/app/src/main/res/layout/message.xml index 513805e8..802d5c82 100644 --- a/app/src/main/res/layout/message.xml +++ b/app/src/main/res/layout/message.xml @@ -10,6 +10,8 @@ android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" + android:clickable="true" + android:focusable="true" tools:ignore="UselessParent" > @@ -31,6 +35,8 @@ android:layout_marginBottom="5dp" android:textSize="16sp" android:textIsSelectable="true" + android:clickable="true" + android:focusable="true" android:text="" >