diff --git a/app/src/androidTest/scala/com/nutomic/ensichat/util/DatabaseTest.scala b/app/src/androidTest/scala/com/nutomic/ensichat/util/DatabaseTest.scala index c597877..637d65a 100644 --- a/app/src/androidTest/scala/com/nutomic/ensichat/util/DatabaseTest.scala +++ b/app/src/androidTest/scala/com/nutomic/ensichat/util/DatabaseTest.scala @@ -27,9 +27,9 @@ class DatabaseTest extends AndroidTestCase { override def setUp(): Unit = { Database = new Database(new TestContext(getContext)) - Database.addMessage(m1) - Database.addMessage(m2) - Database.addMessage(m3) + Database.onMessageReceived(m1) + Database.onMessageReceived(m2) + Database.onMessageReceived(m3) } override def tearDown(): Unit = { diff --git a/app/src/main/scala/com/nutomic/ensichat/activities/AddContactsActivity.scala b/app/src/main/scala/com/nutomic/ensichat/activities/AddContactsActivity.scala index 9208dae..e6579c7 100644 --- a/app/src/main/scala/com/nutomic/ensichat/activities/AddContactsActivity.scala +++ b/app/src/main/scala/com/nutomic/ensichat/activities/AddContactsActivity.scala @@ -121,27 +121,29 @@ class AddContactsActivity extends EnsiChatActivity with ChatService.OnConnection * These are only handled here and require user action, so contacts can only be added if * the user is in this activity. */ - override def onMessageReceived(messages: SortedSet[Message]): Unit = { - messages.filter(_.Header.Target == Crypto.getLocalAddress) - .foreach{ - case m if m.Body.isInstanceOf[RequestAddContact] => - Log.i(Tag, "Remote device " + m.Header.Origin + " wants to add us as a contact, showing dialog") - service.getConnections.find(_.Address == m.Header.Origin).foreach(addDeviceDialog) - case m if m.Body.isInstanceOf[ResultAddContact] => - currentlyAdding.keys.find(_.Address == m.Header.Origin)foreach(contact => - if (m.Body.asInstanceOf[ResultAddContact].Accepted) { - Log.i(Tag, contact.toString + " accepted us as a contact, updating state") - currentlyAdding += (contact -> - new AddContactInfo(true, currentlyAdding(contact).remoteConfirmed)) - addContactIfBothConfirmed(contact) - } else { - Log.i(Tag, contact.toString + " denied us as a contact, showing toast") - Toast.makeText(this, R.string.contact_not_added, Toast.LENGTH_LONG).show() - currentlyAdding -= contact - } + override def onMessageReceived(msg: Message): Unit = { + if (msg.Header.Target != Crypto.getLocalAddress) + return + + msg.Body match { + case _: RequestAddContact => + Log.i(Tag, "Remote device " + msg.Header.Origin + " wants to add us as a contact, showing dialog") + service.getConnections.find(_.Address == msg.Header.Origin).foreach(addDeviceDialog) + case _: ResultAddContact => + currentlyAdding.keys.find(_.Address == msg.Header.Origin).foreach(contact => + if (msg.Body.asInstanceOf[ResultAddContact].Accepted) { + Log.i(Tag, contact.toString + " accepted us as a contact, updating state") + currentlyAdding += (contact -> + new AddContactInfo(true, currentlyAdding(contact).remoteConfirmed)) + addContactIfBothConfirmed(contact) + } else { + Log.i(Tag, contact.toString + " denied us as a contact, showing toast") + Toast.makeText(this, R.string.contact_not_added, Toast.LENGTH_LONG).show() + currentlyAdding -= contact + } ) - case _ => - } + case _ => + } } /** diff --git a/app/src/main/scala/com/nutomic/ensichat/fragments/ChatFragment.scala b/app/src/main/scala/com/nutomic/ensichat/fragments/ChatFragment.scala index 4294d7c..13035a9 100644 --- a/app/src/main/scala/com/nutomic/ensichat/fragments/ChatFragment.scala +++ b/app/src/main/scala/com/nutomic/ensichat/fragments/ChatFragment.scala @@ -55,7 +55,7 @@ class ChatFragment extends ListFragment with OnClickListener // Read local device ID from service, adapter = new MessagesAdapter(getActivity, address) chatService.registerMessageListener(ChatFragment.this) - onMessageReceived(chatService.Database.getMessages(address, 15)) + chatService.Database.getMessages(address, 15).foreach(adapter.add) if (listView != null) { listView.setAdapter(adapter) @@ -112,9 +112,9 @@ class ChatFragment extends ListFragment with OnClickListener /** * Displays new messages in UI. */ - override def onMessageReceived(messages: SortedSet[Message]): Unit = { - messages.filter(m => Set(m.Header.Origin, m.Header.Target).contains(address)) - .foreach(adapter.add) + override def onMessageReceived(msg: Message): Unit = { + if (Set(msg.Header.Origin, msg.Header.Target).contains(address)) + adapter.add(msg) } } diff --git a/app/src/main/scala/com/nutomic/ensichat/protocol/ChatService.scala b/app/src/main/scala/com/nutomic/ensichat/protocol/ChatService.scala index cef1ff1..1ed8812 100644 --- a/app/src/main/scala/com/nutomic/ensichat/protocol/ChatService.scala +++ b/app/src/main/scala/com/nutomic/ensichat/protocol/ChatService.scala @@ -31,7 +31,7 @@ object ChatService { } trait OnMessageReceivedListener { - def onMessageReceived(messages: SortedSet[Message]): Unit + def onMessageReceived(messages: Message): Unit } /** @@ -72,7 +72,7 @@ class ChatService extends Service { /** * Holds all known users. - * + * * This is for user names that were received during runtime, and is not persistent. */ private var connections = Set[User]() @@ -88,6 +88,8 @@ class ChatService extends Service { pm.edit().putString(SettingsFragment.KeyUserName, BluetoothAdapter.getDefaultAdapter.getName).apply() + registerMessageListener(Database) + Future { Crypto.generateLocalKeys() @@ -156,15 +158,14 @@ class ChatService extends Service { connections += contact if (Database.getContact(msg.Header.Origin).nonEmpty) Database.changeContactName(contact) - + callConnectionListeners() case _ => - Database.addMessage(msg) MainHandler.post(new Runnable { override def run(): Unit = messageListeners .filter(_.get.nonEmpty) - .foreach(_.apply().onMessageReceived(SortedSet(msg)(Message.Ordering))) + .foreach(_.apply().onMessageReceived(msg)) }) } @@ -227,4 +228,4 @@ class ChatService extends Service { } } -} \ No newline at end of file +} diff --git a/app/src/main/scala/com/nutomic/ensichat/util/Database.scala b/app/src/main/scala/com/nutomic/ensichat/util/Database.scala index 345efe6..7fbb568 100644 --- a/app/src/main/scala/com/nutomic/ensichat/util/Database.scala +++ b/app/src/main/scala/com/nutomic/ensichat/util/Database.scala @@ -5,6 +5,7 @@ import java.util.Date import android.content.{ContentValues, Context} import android.database.sqlite.{SQLiteDatabase, SQLiteOpenHelper} import android.util.Log +import com.nutomic.ensichat.protocol.ChatService.OnMessageReceivedListener import com.nutomic.ensichat.protocol._ import com.nutomic.ensichat.protocol.messages._ @@ -34,8 +35,9 @@ object Database { /** * Stores all messages and contacts in SQL database. */ -class Database(context: Context) extends SQLiteOpenHelper(context, Database.DatabaseName, - null, Database.DatabaseVersion) { +class Database(context: Context) + extends SQLiteOpenHelper(context, Database.DatabaseName, null, Database.DatabaseVersion) + with OnMessageReceivedListener { private var contactsUpdatedListeners = Set[() => Unit]() @@ -72,16 +74,16 @@ class Database(context: Context) extends SQLiteOpenHelper(context, Database.Data /** * Inserts the given new message into the database. */ - def addMessage(message: Message): Unit = message.Body match { + override def onMessageReceived(msg: Message): Unit = msg.Body match { case text: Text => val cv = new ContentValues() - cv.put("origin", message.Header.Origin.toString) - cv.put("target", message.Header.Target.toString) + cv.put("origin", msg.Header.Origin.toString) + cv.put("target", msg.Header.Target.toString) // toString used as workaround for compile error with Long. cv.put("date", text.time.getTime.toString) cv.put("text", text.text) getWritableDatabase.insert("messages", null, cv) - case _: ConnectionInfo | _: RequestAddContact | _: ResultAddContact | _: UserName => + case _: RequestAddContact | _: ResultAddContact => // Never stored. }