From b9eb37e387bd27db888fb029b4c353de68c5f793 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Sep 2019 01:06:17 +0200 Subject: [PATCH] Experiements --- .../mercury_im/messenger/ui/MainActivity.java | 6 ++ .../messenger/ui/chat/ChatActivity.java | 14 +++ .../ui/chatlist/ChatListFragment.java | 2 +- .../chatlist/ChatListRecyclerViewAdapter.java | 74 ++++++---------- .../ui/chatlist/ChatListViewModel.java | 21 ++++- .../ui/login/AccountsRecyclerViewAdapter.java | 1 - .../messenger/ui/roster/RosterFragment.java | 2 +- .../ui/roster/RosterRecyclerViewAdapter.java | 59 +++++++------ .../ui/util/AbstractRecyclerViewAdapter.java | 86 +++++++++++++++++++ app/src/main/res/layout/activity_chat.xml | 12 +-- app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/menu/menu_chat.xml | 4 + .../1.json | 12 +-- .../room/RoomRepositoryModule.java | 4 +- .../persistence/room/dao/ChatDao.java | 13 +++ .../persistence/room/dao/MessageDao.java | 6 ++ .../room/model/RoomEntityModel.java | 15 ---- .../messenger/persistence/room/pojo/Chat.java | 10 +++ .../room/repository/IAccountRepository.java | 1 - .../room/repository/IChatRepository.java | 19 +++- .../room/repository/IMessageRepository.java | 10 +++ .../persistence/model/EntityModel.java | 12 +-- .../repository/ChatRepository.java | 2 + .../repository/MessageRepository.java | 4 + 24 files changed, 264 insertions(+), 131 deletions(-) create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java create mode 100644 persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/pojo/Chat.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index 7791a44..89bbbe1 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -18,6 +18,7 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.persistence.model.AccountModel; +import org.mercury_im.messenger.persistence.repository.ChatRepository; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsActivity; import org.mercury_im.messenger.ui.login.AccountsFragment; @@ -25,6 +26,8 @@ import org.mercury_im.messenger.ui.login.LoginActivity; import org.mercury_im.messenger.ui.roster.RosterFragment; import org.mercury_im.messenger.ui.settings.SettingsActivity; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; @@ -32,6 +35,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, AccountsFragment.OnAccountListItemClickListener { + @Inject + ChatRepository chatRepository; + @BindView(R.id.toolbar) Toolbar toolbar; 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 30545f5..b9e2e72 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 @@ -21,12 +21,16 @@ import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.core.centers.ConnectionCenter; +import org.mercury_im.messenger.persistence.repository.ChatRepository; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; +import io.reactivex.Scheduler; +import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; public class ChatActivity extends AppCompatActivity implements ChatInputFragment.OnChatInputActionListener, SearchView.OnQueryTextListener { @@ -43,6 +47,9 @@ public class ChatActivity extends AppCompatActivity @BindView(R.id.recyclerView) RecyclerView recyclerView; + @Inject + ChatRepository chatRepository; + private final ChatRecyclerViewAdapter recyclerViewAdapter = new ChatRecyclerViewAdapter(); private ChatViewModel chatViewModel; @@ -118,6 +125,13 @@ public class ChatActivity extends AppCompatActivity @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.action_debug: + chatRepository.getOrCreateChatWith(accountId, JidCreate.entityBareFromOrThrowUnchecked("alice@wonderland.lit")) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + break; + // menu_chat case R.id.action_call: case R.id.action_clear_history: diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java index 78b2639..ec1384d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java @@ -60,7 +60,7 @@ public class ChatListFragment extends Fragment { return; } Log.d(TAG, "Displaying " + chatModels.size() + " chats"); - recyclerViewAdapter.setItems(chatModels); + recyclerViewAdapter.setModels(chatModels); }); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java index 3cc1ee1..a1ae48e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java @@ -1,69 +1,43 @@ package org.mercury_im.messenger.ui.chatlist; -import android.content.Context; -import android.content.Intent; -import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityOptionsCompat; import androidx.recyclerview.widget.RecyclerView; -import org.jivesoftware.smackx.colors.ConsistentColor; -import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.R; import org.mercury_im.messenger.persistence.model.ChatModel; -import org.mercury_im.messenger.persistence.room.model.RoomChatModel; -import org.mercury_im.messenger.persistence.room.model.RoomContactModel; -import org.mercury_im.messenger.ui.chat.ChatActivity; -import org.mercury_im.messenger.util.ColorUtil; - -import java.util.ArrayList; -import java.util.List; +import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import butterknife.BindView; import butterknife.ButterKnife; import de.hdodenhof.circleimageview.CircleImageView; public class ChatListRecyclerViewAdapter - extends RecyclerView.Adapter { - - private List chatModelList; + extends AbstractRecyclerViewAdapter { public ChatListRecyclerViewAdapter() { - this.chatModelList = new ArrayList<>(); + super(new ChatMessageDiffCallback(true)); } @NonNull @Override - public ChatListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ChatListItemViewHolder(parent.getContext(), LayoutInflater.from(parent.getContext()) - .inflate(R.layout.recycler_view_item_chat_list, parent, false)); + public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_view_item_chat_list, parent, false); + return new ChatHolder(view); } @Override - public void onBindViewHolder(@NonNull ChatListItemViewHolder holder, int position) { - ChatModel model = chatModelList.get(position); - holder.bind(model); + public void onBindViewHolder(@NonNull ChatHolder holder, int position) { + ChatModel model = getModelAt(position); + // TODO: Better bindable model pls } - @Override - public int getItemCount() { - return chatModelList.size(); - } - - public void setItems(List chatModels) { - this.chatModelList = chatModels; - notifyDataSetChanged(); - } - - public class ChatListItemViewHolder extends RecyclerView.ViewHolder { - - private View view; + public static class ChatHolder extends RecyclerView.ViewHolder { @BindView(R.id.chat_name) TextView nameView; @@ -77,18 +51,26 @@ public class ChatListRecyclerViewAdapter @BindView(R.id.chat_avatar) CircleImageView avatarView; - Context context; - - public ChatListItemViewHolder(Context context, View itemView) { + public ChatHolder(@NonNull View itemView) { super(itemView); - this.context = context; - this.view = itemView; - ButterKnife.bind(this, view); + ButterKnife.bind(this, itemView); + } + } + + private static class ChatMessageDiffCallback extends AbstractDiffCallback { + + public ChatMessageDiffCallback(boolean detectMoves) { + super(detectMoves); } - void bind(ChatModel chatModel) { - String name = chatModel.getPeerEntityId() + ""; - nameView.setText(name); + @Override + public boolean areItemsTheSame(ChatModel oldItem, ChatModel newItem) { + return oldItem.getId() == newItem.getId(); + } + + @Override + public boolean areContentsTheSame(ChatModel oldItem, ChatModel newItem) { + return areItemsTheSame(oldItem, newItem); } } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index 30e2a3f..c9d54f1 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -6,7 +6,9 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.persistence.model.ChatModel; +import org.mercury_im.messenger.persistence.model.MessageModel; import org.mercury_im.messenger.persistence.repository.ChatRepository; +import org.mercury_im.messenger.persistence.repository.MessageRepository; import java.util.List; @@ -22,6 +24,9 @@ public class ChatListViewModel extends ViewModel { @Inject ChatRepository chatRepository; + @Inject + MessageRepository messageRepository; + private CompositeDisposable disposable = new CompositeDisposable(); private final MutableLiveData> chats = new MutableLiveData<>(); @@ -32,7 +37,21 @@ public class ChatListViewModel extends ViewModel { disposable.add(chatRepository.getAllChats() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe((Consumer>) chats::setValue)); + .subscribe((Consumer>) chatModels -> { + chats.setValue(chatModels); + //for (ChatModel chat : chatModels) { + // messageRepository.getLastMessageFrom(chat.ge) + //} + })); + + disposable.add(messageRepository.getAllMessages() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((Consumer>) messageModels -> { + for (MessageModel message : messageModels) { + + } + })); } public LiveData> getChats() { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index b13bc25..deb39ee 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -69,7 +69,6 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - - private List entryModelList; + extends AbstractRecyclerViewAdapter { public RosterRecyclerViewAdapter() { - this.entryModelList = new ArrayList<>(); + super(new ContactDiffCallback()); } @NonNull @@ -45,20 +46,10 @@ public class RosterRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull RosterItemViewHolder holder, int position) { - RoomContactModel model = entryModelList.get(position); + RoomContactModel model = getModelAt(position); holder.bind(model); } - @Override - public int getItemCount() { - return entryModelList.size(); - } - - public void setItems(List rosterEntryModels) { - this.entryModelList = rosterEntryModels; - notifyDataSetChanged(); - } - public class RosterItemViewHolder extends RecyclerView.ViewHolder { private View view; @@ -87,24 +78,32 @@ public class RosterRecyclerViewAdapter EntityBareJid jid = contactModel.getEntity().getJid(); jidView.setText(jid.toString()); jidView.setTextColor(ColorUtil.consistentColor(jid.toString(), new ConsistentColor.ConsistentColorSettings(ConsistentColor.Deficiency.none))); - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { + view.setOnClickListener(view -> { - Intent intent = new Intent(context, ChatActivity.class); - intent.putExtra("JID", jid.toString()); - intent.putExtra("ACCOUNT", contactModel.getEntity().getAccountId()); + Intent intent = new Intent(context, ChatActivity.class); + intent.putExtra("JID", jid.toString()); + intent.putExtra("ACCOUNT", contactModel.getEntity().getAccountId()); - // 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); - } - } + context.startActivity(intent); }); } } + + private static class ContactDiffCallback extends AbstractDiffCallback { + + public ContactDiffCallback() { + super(true); + } + + @Override + public boolean areItemsTheSame(RoomContactModel oldItem, RoomContactModel newItem) { + return oldItem.getId() == newItem.getId(); + } + + @Override + public boolean areContentsTheSame(RoomContactModel oldItem, RoomContactModel newItem) { + return areItemsTheSame(oldItem, newItem) && + Objects.equals(oldItem.getRosterName(), newItem.getRosterName()); + } + } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java new file mode 100644 index 0000000..deceabb --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java @@ -0,0 +1,86 @@ +package org.mercury_im.messenger.ui.util; + +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractRecyclerViewAdapter extends RecyclerView.Adapter { + + private final List models = new ArrayList<>(); + private final AbstractDiffCallback diffCallback; + + public AbstractRecyclerViewAdapter(AbstractDiffCallback diffCallback) { + this.diffCallback = diffCallback; + } + + public void setModels(List newModels) { + diffCallback.setData(this.models, newModels); + DiffUtil.DiffResult delta = DiffUtil.calculateDiff(diffCallback, diffCallback.detectMoves); + this.models.clear(); + this.models.addAll(newModels); + delta.dispatchUpdatesTo(this); + } + + public List getModels() { + return models; + } + + public M getModelAt(int position) { + return getModels().get(position); + } + + @Override + public int getItemCount() { + return models.size(); + } + + public static abstract class AbstractDiffCallback extends DiffUtil.Callback { + + private List oldData; + private List newData; + private boolean detectMoves; + + public AbstractDiffCallback(boolean detectMoves) { + this.detectMoves = detectMoves; + } + + public void setData(List oldData, List newData) { + this.oldData = oldData; + this.newData = newData; + } + + public I oldItemAt(int index) { + return oldData.get(index); + } + + public I newItemAt(int index) { + return newData.get(index); + } + + @Override + public int getOldListSize() { + return oldData.size(); + } + + @Override + public int getNewListSize() { + return newData.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + return areItemsTheSame(oldItemAt(oldItemPosition), newItemAt(newItemPosition)); + } + + public abstract boolean areItemsTheSame(I oldItem, I newItem); + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return areContentsTheSame(oldItemAt(oldItemPosition), newItemAt(newItemPosition)); + } + + public abstract boolean areContentsTheSame(I oldItem, I newItem); + } +} diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index 00ae087..6b64178 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -5,7 +5,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:menu="@menu/menu_chat" tools:context=".ui.chat.ChatActivity"> - - - - + android:background="?attr/colorPrimary" + tools:menu="@menu/menu_chat"/> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0c9d99b..cfe371f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -14,9 +14,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary"> - - + android:background="?attr/colorPrimary" /> @@ -27,7 +25,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" - android:background="@color/colorPrimary" + android:background="@color/colorAccent" app:menu="@menu/bottom_menu_main" /> \ No newline at end of file diff --git a/app/src/main/res/menu/menu_chat.xml b/app/src/main/res/menu/menu_chat.xml index 5180d22..7b59a6d 100644 --- a/app/src/main/res/menu/menu_chat.xml +++ b/app/src/main/res/menu/menu_chat.xml @@ -31,4 +31,8 @@ android:orderInCategory="400" android:title="@string/action_delete_chat" app:showAsAction="never" /> + + \ No newline at end of file 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 233993a..dd651e8 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,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "fdd5152ff14dba77ae4dba978fc0bb11", + "identityHash": "343b0cb91d977d378c17c577a4dc231d", "entities": [ { "tableName": "accounts", @@ -59,7 +59,7 @@ }, { "tableName": "entities", - "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 )", + "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, FOREIGN KEY(`fk_account_id`) REFERENCES `accounts`(`pk_account_id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -78,12 +78,6 @@ "columnName": "jid", "affinity": "TEXT", "notNull": true - }, - { - "fieldPath": "avatarFile", - "columnName": "avatar", - "affinity": "TEXT", - "notNull": false } ], "primaryKey": { @@ -531,7 +525,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, 'fdd5152ff14dba77ae4dba978fc0bb11')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '343b0cb91d977d378c17c577a4dc231d')" ] } } \ No newline at end of file diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java index ab23069..b844f03 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/RoomRepositoryModule.java @@ -37,8 +37,8 @@ public class RoomRepositoryModule { @Singleton @Provides - ChatRepository provideChatRepository(ChatDao dao) { - return new IChatRepository(dao); + ChatRepository provideChatRepository(ChatDao chatDao, EntityDao entityDao) { + return new IChatRepository(chatDao, entityDao); } @Singleton 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 1653a5a..1c99699 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 @@ -6,6 +6,7 @@ import androidx.room.TypeConverters; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.room.model.RoomChatModel; +import org.mercury_im.messenger.persistence.room.pojo.Chat; import org.mercury_im.messenger.persistence.room.type_converter.EntityBareJidConverter; import java.util.List; @@ -31,4 +32,16 @@ public interface ChatDao extends BaseDao { @Query("SELECT chats.* FROM chats JOIN contacts WHERE contacts.pk_contact_id = :contactId") Maybe getChatWithContact(long contactId); + + @Query("SELECT chats.* FROM chats JOIN entities WHERE fk_account_id = :accountId AND jid = :jid") + Observable getObservableChatWithJid(long accountId, EntityBareJid jid); + + @Query("SELECT " + + "pk_chat_id as chatId, " + + "fk_entity_id as entityId, " + + "active, " + + "jid " + + "FROM chats INNER JOIN entities") + Observable getChat(); + } 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 0cb4011..ed71792 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 @@ -16,6 +16,9 @@ import io.reactivex.Observable; @TypeConverters(EntityBareJidConverter.class) public interface MessageDao extends BaseDao { + @Query("SELECT * FROM messages") + Observable> getAllMessages(); + @Query("SELECT * FROM messages " + "WHERE fk_account_id = :accountId " + "ORDER BY send_date ASC") @@ -47,4 +50,7 @@ public interface MessageDao extends BaseDao { "AND body LIKE :query " + "COLLATE utf8_general_ci") // case insensitive Observable> findMessageByQuery(long accountId, EntityBareJid peer, String query); + + @Query("SELECT * FROM messages WHERE fk_account_id = :accountId AND (`from` = :peer OR `to` = :peer) ORDER BY send_date DESC LIMIT 1") + Observable getLastMessageFrom(long accountId, EntityBareJid peer); } 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 fdbf27c..8870dd4 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 @@ -52,10 +52,6 @@ public class RoomEntityModel implements EntityModel { @ColumnInfo(name = KEY_JID) protected EntityBareJid jid; - @TypeConverters(FileConverter.class) - @ColumnInfo(name = KEY_AVATAR) - protected File avatarFile; - @Override public long getId() { return id; @@ -86,15 +82,4 @@ public class RoomEntityModel implements EntityModel { public void setAccountId(long accountId) { this.accountId = accountId; } - - @Override - public File getAvatarFile() { - return avatarFile; - } - - @Override - public void setAvatarFile(File file) { - this.avatarFile = file; - } - } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/pojo/Chat.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/pojo/Chat.java new file mode 100644 index 0000000..47a396a --- /dev/null +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/pojo/Chat.java @@ -0,0 +1,10 @@ +package org.mercury_im.messenger.persistence.room.pojo; + +import org.jxmpp.jid.EntityBareJid; + +public class Chat { + public long chatId; + public long entityId; + public EntityBareJid jid; + +} diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IAccountRepository.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IAccountRepository.java index 6d15c5b..246cc1e 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IAccountRepository.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IAccountRepository.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.persistence.room.repository; -import org.mercury_im.messenger.persistence.model.AccountModel; import org.mercury_im.messenger.persistence.repository.AccountRepository; import org.mercury_im.messenger.persistence.room.dao.AccountDao; import org.mercury_im.messenger.persistence.room.model.RoomAccountModel; diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IChatRepository.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IChatRepository.java index c96aa90..3c61e1b 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IChatRepository.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IChatRepository.java @@ -2,11 +2,14 @@ package org.mercury_im.messenger.persistence.room.repository; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.model.AccountModel; +import org.mercury_im.messenger.persistence.model.ChatModel; import org.mercury_im.messenger.persistence.model.ContactModel; import org.mercury_im.messenger.persistence.model.EntityModel; import org.mercury_im.messenger.persistence.repository.ChatRepository; import org.mercury_im.messenger.persistence.room.dao.ChatDao; +import org.mercury_im.messenger.persistence.room.dao.EntityDao; import org.mercury_im.messenger.persistence.room.model.RoomChatModel; +import org.mercury_im.messenger.persistence.room.model.RoomEntityModel; import java.util.List; @@ -15,14 +18,21 @@ import javax.inject.Inject; import io.reactivex.Completable; import io.reactivex.Maybe; import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.SingleTransformer; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; public class IChatRepository implements ChatRepository { private final ChatDao chatDao; + private final EntityDao entityDao; @Inject - public IChatRepository(ChatDao dao) { - this.chatDao = dao; + public IChatRepository(ChatDao chatDao, EntityDao entityDao) { + this.chatDao = chatDao; + this.entityDao = entityDao; } @Override @@ -30,6 +40,11 @@ public class IChatRepository implements ChatRepository { return new RoomChatModel(); } + @Override + public Observable getOrCreateChatWith(long accountId, EntityBareJid jid) { + + } + @Override public Observable> getAllChats() { return chatDao.getAllChats(); diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IMessageRepository.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IMessageRepository.java index a9f1d14..d96b9aa 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IMessageRepository.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IMessageRepository.java @@ -37,6 +37,16 @@ public class IMessageRepository implements MessageRepository { return messageDao.insert(message); } + @Override + public Observable getLastMessageFrom(long accountId, EntityBareJid peer) { + return messageDao.getLastMessageFrom(accountId, peer); + } + + @Override + public Observable> getAllMessages() { + return messageDao.getAllMessages(); + } + @Override public Observable> getAllMessagesOf(long accountId) { return messageDao.getAllMessagesOf(accountId); diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityModel.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityModel.java index 87daf27..1df39d3 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityModel.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/EntityModel.java @@ -7,8 +7,7 @@ import java.io.File; /** * An {@link EntityModel} represents an XMPP user as seen by an account. - * Its primary key should be composited of its {@link EntityBareJid} and the primary key of the - * {@link AccountModel} which is communicating with the user. + * The pair (account_id, jid) MUST be unique. */ public interface EntityModel { @@ -16,15 +15,12 @@ public interface EntityModel { void setId(long id); - EntityBareJid getJid(); - - void setJid(EntityBareJid jid); - long getAccountId(); void setAccountId(long accountId); - File getAvatarFile(); + EntityBareJid getJid(); + + void setJid(EntityBareJid jid); - void setAvatarFile(File file); } diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java index 0ebb803..ada5217 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java @@ -20,6 +20,8 @@ public interface ChatRepository { Observable> getAllChatsOf(AccountModel account); + Observable getOrCreateChatWith(long accountId, EntityBareJid jid); + Maybe getChatWith(AccountModel account, EntityBareJid jid); Maybe getChatWith(EntityModel identity); diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java index 4f7b07d..0e037e8 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java @@ -17,6 +17,8 @@ public interface MessageRepository { Single insertMessage(E message); + Observable> getAllMessages(); + Observable> getAllMessagesOf(long accountId); Observable> getAllMessagesOfChat(long accountId, EntityBareJid peer); @@ -28,4 +30,6 @@ public interface MessageRepository { Observable> findMessageByQuery(long accountId, String query); Observable> findMessageByQuery(long accountId, EntityBareJid peer, String query); + + Observable getLastMessageFrom(long accountId, EntityBareJid peer); }