From a82acb57774b80bbb70b51bbef5acc770943ddd0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 24 Jun 2019 01:41:17 +0200 Subject: [PATCH] Temp --- app/build.gradle | 3 - app/src/main/AndroidManifest.xml | 9 +- .../handler/RoomPlainMessageHandler.java | 1 + .../messenger/ui/chat/ChatActivity.java | 36 ++++- .../ui/roster/RosterRecyclerViewAdapter.java | 22 ++- app/src/main/res/layout/activity_chat.xml | 7 +- app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/menu/menu_main.xml | 6 + app/src/main/res/values/styles.xml | 49 +++--- .../1.json | 146 +++++++++--------- .../persistence/room/dao/AccountDao.java | 2 +- .../persistence/room/dao/ChatDao.java | 10 +- .../room/dao/ContactAndEntityDao.java | 10 +- .../persistence/room/dao/ContactDao.java | 12 +- .../persistence/room/dao/EntityDao.java | 8 +- .../persistence/room/dao/MessageDao.java | 6 +- .../room/model/RoomAccountModel.java | 2 +- .../persistence/room/model/RoomChatModel.java | 42 ++--- .../room/model/RoomContactModel.java | 10 +- .../room/model/RoomEntityModel.java | 6 +- .../room/model/RoomMessageModel.java | 6 +- .../persistence/model/ChatModel.java | 8 +- xmpp_core/build.gradle | 6 +- .../xmpp_core/MercuryConnection.java | 19 ++- 24 files changed, 237 insertions(+), 195 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ac76dc6..301283d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,7 +104,4 @@ dependencies { // circular image viewer for avatars implementation 'de.hdodenhof:circleimageview:2.2.0' - - // Smack Android - implementation "org.igniterealtime.smack:smack-android-extensions:$smackAndroidExtensionsVersion" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6fb226e..5d68b40 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - @@ -16,18 +15,18 @@ android:label="@string/app_name" android:roundIcon="@drawable/ic_launcher" android:supportsRtl="true" - android:theme="@style/AppTheme"> - + android:theme="@style/AppTheme.Light"> + android:theme="@style/AppTheme.Light.NoActionBar" /> + android:theme="@style/AppTheme.Light.NoActionBar"> + diff --git a/app/src/main/java/org/mercury_im/messenger/handler/RoomPlainMessageHandler.java b/app/src/main/java/org/mercury_im/messenger/handler/RoomPlainMessageHandler.java index 26c41d4..f9a993f 100644 --- a/app/src/main/java/org/mercury_im/messenger/handler/RoomPlainMessageHandler.java +++ b/app/src/main/java/org/mercury_im/messenger/handler/RoomPlainMessageHandler.java @@ -59,6 +59,7 @@ public class RoomPlainMessageHandler implements PlainMessageHandler { @Override public void onCarbonCopyReceived(CarbonExtension.Direction direction, Message carbonCopy, Message wrappingMessage) { + Log.d(TAG, "onCarbonReceived:" + carbonCopy.toXML()); MessageModel messageModel = new RoomMessageModel(); messageModel.setAccountId(accountId); messageModel.setFrom(carbonCopy.getFrom() != null ? carbonCopy.getFrom().asEntityBareJidIfPossible() : null); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index e6ab33a..1a90c14 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -3,6 +3,8 @@ package org.mercury_im.messenger.ui.chat; import android.os.Bundle; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.LiveData; @@ -29,14 +31,28 @@ import java.util.List; import javax.inject.Inject; +import butterknife.BindView; +import butterknife.ButterKnife; + public class ChatActivity extends BindingActivity implements ChatInputFragment.OnChatInputActionListener { + public static final String EXTRA_JID = "JID"; + public static final String EXTRA_ACCOUNT = "ACCOUNT"; + @Inject AccountRepository accountRepository; @Inject MessageRepository messageRepository; + @BindView(R.id.toolbar) + Toolbar toolbar; + + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + + private ChatViewModel chatViewModel; + private EntityBareJid jid; private long accountId; @@ -44,11 +60,13 @@ public class ChatActivity extends BindingActivity implements ChatInputFragment.O @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d("Mercury", "onCreate"); setContentView(R.layout.activity_chat); + ButterKnife.bind(this); + setSupportActionBar(toolbar); MercuryImApplication.getApplication().getAppComponent().inject(this); - RecyclerView recyclerView = findViewById(R.id.recyclerView); ChatRecyclerViewAdapter adapter = new ChatRecyclerViewAdapter(); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); @@ -58,18 +76,19 @@ public class ChatActivity extends BindingActivity implements ChatInputFragment.O if (savedInstanceState == null) return; } - String jidString = savedInstanceState.getString("JID"); + String jidString = savedInstanceState.getString(EXTRA_JID); if (jidString != null) { + getSupportActionBar().setTitle(jidString); jid = JidCreate.entityBareFromOrThrowUnchecked(jidString); - accountId = savedInstanceState.getLong("ACCOUNT"); + accountId = savedInstanceState.getLong(EXTRA_ACCOUNT); LiveData accountModel = accountRepository.getAccount(accountId); - ChatViewModel viewModel = ViewModelProviders.of(this).get(ChatViewModel.class); + chatViewModel = ViewModelProviders.of(this).get(ChatViewModel.class); accountModel.observe(this, new Observer() { @Override public void onChanged(AccountModel accountModel) { - viewModel.init(accountModel, jid); + chatViewModel.init(accountModel, jid); } }); @@ -88,6 +107,13 @@ public class ChatActivity extends BindingActivity implements ChatInputFragment.O } } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + outState.putString(EXTRA_JID, jid.toString()); + outState.putLong(EXTRA_ACCOUNT, accountId); + super.onSaveInstanceState(outState); + } + @Override public void onButtonMediaClicked() { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterRecyclerViewAdapter.java index 157dfd3..42545ce 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterRecyclerViewAdapter.java @@ -1,10 +1,13 @@ package org.mercury_im.messenger.ui.roster; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityOptionsCompat; import androidx.recyclerview.widget.RecyclerView; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,6 +23,7 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import de.hdodenhof.circleimageview.CircleImageView; public class RosterRecyclerViewAdapter extends RecyclerView.Adapter { @@ -57,18 +61,22 @@ public class RosterRecyclerViewAdapter private View view; + @BindView(R.id.roster_entry__jid) TextView jidView; + @BindView(R.id.roster_entry__nickname) TextView nicknameView; + @BindView(R.id.roster_entry__avatar) + CircleImageView avatarView; + Context context; public RosterItemViewHolder(Context context, View itemView) { super(itemView); this.context = context; this.view = itemView; - this.jidView = itemView.findViewById(R.id.roster_entry__jid); - this.nicknameView = itemView.findViewById(R.id.roster_entry__nickname); + ButterKnife.bind(this, view); } void bind(RoomContactAndEntityModel contactModel) { @@ -80,11 +88,19 @@ public class RosterRecyclerViewAdapter view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + Intent intent = new Intent(context, ChatActivity.class); intent.putExtra("JID", jid.toString()); intent.putExtra("ACCOUNT", contactModel.getEntity().getAccountId()); - context.startActivity(intent); + // Animation + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation((AppCompatActivity) context, avatarView, "avatar"); + context.startActivity(intent, options.toBundle()); + } else { + context.startActivity(intent); + } } }); } diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index 6a66f71..31aa869 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -11,20 +11,19 @@ tools:context=".ui.chat.ChatActivity"> android:id="@+id/appbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:theme="@style/AppTheme.AppBarOverlay" app:layout_constraintTop_toTopOf="parent"> + android:background="?attr/colorPrimary"> + android:src="@drawable/aldrin" + android:transitionName="avatar"/> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fc7908e..b2b2b58 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,15 +8,13 @@ + android:layout_height="wrap_content"> + android:background="?attr/colorPrimary" /> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 5033235..4ca0d55 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -25,4 +25,10 @@ android:orderInCategory="130" android:title="Accounts" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index dfceea6..5637e9b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,42 +1,31 @@ - - - - - - - - - - - - + + + + + + + + diff --git a/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json b/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json index d2f113b..c6ae02a 100644 --- a/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json +++ b/persistence-room/schemas/org.mercury_im.messenger.persistence.room.AppDatabase/1.json @@ -2,33 +2,33 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "63a5e8d6de4b6d8eb30e820be9ab9a69", + "identityHash": "c54702e8cd69b3410ca84bab6d4d3aa6", "entities": [ { "tableName": "contacts", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `accountId` INTEGER NOT NULL, `entityId` INTEGER NOT NULL, `rosterName` TEXT, `nickname` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`accountId`) REFERENCES `accounts`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`entityId`) REFERENCES `entities`(`id`) ON UPDATE NO ACTION ON DELETE RESTRICT )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_contact_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `fk_account_id` INTEGER NOT NULL, `fk_entity_id` INTEGER NOT NULL, `rostername` TEXT, `nickname` TEXT, FOREIGN KEY(`fk_account_id`) REFERENCES `accounts`(`pk_account_id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`fk_entity_id`) REFERENCES `entities`(`pk_entity_id`) ON UPDATE NO ACTION ON DELETE RESTRICT )", "fields": [ { "fieldPath": "id", - "columnName": "id", + "columnName": "pk_contact_id", "affinity": "INTEGER", "notNull": true }, { "fieldPath": "accountId", - "columnName": "accountId", + "columnName": "fk_account_id", "affinity": "INTEGER", "notNull": true }, { "fieldPath": "entityId", - "columnName": "entityId", + "columnName": "fk_entity_id", "affinity": "INTEGER", "notNull": true }, { "fieldPath": "rosterName", - "columnName": "rosterName", + "columnName": "rostername", "affinity": "TEXT", "notNull": false }, @@ -41,43 +41,43 @@ ], "primaryKey": { "columnNames": [ - "id" + "pk_contact_id" ], - "autoGenerate": false + "autoGenerate": true }, "indices": [ { - "name": "index_contacts_id", + "name": "index_contacts_pk_contact_id", "unique": false, "columnNames": [ - "id" + "pk_contact_id" ], - "createSql": "CREATE INDEX `index_contacts_id` ON `${TABLE_NAME}` (`id`)" + "createSql": "CREATE INDEX `index_contacts_pk_contact_id` ON `${TABLE_NAME}` (`pk_contact_id`)" }, { - "name": "index_contacts_accountId", + "name": "index_contacts_fk_account_id", "unique": false, "columnNames": [ - "accountId" + "fk_account_id" ], - "createSql": "CREATE INDEX `index_contacts_accountId` ON `${TABLE_NAME}` (`accountId`)" + "createSql": "CREATE INDEX `index_contacts_fk_account_id` ON `${TABLE_NAME}` (`fk_account_id`)" }, { - "name": "index_contacts_entityId", + "name": "index_contacts_fk_entity_id", "unique": false, "columnNames": [ - "entityId" + "fk_entity_id" ], - "createSql": "CREATE INDEX `index_contacts_entityId` ON `${TABLE_NAME}` (`entityId`)" + "createSql": "CREATE INDEX `index_contacts_fk_entity_id` ON `${TABLE_NAME}` (`fk_entity_id`)" }, { - "name": "index_contacts_id_entityId", + "name": "index_contacts_pk_contact_id_fk_entity_id", "unique": true, "columnNames": [ - "id", - "entityId" + "pk_contact_id", + "fk_entity_id" ], - "createSql": "CREATE UNIQUE INDEX `index_contacts_id_entityId` ON `${TABLE_NAME}` (`id`, `entityId`)" + "createSql": "CREATE UNIQUE INDEX `index_contacts_pk_contact_id_fk_entity_id` ON `${TABLE_NAME}` (`pk_contact_id`, `fk_entity_id`)" } ], "foreignKeys": [ @@ -86,10 +86,10 @@ "onDelete": "CASCADE", "onUpdate": "NO ACTION", "columns": [ - "accountId" + "fk_account_id" ], "referencedColumns": [ - "id" + "pk_account_id" ] }, { @@ -97,21 +97,21 @@ "onDelete": "RESTRICT", "onUpdate": "NO ACTION", "columns": [ - "entityId" + "fk_entity_id" ], "referencedColumns": [ - "id" + "pk_entity_id" ] } ] }, { "tableName": "accounts", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `jid` TEXT, `password` TEXT, `enabled` INTEGER NOT NULL)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_account_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `jid` TEXT, `password` TEXT, `enabled` INTEGER NOT NULL)", "fields": [ { "fieldPath": "id", - "columnName": "id", + "columnName": "pk_account_id", "affinity": "INTEGER", "notNull": true }, @@ -136,67 +136,67 @@ ], "primaryKey": { "columnNames": [ - "id" + "pk_account_id" ], "autoGenerate": true }, "indices": [ { - "name": "index_accounts_id", + "name": "index_accounts_pk_account_id", "unique": false, "columnNames": [ - "id" + "pk_account_id" ], - "createSql": "CREATE INDEX `index_accounts_id` ON `${TABLE_NAME}` (`id`)" + "createSql": "CREATE INDEX `index_accounts_pk_account_id` ON `${TABLE_NAME}` (`pk_account_id`)" } ], "foreignKeys": [] }, { "tableName": "chats", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `xmppId` INTEGER NOT NULL, `open` INTEGER NOT NULL, FOREIGN KEY(`xmppId`) REFERENCES `entities`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_chat_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `fk_entity_id` INTEGER NOT NULL, `active` INTEGER NOT NULL, FOREIGN KEY(`fk_entity_id`) REFERENCES `entities`(`pk_entity_id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", - "columnName": "id", + "columnName": "pk_chat_id", "affinity": "INTEGER", "notNull": true }, { - "fieldPath": "peerIdentityId", - "columnName": "xmppId", + "fieldPath": "peerEntityId", + "columnName": "fk_entity_id", "affinity": "INTEGER", "notNull": true }, { - "fieldPath": "isOpened", - "columnName": "open", + "fieldPath": "isActive", + "columnName": "active", "affinity": "INTEGER", "notNull": true } ], "primaryKey": { "columnNames": [ - "id" + "pk_chat_id" ], "autoGenerate": true }, "indices": [ { - "name": "index_chats_id", + "name": "index_chats_pk_chat_id", "unique": false, "columnNames": [ - "id" + "pk_chat_id" ], - "createSql": "CREATE INDEX `index_chats_id` ON `${TABLE_NAME}` (`id`)" + "createSql": "CREATE INDEX `index_chats_pk_chat_id` ON `${TABLE_NAME}` (`pk_chat_id`)" }, { - "name": "index_chats_xmppId", + "name": "index_chats_fk_entity_id", "unique": false, "columnNames": [ - "xmppId" + "fk_entity_id" ], - "createSql": "CREATE INDEX `index_chats_xmppId` ON `${TABLE_NAME}` (`xmppId`)" + "createSql": "CREATE INDEX `index_chats_fk_entity_id` ON `${TABLE_NAME}` (`fk_entity_id`)" } ], "foreignKeys": [ @@ -205,27 +205,27 @@ "onDelete": "CASCADE", "onUpdate": "NO ACTION", "columns": [ - "xmppId" + "fk_entity_id" ], "referencedColumns": [ - "id" + "pk_entity_id" ] } ] }, { "tableName": "messages", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `body` TEXT, `sendDate` INTEGER, `from` TEXT, `to` TEXT, `incoming` INTEGER NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `accounts`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_message_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `fk_account_id` INTEGER NOT NULL, `body` TEXT, `send_date` INTEGER, `from` TEXT, `to` TEXT, `incoming` INTEGER NOT NULL, FOREIGN KEY(`fk_account_id`) REFERENCES `accounts`(`pk_account_id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", - "columnName": "id", + "columnName": "pk_message_id", "affinity": "INTEGER", "notNull": true }, { "fieldPath": "accountId", - "columnName": "accountId", + "columnName": "fk_account_id", "affinity": "INTEGER", "notNull": true }, @@ -237,7 +237,7 @@ }, { "fieldPath": "sendDate", - "columnName": "sendDate", + "columnName": "send_date", "affinity": "INTEGER", "notNull": false }, @@ -262,26 +262,26 @@ ], "primaryKey": { "columnNames": [ - "id" + "pk_message_id" ], "autoGenerate": true }, "indices": [ { - "name": "index_messages_id", + "name": "index_messages_pk_message_id", "unique": false, "columnNames": [ - "id" + "pk_message_id" ], - "createSql": "CREATE INDEX `index_messages_id` ON `${TABLE_NAME}` (`id`)" + "createSql": "CREATE INDEX `index_messages_pk_message_id` ON `${TABLE_NAME}` (`pk_message_id`)" }, { - "name": "index_messages_accountId", + "name": "index_messages_fk_account_id", "unique": false, "columnNames": [ - "accountId" + "fk_account_id" ], - "createSql": "CREATE INDEX `index_messages_accountId` ON `${TABLE_NAME}` (`accountId`)" + "createSql": "CREATE INDEX `index_messages_fk_account_id` ON `${TABLE_NAME}` (`fk_account_id`)" } ], "foreignKeys": [ @@ -290,27 +290,27 @@ "onDelete": "CASCADE", "onUpdate": "NO ACTION", "columns": [ - "accountId" + "fk_account_id" ], "referencedColumns": [ - "id" + "pk_account_id" ] } ] }, { "tableName": "entities", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `accountId` INTEGER NOT NULL, `jid` TEXT NOT NULL, `avatar` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`accountId`) REFERENCES `accounts`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pk_entity_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `fk_account_id` INTEGER NOT NULL, `jid` TEXT NOT NULL, `avatar` TEXT, FOREIGN KEY(`fk_account_id`) REFERENCES `accounts`(`pk_account_id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", - "columnName": "id", + "columnName": "pk_entity_id", "affinity": "INTEGER", "notNull": true }, { "fieldPath": "accountId", - "columnName": "accountId", + "columnName": "fk_account_id", "affinity": "INTEGER", "notNull": true }, @@ -329,27 +329,27 @@ ], "primaryKey": { "columnNames": [ - "id" + "pk_entity_id" ], - "autoGenerate": false + "autoGenerate": true }, "indices": [ { - "name": "index_entities_id", + "name": "index_entities_pk_entity_id", "unique": false, "columnNames": [ - "id" + "pk_entity_id" ], - "createSql": "CREATE INDEX `index_entities_id` ON `${TABLE_NAME}` (`id`)" + "createSql": "CREATE INDEX `index_entities_pk_entity_id` ON `${TABLE_NAME}` (`pk_entity_id`)" }, { - "name": "index_entities_accountId_jid", + "name": "index_entities_fk_account_id_jid", "unique": true, "columnNames": [ - "accountId", + "fk_account_id", "jid" ], - "createSql": "CREATE UNIQUE INDEX `index_entities_accountId_jid` ON `${TABLE_NAME}` (`accountId`, `jid`)" + "createSql": "CREATE UNIQUE INDEX `index_entities_fk_account_id_jid` ON `${TABLE_NAME}` (`fk_account_id`, `jid`)" } ], "foreignKeys": [ @@ -358,10 +358,10 @@ "onDelete": "CASCADE", "onUpdate": "NO ACTION", "columns": [ - "accountId" + "fk_account_id" ], "referencedColumns": [ - "id" + "pk_account_id" ] } ] @@ -370,7 +370,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '63a5e8d6de4b6d8eb30e820be9ab9a69')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c54702e8cd69b3410ca84bab6d4d3aa6')" ] } } \ No newline at end of file diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/AccountDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/AccountDao.java index 41dea43..51b6f2f 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/AccountDao.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/AccountDao.java @@ -41,7 +41,7 @@ public interface AccountDao extends BaseDao { * @param id id of the account * @return account or null */ - @Query("select * from accounts where id = :id") + @Query("select * from accounts where pk_account_id = :id") LiveData getAccountById(long id); @Query("select * from accounts where jid = :jid") diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ChatDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ChatDao.java index c953d31..72197f2 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ChatDao.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ChatDao.java @@ -18,15 +18,15 @@ public interface ChatDao extends BaseDao { @Query("SELECT * FROM chats") LiveData> getAllChats(); - @Query("SELECT chats.* FROM chats JOIN entities WHERE accountId = :accountId") + @Query("SELECT chats.* FROM chats JOIN entities WHERE fk_account_id = :accountId") LiveData> getAllChatsOf(long accountId); - @Query("SELECT * FROM chats WHERE xmppId = :identityId") - LiveData getChatWithIdentity(long identityId); + @Query("SELECT * FROM chats WHERE fk_entity_id = :entityId") + LiveData getChatWithIdentity(long entityId); - @Query("SELECT chats.* FROM chats JOIN entities WHERE accountId = :accountId AND jid = :jid") + @Query("SELECT chats.* FROM chats JOIN entities WHERE fk_account_id = :accountId AND jid = :jid") LiveData getChatWithJid(long accountId, EntityBareJid jid); - @Query("SELECT * FROM chats JOIN contacts WHERE contacts.id = :contactId") + @Query("SELECT * FROM chats JOIN contacts WHERE contacts.pk_contact_id = :contactId") LiveData getChatWithContact(long contactId); } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactAndEntityDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactAndEntityDao.java index b3cf1d7..7a71ff6 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactAndEntityDao.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactAndEntityDao.java @@ -23,8 +23,8 @@ public interface ContactAndEntityDao { "entities." + RoomEntityModel.KEY_ACCOUNT_ID + " AS " + PREFIX + RoomEntityModel.KEY_ACCOUNT_ID + ", " + "entities." + RoomEntityModel.KEY_JID + " AS " + PREFIX + RoomEntityModel.KEY_JID + ", " + "entities." + RoomEntityModel.KEY_AVATAR + " AS " + PREFIX + RoomEntityModel.KEY_AVATAR + " " + - "FROM contacts INNER JOIN entities ON contacts.entityId = entities.id " + - "WHERE entities.accountId = :accountId AND entities.jid = :bareJid") + "FROM contacts INNER JOIN entities ON contacts.fk_entity_id = entities.pk_entity_id " + + "WHERE entities.fk_account_id = :accountId AND entities.jid = :bareJid") LiveData getContactAndEntity(long accountId, EntityBareJid bareJid); @Query("SELECT contacts.*, " + @@ -32,8 +32,8 @@ public interface ContactAndEntityDao { "entities." + RoomEntityModel.KEY_ACCOUNT_ID + " AS " + PREFIX + RoomEntityModel.KEY_ACCOUNT_ID + ", " + "entities." + RoomEntityModel.KEY_JID + " AS " + PREFIX + RoomEntityModel.KEY_JID + ", " + "entities." + RoomEntityModel.KEY_AVATAR + " AS " + PREFIX + RoomEntityModel.KEY_AVATAR + " " + - "FROM contacts INNER JOIN entities ON contacts.entityId = entities.id " + - "WHERE entities.accountId = :accountId") + "FROM contacts INNER JOIN entities ON contacts.fk_entity_id = entities.pk_entity_id " + + "WHERE entities.fk_account_id = :accountId") LiveData> getAllContactAndEntities(long accountId); @Query("SELECT contacts.*, " + @@ -41,6 +41,6 @@ public interface ContactAndEntityDao { "entities." + RoomEntityModel.KEY_ACCOUNT_ID + " AS " + PREFIX + RoomEntityModel.KEY_ACCOUNT_ID + ", " + "entities." + RoomEntityModel.KEY_JID + " AS " + PREFIX + RoomEntityModel.KEY_JID + ", " + "entities." + RoomEntityModel.KEY_AVATAR + " AS " + PREFIX + RoomEntityModel.KEY_AVATAR + " " + - "FROM contacts INNER JOIN entities ON contacts.entityId = entities.id") + "FROM contacts INNER JOIN entities ON contacts.fk_entity_id = entities.pk_entity_id") LiveData> getAllContactAndEntities(); } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactDao.java index 29fef42..559d1b2 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactDao.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/ContactDao.java @@ -23,16 +23,16 @@ public interface ContactDao extends BaseDao { @Insert(onConflict = REPLACE) long insert(RoomContactModel entity); - @Query("SELECT * FROM contacts WHERE id = :id") + @Query("SELECT * FROM contacts WHERE pk_contact_id = :id") LiveData getContact(long id); - @Query("SELECT * FROM contacts WHERE id = :id") + @Query("SELECT * FROM contacts WHERE pk_contact_id = :id") RoomContactModel syncGetContact(long id); - @Query("SELECT * FROM contacts WHERE entityId = :entityId") + @Query("SELECT * FROM contacts WHERE fk_entity_id = :entityId") LiveData getContactForEntityId(long entityId); - @Query("SELECT * FROM contacts WHERE entityId = :entityId") + @Query("SELECT * FROM contacts WHERE fk_entity_id = :entityId") RoomContactModel syncGetContactForEntityId(long entityId); /** @@ -44,9 +44,9 @@ public interface ContactDao extends BaseDao { @Query("SELECT * FROM contacts") LiveData> getAllContacts(); - @Query("SELECT contacts.* FROM contacts JOIN entities WHERE contacts.accountId = :accountId AND jid = :jid") + @Query("SELECT contacts.* FROM contacts JOIN entities WHERE contacts.fk_account_id = :accountId AND jid = :jid") RoomContactModel getContactByJid(long accountId, EntityBareJid jid); - @Query("SELECT * FROM contacts WHERE accountId = :accountId") + @Query("SELECT * FROM contacts WHERE fk_account_id = :accountId") LiveData> getContactsForAccount(long accountId); } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityDao.java index b1b4817..a91dbe3 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityDao.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/EntityDao.java @@ -20,16 +20,16 @@ public interface EntityDao extends BaseDao { @Insert(onConflict = REPLACE) long insert(RoomEntityModel entity); - @Query("SELECT * FROM entities WHERE id = :id") + @Query("SELECT * FROM entities WHERE pk_entity_id = :id") LiveData getEntity(long id); - @Query("SELECT * FROM entities WHERE id = :id") + @Query("SELECT * FROM entities WHERE pk_entity_id = :id") RoomEntityModel getEntitySync(long id); - @Query("SELECT * FROM entities WHERE accountId = :accountId AND jid = :jid") + @Query("SELECT * FROM entities WHERE fk_account_id = :accountId AND jid = :jid") LiveData getEntityFor(long accountId, EntityBareJid jid); - @Query("SELECT * FROM entities WHERE accountId = :accountId AND jid = :jid") + @Query("SELECT * FROM entities WHERE fk_account_id = :accountId AND jid = :jid") RoomEntityModel getEntityForSync(long accountId, EntityBareJid jid); } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/MessageDao.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/MessageDao.java index db94cfd..9cb8c76 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/MessageDao.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/dao/MessageDao.java @@ -17,13 +17,13 @@ import java.util.List; @TypeConverters(EntityBareJidConverter.class) public interface MessageDao extends BaseDao { - @Query("SELECT * FROM messages WHERE accountId=:accountId ORDER BY sendDate ASC") + @Query("SELECT * FROM messages WHERE fk_account_id = :accountId ORDER BY send_date ASC") LiveData> getAllMessagesOf(long accountId); - @Query("SELECT * FROM messages WHERE accountId=:accountId AND `from`=:sender ORDER BY sendDate ASC") + @Query("SELECT * FROM messages WHERE fk_account_id = :accountId AND `from` = :sender ORDER BY send_date ASC") LiveData> getAllMessagesFrom(long accountId, EntityBareJid sender); - @Query("SELECT * FROM messages WHERE accountId = :accountId AND (`from` = :peer OR `to` = :peer) ORDER BY sendDate ASC") + @Query("SELECT * FROM messages WHERE fk_account_id = :accountId AND (`from` = :peer OR `to` = :peer) ORDER BY send_date ASC") LiveData> getAllMessagesInConversation(long accountId, EntityBareJid peer); } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomAccountModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomAccountModel.java index 666c37d..074eb44 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomAccountModel.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomAccountModel.java @@ -18,7 +18,7 @@ import static org.mercury_im.messenger.persistence.room.model.RoomAccountModel.T public class RoomAccountModel implements AccountModel { public static final String TABLE = "accounts"; - public static final String KEY_ID = "id"; + public static final String KEY_ID = "pk_account_id"; public static final String KEY_JID = "jid"; public static final String KEY_PASSWORD = "password"; public static final String KEY_ENABLED = "enabled"; diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomChatModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomChatModel.java index 05edbda..dd89e2d 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomChatModel.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomChatModel.java @@ -7,35 +7,39 @@ import androidx.room.Index; import androidx.room.PrimaryKey; import org.mercury_im.messenger.persistence.model.ChatModel; -import org.mercury_im.messenger.persistence.model.EntityModel; import static androidx.room.ForeignKey.CASCADE; import static org.mercury_im.messenger.persistence.room.model.RoomChatModel.KEY_ID; -import static org.mercury_im.messenger.persistence.room.model.RoomChatModel.KEY_XMPPID; +import static org.mercury_im.messenger.persistence.room.model.RoomChatModel.KEY_ENTITY; import static org.mercury_im.messenger.persistence.room.model.RoomChatModel.TABLE; @Entity(tableName = TABLE, - indices = {@Index(KEY_ID), @Index(KEY_XMPPID)}, + indices = { + @Index(KEY_ID), @Index(KEY_ENTITY) + }, foreignKeys = { - @ForeignKey(entity = RoomEntityModel.class, parentColumns = "id", childColumns = "xmppId", onDelete = CASCADE) + @ForeignKey(entity = RoomEntityModel.class, + parentColumns = RoomEntityModel.KEY_ID, + childColumns = KEY_ENTITY, + onDelete = CASCADE) }) public class RoomChatModel implements ChatModel { public static final String TABLE = "chats"; + public static final String KEY_ID = "pk_chat_id"; - public static final String KEY_ID = "id"; - public static final String KEY_XMPPID = "xmppId"; - public static final String KEY_OPEN = "open"; + public static final String KEY_ENTITY = "fk_entity_id"; + public static final String KEY_ACTIVE = "active"; @PrimaryKey(autoGenerate = true) @ColumnInfo(name = KEY_ID) private long id; - @ColumnInfo(name = KEY_XMPPID) - private long peerIdentityId; + @ColumnInfo(name = KEY_ENTITY) + private long peerEntityId; - @ColumnInfo(name = KEY_OPEN) - private boolean isOpened; + @ColumnInfo(name = KEY_ACTIVE) + private boolean isActive; @Override public long getId() { @@ -48,22 +52,22 @@ public class RoomChatModel implements ChatModel { } @Override - public long getPeerIdentityId() { - return peerIdentityId; + public long getPeerEntityId() { + return peerEntityId; } @Override - public void setPeerIdentityId(long id) { - this.peerIdentityId = id; + public void setPeerEntityId(long id) { + this.peerEntityId = id; } @Override - public boolean isOpened() { - return isOpened; + public boolean isActive() { + return isActive; } @Override - public void setIsOpened(boolean opened) { - this.isOpened = opened; + public void setActive(boolean active) { + this.isActive = active; } } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomContactModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomContactModel.java index 632f24e..42233d3 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomContactModel.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomContactModel.java @@ -35,13 +35,13 @@ import static org.mercury_im.messenger.persistence.room.model.RoomContactModel.T public class RoomContactModel implements ContactModel { public static final String TABLE = "contacts"; - public static final String KEY_ID = "id"; - public static final String KEY_ACCOUNT_ID = "accountId"; - public static final String KEY_ENTITY_ID = "entityId"; - public static final String KEY_ROSTER_NAME = "rosterName"; + public static final String KEY_ID = "pk_contact_id"; + public static final String KEY_ACCOUNT_ID = "fk_account_id"; + public static final String KEY_ENTITY_ID = "fk_entity_id"; + public static final String KEY_ROSTER_NAME = "rostername"; public static final String KEY_NICKNAME = "nickname"; - @PrimaryKey + @PrimaryKey(autoGenerate = true) @ColumnInfo(name = KEY_ID) private long id; diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityModel.java index fd264f3..fdbf27c 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityModel.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomEntityModel.java @@ -35,12 +35,12 @@ import static org.mercury_im.messenger.persistence.room.model.RoomEntityModel.TA public class RoomEntityModel implements EntityModel { public static final String TABLE = "entities"; - public static final String KEY_ID = "id"; - public static final String KEY_ACCOUNT_ID = "accountId"; + public static final String KEY_ID = "pk_entity_id"; + public static final String KEY_ACCOUNT_ID = "fk_account_id"; public static final String KEY_JID = "jid"; public static final String KEY_AVATAR = "avatar"; - @PrimaryKey + @PrimaryKey(autoGenerate = true) @ColumnInfo(name = KEY_ID) protected long id; diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomMessageModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomMessageModel.java index 2f72fa7..35d6e1c 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomMessageModel.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomMessageModel.java @@ -32,10 +32,10 @@ import static org.mercury_im.messenger.persistence.room.model.RoomMessageModel.T public class RoomMessageModel implements MessageModel { public static final String TABLE = "messages"; - public static final String KEY_ID = "id"; - public static final String KEY_ACCOUNT_ID = "accountId"; + public static final String KEY_ID = "pk_message_id"; + public static final String KEY_ACCOUNT_ID = "fk_account_id"; public static final String KEY_BODY = "body"; - public static final String KEY_SEND_DATE = "sendDate"; + public static final String KEY_SEND_DATE = "send_date"; public static final String KEY_FROM = "from"; public static final String KEY_TO = "to"; public static final String KEY_INCOMING = "incoming"; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ChatModel.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ChatModel.java index 45be600..dd433b6 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ChatModel.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ChatModel.java @@ -6,11 +6,11 @@ public interface ChatModel { void setId(long id); - long getPeerIdentityId(); + long getPeerEntityId(); - void setPeerIdentityId(long id); + void setPeerEntityId(long id); - boolean isOpened(); + boolean isActive(); - void setIsOpened(boolean opened); + void setActive(boolean opened); } diff --git a/xmpp_core/build.gradle b/xmpp_core/build.gradle index d42c7c2..f3b6b97 100644 --- a/xmpp_core/build.gradle +++ b/xmpp_core/build.gradle @@ -8,9 +8,9 @@ dependencies { api "org.igniterealtime.smack:smack-experimental:$smackExperimentalVersion" api "org.igniterealtime.smack:smack-extensions:$smackExtensionsVersion" api "org.igniterealtime.smack:smack-im:$smackImVersion" - api "org.igniterealtime.smack:smack-omemo:$smackOmemoVersion" - api "org.igniterealtime.smack:smack-omemo-signal:$smackOmemoSignalVersion" - api "org.igniterealtime.smack:smack-openpgp:$smackOpenpgpVersion" + //api "org.igniterealtime.smack:smack-omemo:$smackOmemoVersion" + //api "org.igniterealtime.smack:smack-omemo-signal:$smackOmemoSignalVersion" + //api "org.igniterealtime.smack:smack-openpgp:$smackOpenpgpVersion" // api "org.igniterealtime.smack:smack-resolver-minidns:$smackResolverMiniDnsVersion" api "org.igniterealtime.smack:smack-tcp:$smackTcpVersion" diff --git a/xmpp_core/src/main/java/org/mercury_im/messenger/xmpp_core/MercuryConnection.java b/xmpp_core/src/main/java/org/mercury_im/messenger/xmpp_core/MercuryConnection.java index a116528..84c84af 100644 --- a/xmpp_core/src/main/java/org/mercury_im/messenger/xmpp_core/MercuryConnection.java +++ b/xmpp_core/src/main/java/org/mercury_im/messenger/xmpp_core/MercuryConnection.java @@ -4,14 +4,16 @@ import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.chat2.ChatManager; import org.jivesoftware.smack.roster.Roster; -import org.jivesoftware.smack.util.ExceptionCallback; import org.jivesoftware.smackx.carbons.CarbonManager; -import org.whispersystems.libsignal.logging.Log; + +import java.util.logging.Logger; public abstract class MercuryConnection implements ConnectionListener { public static final String TAG = "Mercury"; + private static final Logger LOGGER = Logger.getLogger(MercuryConnection.class.getName()); + protected final XMPPConnection connection; protected final long accountId; @@ -22,6 +24,7 @@ public abstract class MercuryConnection implements ConnectionListener { public MercuryConnection(XMPPConnection connection, long accountId) { this.connection = connection; + connection.addConnectionListener(this); this.accountId = accountId; this.roster = Roster.getInstanceFor(connection); @@ -64,21 +67,25 @@ public abstract class MercuryConnection implements ConnectionListener { @Override public void authenticated(XMPPConnection connection, boolean resumed) { if (connection == this.connection && !resumed) { - carbonManager.enableCarbonsAsync(exception -> - Log.e("Mercury", "Could not enable carbons for connection " + accountId + ":", exception)); + LOGGER.info("Enabling carbons!"); + carbonManager.enableCarbonsAsync(exception -> { + LOGGER.severe("Could not enable carbons for connection " + accountId + ": " + exception.getMessage()); + exception.printStackTrace(); + }); } getState().updateConnectionState(ConnectionState.CONNECTED); } @Override public void connectionClosed() { - Log.i(TAG, "Connection closed."); + LOGGER.fine("Connection closed."); getState().updateConnectionState(ConnectionState.DISCONNECTED); } @Override public void connectionClosedOnError(Exception e) { - Log.e(TAG, "Connection closed on error.", e); + LOGGER.severe("Connection closed on error: " + e.getMessage()); + e.printStackTrace(); getState().updateConnectionState(ConnectionState.DISCONNECTED); } }