- Fixed call, message, and call transfer actions when initiated from

notification.
- Moved save and restore messages functions to Message class.
- Coding style edits.
This commit is contained in:
Juha Heinanen
2019-04-20 13:17:50 +03:00
parent 622e0f5c0f
commit d3a8e2df41
7 changed files with 81 additions and 97 deletions
@@ -26,8 +26,6 @@ import java.io.InputStream
import java.util.* import java.util.*
import android.content.Intent import android.content.Intent
class BaresipService: Service() { class BaresipService: Service() {
private val LOG_TAG = "Baresip Service" private val LOG_TAG = "Baresip Service"
@@ -173,7 +171,8 @@ class BaresipService: Service() {
"Call Show", "Call Answer" -> { "Call Show", "Call Answer" -> {
val newIntent = Intent(this, MainActivity::class.java) val newIntent = Intent(this, MainActivity::class.java)
newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or
Intent.FLAG_ACTIVITY_NEW_TASK
newIntent.putExtra("action", action.toLowerCase()) newIntent.putExtra("action", action.toLowerCase())
newIntent.putExtra("callp", intent!!.getStringExtra("callp")) newIntent.putExtra("callp", intent!!.getStringExtra("callp"))
startActivity(newIntent) startActivity(newIntent)
@@ -201,7 +200,8 @@ class BaresipService: Service() {
Log.w(LOG_TAG, "onStartCommand did not find ua $uap") Log.w(LOG_TAG, "onStartCommand did not find ua $uap")
} else { } else {
val newIntent = Intent(this, MainActivity::class.java) val newIntent = Intent(this, MainActivity::class.java)
newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or
Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
newIntent.putExtra("action", action.toLowerCase()) newIntent.putExtra("action", action.toLowerCase())
newIntent.putExtra("callp", intent.getStringExtra("callp")) newIntent.putExtra("callp", intent.getStringExtra("callp"))
newIntent.putExtra("uri", intent.getStringExtra("uri")) newIntent.putExtra("uri", intent.getStringExtra("uri"))
@@ -222,10 +222,11 @@ class BaresipService: Service() {
"Message Show", "Message Reply" -> { "Message Show", "Message Reply" -> {
val newIntent = Intent(this, MainActivity::class.java) val newIntent = Intent(this, MainActivity::class.java)
newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or
Intent.FLAG_ACTIVITY_NEW_TASK
newIntent.putExtra("action", action.toLowerCase()) newIntent.putExtra("action", action.toLowerCase())
newIntent.putExtra("uap", intent!!.getStringExtra("uap")) newIntent.putExtra("uap", intent!!.getStringExtra("uap"))
newIntent.putExtra("time", intent.getStringExtra("time")) newIntent.putExtra("peer", intent.getStringExtra("peer"))
startActivity(newIntent) startActivity(newIntent)
nm.cancel(BaresipService.MESSAGE_NOTIFICATION_ID) nm.cancel(BaresipService.MESSAGE_NOTIFICATION_ID)
} }
@@ -533,20 +534,20 @@ class BaresipService: Service() {
} catch (e: Exception) { } catch (e: Exception) {
Log.w(LOG_TAG, "UTF-8 decode failed") Log.w(LOG_TAG, "UTF-8 decode failed")
} }
Log.d(LOG_TAG, "Message event for $uap from $peer")
val ua = UserAgent.find(uap) val ua = UserAgent.find(uap)
if (ua == null) { if (ua == null) {
Log.w(LOG_TAG, "messageEvent did not find ua $uap") Log.w(LOG_TAG, "messageEvent did not find ua $uap")
return return
} }
val timeStamp = System.currentTimeMillis().toString() val timeStamp = System.currentTimeMillis().toString()
Log.d(LOG_TAG, "Message event for $uap from $peer at $timeStamp")
Message.add(Message(ua.account.aor, peer, text, timeStamp.toLong(), Message.add(Message(ua.account.aor, peer, text, timeStamp.toLong(),
R.drawable.arrow_down_green, 0, "", true)) R.drawable.arrow_down_green, 0, "", true))
if (!Utils.isVisible()) { if (!Utils.isVisible()) {
val intent = Intent(this, BaresipService::class.java) val intent = Intent(this, BaresipService::class.java)
intent.action = "Message Show" intent.action = "Message Show"
intent.putExtra("uap", uap) intent.putExtra("uap", uap)
.putExtra("time", timeStamp) .putExtra("peer", peer)
val pi = PendingIntent.getService(this, MESSAGE_REQ_CODE, intent, val pi = PendingIntent.getService(this, MESSAGE_REQ_CODE, intent,
PendingIntent.FLAG_UPDATE_CURRENT) PendingIntent.FLAG_UPDATE_CURRENT)
val nb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID) val nb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID)
@@ -567,7 +568,7 @@ class BaresipService: Service() {
val replyIntent = Intent(this, BaresipService::class.java) val replyIntent = Intent(this, BaresipService::class.java)
replyIntent.action = "Message Reply" replyIntent.action = "Message Reply"
replyIntent.putExtra("uap", uap) replyIntent.putExtra("uap", uap)
.putExtra("time", timeStamp) .putExtra("peer", peer)
val replyPendingIntent = PendingIntent.getService(this, val replyPendingIntent = PendingIntent.getService(this,
REPLY_REQ_CODE, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT) REPLY_REQ_CODE, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val saveIntent = Intent(this, BaresipService::class.java) val saveIntent = Intent(this, BaresipService::class.java)
@@ -591,7 +592,7 @@ class BaresipService: Service() {
val intent = Intent("service event") val intent = Intent("service event")
intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
intent.putExtra("event", "message show") intent.putExtra("event", "message show")
intent.putExtra("params", arrayListOf(uap, timeStamp)) intent.putExtra("params", arrayListOf(uap, peer))
LocalBroadcastManager.getInstance(this).sendBroadcast(intent) LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
} }
@@ -47,8 +47,7 @@ class CallsActivity : AppCompatActivity() {
when (which) { when (which) {
DialogInterface.BUTTON_NEUTRAL, DialogInterface.BUTTON_NEGATIVE -> { DialogInterface.BUTTON_NEUTRAL, DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(this@CallsActivity, MainActivity::class.java) val i = Intent(this@CallsActivity, MainActivity::class.java)
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or i.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
if (which == DialogInterface.BUTTON_NEUTRAL) if (which == DialogInterface.BUTTON_NEUTRAL)
i.putExtra("action", "call") i.putExtra("action", "call")
else else
@@ -166,7 +166,7 @@ class ChatActivity : AppCompatActivity() {
Log.d("Baresip", "Saving newMessage ${newMessage.text} for $aor::$peerUri") Log.d("Baresip", "Saving newMessage ${newMessage.text} for $aor::$peerUri")
BaresipService.chatTexts.put("$aor::$peerUri", newMessage.text.toString()) BaresipService.chatTexts.put("$aor::$peerUri", newMessage.text.toString())
} }
ChatsActivity.saveMessages(applicationContext.filesDir.absolutePath) Message.saveMessages(applicationContext.filesDir.absolutePath)
super.onPause() super.onPause()
} }
@@ -8,12 +8,6 @@ import android.support.v7.app.AppCompatActivity
import android.view.MenuItem import android.view.MenuItem
import android.widget.* import android.widget.*
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.io.ObjectInputStream
import java.io.ObjectOutputStream
import java.util.* import java.util.*
class ChatsActivity: AppCompatActivity() { class ChatsActivity: AppCompatActivity() {
@@ -78,7 +72,7 @@ class ChatsActivity: AppCompatActivity() {
else else
clAdapter.remove(m) clAdapter.remove(m)
clAdapter.notifyDataSetChanged() clAdapter.notifyDataSetChanged()
Message.messages(msgs) BaresipService.messages = msgs
uaMessages = uaMessages(aor) uaMessages = uaMessages(aor)
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_POSITIVE -> {
@@ -148,7 +142,7 @@ class ChatsActivity: AppCompatActivity() {
} }
override fun onPause() { override fun onPause() {
saveMessages(applicationContext.filesDir.absolutePath) Message.saveMessages(applicationContext.filesDir.absolutePath)
super.onPause() super.onPause()
} }
@@ -206,20 +200,12 @@ class ChatsActivity: AppCompatActivity() {
var filesPath = "" var filesPath = ""
fun findUaMessage(aor: String, timeStamp: Long): Message? {
for (i in Message.messages().indices.reversed())
if ((Message.messages()[i].aor == aor) &&
(Message.messages()[i].timeStamp == timeStamp))
return Message.messages()[i]
return null
}
fun saveUaMessage(aor: String, time: Long, path: String) { fun saveUaMessage(aor: String, time: Long, path: String) {
for (i in Message.messages().indices.reversed()) for (i in Message.messages().indices.reversed())
if ((Message.messages()[i].aor == aor) && if ((Message.messages()[i].aor == aor) &&
(Message.messages()[i].timeStamp == time)) { (Message.messages()[i].timeStamp == time)) {
Message.messages()[i].new = false Message.messages()[i].new = false
saveMessages(path) Message.saveMessages(path)
return return
} }
} }
@@ -229,39 +215,10 @@ class ChatsActivity: AppCompatActivity() {
if ((Message.messages()[i].aor == aor) && if ((Message.messages()[i].aor == aor) &&
(Message.messages()[i].timeStamp == time)) { (Message.messages()[i].timeStamp == time)) {
Message.messages().removeAt(i) Message.messages().removeAt(i)
saveMessages(path) Message.saveMessages(path)
return return
} }
} }
fun saveMessages(path: String = filesPath) {
val file = File(path, "messages")
try {
val fos = FileOutputStream(file)
val oos = ObjectOutputStream(fos)
oos.writeObject(Message.messages())
oos.close()
fos.close()
} catch (e: IOException) {
Log.e("Baresip", "OutputStream exception: " + e.toString())
e.printStackTrace()
}
}
fun restoreMessages(path: String = filesPath) {
val file = File(path, "messages")
if (file.exists()) {
try {
val fis = FileInputStream(file)
val ois = ObjectInputStream(fis)
Message.messages(ois.readObject() as ArrayList<Message>)
ois.close()
fis.close()
} catch (e: Exception) {
Log.e("Baresip", "InputStream exception: - " + e.toString())
}
}
}
} }
} }
@@ -55,8 +55,8 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
Log.d("Baresip", "Main created with action " + val intentAction = intent.getStringExtra("action")
intent.getStringExtra("action")) Log.d("Baresip", "Main created with action '$intentAction'")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true) setShowWhenLocked(true)
@@ -371,19 +371,21 @@ class MainActivity : AppCompatActivity() {
startActivityForResult(i, CONTACTS_CODE) startActivityForResult(i, CONTACTS_CODE)
} }
ChatsActivity.restoreMessages(applicationContext.filesDir.absolutePath) if (intentAction == null)
Message.restoreMessages(applicationContext.filesDir.absolutePath)
messagesButton.setOnClickListener { messagesButton.setOnClickListener {
if (aorSpinner.selectedItemPosition >= 0) { if (aorSpinner.selectedItemPosition >= 0) {
val i = Intent(this@MainActivity, ChatsActivity::class.java) val i = Intent(this@MainActivity, ChatsActivity::class.java)
val b = Bundle() val b = Bundle()
b.putString("aor", UserAgent.uas()[aorSpinner.selectedItemPosition].account.aor) b.putString("aor", UserAgent.uas()[aorSpinner.selectedItemPosition].account.aor)
b.putString("peer", "") b.putString("peer", resumeUri)
b.putBoolean("focus", false) b.putBoolean("focus", resumeUri != "")
i.putExtras(b) i.putExtras(b)
startActivityForResult(i, MESSAGES_CODE) startActivityForResult(i, MESSAGES_CODE)
} }
} }
if (intentAction == null)
CallHistory.restore(applicationContext.filesDir.absolutePath) CallHistory.restore(applicationContext.filesDir.absolutePath)
callsButton.setOnClickListener { callsButton.setOnClickListener {
if (aorSpinner.selectedItemPosition >= 0) { if (aorSpinner.selectedItemPosition >= 0) {
@@ -477,7 +479,7 @@ class MainActivity : AppCompatActivity() {
resumeCall = call resumeCall = call
resumeUri = intent.getStringExtra("uri") resumeUri = intent.getStringExtra("uri")
} }
"message show", "message reply" -> { "message", "message show", "message reply" -> {
val uap = intent.getStringExtra("uap") val uap = intent.getStringExtra("uap")
val ua = UserAgent.find(uap) val ua = UserAgent.find(uap)
if (ua == null) { if (ua == null) {
@@ -488,7 +490,7 @@ class MainActivity : AppCompatActivity() {
spinToAor(ua.account.aor) spinToAor(ua.account.aor)
resumeAction = action resumeAction = action
resumeUap = uap resumeUap = uap
resumeTime = intent.getStringExtra("time") resumeUri = intent.getStringExtra("peer")
} }
} }
} }
@@ -514,8 +516,11 @@ class MainActivity : AppCompatActivity() {
"transfer show", "transfer accept" -> "transfer show", "transfer accept" ->
handleServiceEvent("$resumeAction,$resumeUri", handleServiceEvent("$resumeAction,$resumeUri",
arrayListOf(resumeCall!!.ua.uap, resumeCall!!.callp)) arrayListOf(resumeCall!!.ua.uap, resumeCall!!.callp))
"message" -> {
messagesButton.performClick()
}
"message show", "message reply" -> "message show", "message reply" ->
handleServiceEvent(resumeAction, arrayListOf(resumeUap, resumeTime)) handleServiceEvent(resumeAction, arrayListOf(resumeUap, resumeUri))
else -> { else -> {
if ((aorSpinner.selectedItemPosition == -1) && (UserAgent.uas().size > 0)) if ((aorSpinner.selectedItemPosition == -1) && (UserAgent.uas().size > 0))
aorSpinner.setSelection(0) aorSpinner.setSelection(0)
@@ -524,6 +529,7 @@ class MainActivity : AppCompatActivity() {
} }
} }
resumeAction = "" resumeAction = ""
resumeUri = ""
} }
override fun onPause() { override fun onPause() {
@@ -769,13 +775,8 @@ class MainActivity : AppCompatActivity() {
} }
} }
"message show", "message reply" -> { "message show", "message reply" -> {
val timeStamp = params[1].toLong() val peer = params[1]
val msg = ChatsActivity.findUaMessage(ua.account.aor, timeStamp) Log.d("Baresip", "Message for $aor from $peer")
if (msg == null) {
Log.w("Baresip", "Message ${ua.uap}/$timeStamp is not found")
return
}
Log.d("Baresip", "Message for $aor from ${msg.peerUri}")
if ((aorSpinner.selectedItemPosition == -1) || if ((aorSpinner.selectedItemPosition == -1) ||
(ua != UserAgent.uas()[aorSpinner.selectedItemPosition])) (ua != UserAgent.uas()[aorSpinner.selectedItemPosition]))
aorSpinner.setSelection(account_index) aorSpinner.setSelection(account_index)
@@ -783,7 +784,7 @@ class MainActivity : AppCompatActivity() {
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val b = Bundle() val b = Bundle()
b.putString("aor", aor) b.putString("aor", aor)
b.putString("peer", msg.peerUri) b.putString("peer", peer)
b.putBoolean("focus", ev[0] == "message reply") b.putBoolean("focus", ev[0] == "message reply")
i.putExtras(b) i.putExtras(b)
startActivity(i) startActivity(i)
@@ -15,10 +15,6 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
return BaresipService.messages return BaresipService.messages
} }
fun messages(messages: ArrayList<Message>) {
BaresipService.messages = messages
}
fun add(message: Message) { fun add(message: Message) {
BaresipService.messages.add(message) BaresipService.messages.add(message)
var count = 0 var count = 0
@@ -35,5 +31,37 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
BaresipService.messages.removeAt(firstIndex) BaresipService.messages.removeAt(firstIndex)
} }
fun saveMessages(path: String) {
val file = File(path, "messages")
try {
val fos = FileOutputStream(file)
val oos = ObjectOutputStream(fos)
oos.writeObject(BaresipService.messages)
oos.close()
fos.close()
Log.d("Baresip", "Saved ${BaresipService.messages.size} messages")
} catch (e: IOException) {
Log.e("Baresip", "OutputStream exception: " + e.toString())
e.printStackTrace()
}
}
fun restoreMessages(path: String) {
val file = File(path, "messages")
if (file.exists()) {
try {
val fis = FileInputStream(file)
val ois = ObjectInputStream(fis)
BaresipService.messages = ois.readObject() as ArrayList<Message>
ois.close()
fis.close()
Log.d("Baresip", "Restored ${BaresipService.messages.size} messages")
} catch (e: Exception) {
Log.e("Baresip", "InputStream exception: - " + e.toString())
}
}
}
} }
} }
@@ -63,10 +63,8 @@ class MessageListAdapter(private val cxt: Context, private val rows: ArrayList<M
} }
val textView = messageView.findViewById(R.id.text) as TextView val textView = messageView.findViewById(R.id.text) as TextView
textView.text = message.message textView.text = message.message
if (message.new) { if (message.new)
textView.setTypeface(null, Typeface.BOLD) textView.setTypeface(null, Typeface.BOLD)
message.new = false
}
return messageView return messageView
} }