From 308ca9c467a0e15ea71b6e57ac6ff03929f71100 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 3 Jun 2019 01:16:49 +0200 Subject: [PATCH] Temp --- app/build.gradle | 9 +- app/src/main/AndroidManifest.xml | 1 + .../messenger/di/component/AppComponent.java | 9 ++ .../mercury_im/messenger/ui/MainActivity.java | 5 + .../messenger/ui/chat/ChatInputFragment.java | 39 ++++++- .../messenger/ui/login/AccountsActivity.java | 47 ++++++++ .../messenger/ui/login/AccountsFragment.java | 104 +++++++++++++++++ .../ui/login/AccountsRecyclerViewAdapter.java | 87 ++++++++++++++ .../messenger/ui/login/AccountsViewModel.java | 31 +++++ .../messenger/ui/login/AddAccountDialog.java | 21 ++++ .../messenger/ui/login/LoginActivity.java | 19 +-- .../ui/roster/RosterItemViewModel.java | 30 +++++ .../ui/roster/RosterRecyclerViewAdapter.java | 60 +++++++--- app/src/main/res/layout/content_accounts.xml | 9 ++ .../res/layout/dialog_account_details.xml | 49 ++++++++ .../main/res/layout/fragment_account_list.xml | 13 +++ .../res/layout/recycler_view_item_account.xml | 46 ++++++++ .../recycler_view_item_roster_entry.xml | 109 ++++++++++-------- app/src/main/res/menu/menu_main.xml | 6 + app/src/main/res/values/dimens.xml | 1 + persistence-room/build.gradle | 4 +- .../1.json | 102 +++++++++++++++- .../persistence/room/AppDatabase.java | 8 +- .../persistence/room/dao/MessageDao.java | 6 +- .../room/model/RoomAccountModel.java | 3 +- .../persistence/room/model/RoomChatModel.java | 21 ++-- .../room/model/RoomContactModel.java | 3 +- .../room/model/RoomMessageModel.java | 25 ++-- .../room/model/RoomXmppIdentityModel.java | 6 + .../room/repository/IChatRepository.java | 20 ++++ .../room/repository/IContactRepository.java | 5 + .../room/repository/IMessageRepository.java | 7 +- .../room/type_converter/FileConverter.java | 18 +++ .../persistence/model/ContactModel.java | 6 + .../repository/ContactRepository.java | 2 + version.gradle | 5 +- 36 files changed, 823 insertions(+), 113 deletions(-) create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/login/AccountsActivity.java create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/roster/RosterItemViewModel.java create mode 100644 app/src/main/res/layout/content_accounts.xml create mode 100644 app/src/main/res/layout/dialog_account_details.xml create mode 100644 app/src/main/res/layout/fragment_account_list.xml create mode 100644 app/src/main/res/layout/recycler_view_item_account.xml create mode 100644 persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/type_converter/FileConverter.java diff --git a/app/build.gradle b/app/build.gradle index 8008107..7b5195c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,10 +77,6 @@ dependencies { transitive = true } - /* - architecture components for database and lifecycle management - */ - // ViewModel and LiveData implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion" annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" @@ -89,6 +85,10 @@ dependencies { implementation "com.google.dagger:dagger:$daggerVersion" annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" + // ButterKnife for View Binding + implementation "com.jakewharton:butterknife:$butterKnifeVersion" + annotationProcessor "com.jakewharton:butterknife-compiler:$butterKnifeVersion" + // support libraries implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'com.google.android.material:material:1.0.0' @@ -96,6 +96,7 @@ dependencies { implementation 'androidx.vectordrawable:vectordrawable:1.0.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.recyclerview:recyclerview:1.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bc54f7e..fc74aac 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,7 @@ + diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index cedb7f9..79241e0 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -10,6 +10,8 @@ import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.chat.ChatInputFragment; import org.mercury_im.messenger.ui.chat.ChatInputViewModel; import org.mercury_im.messenger.ui.chat.ChatViewModel; +import org.mercury_im.messenger.ui.login.AccountsActivity; +import org.mercury_im.messenger.ui.login.AccountsViewModel; import org.mercury_im.messenger.ui.login.LoginActivity; import org.mercury_im.messenger.ui.login.LoginViewModel; import org.mercury_im.messenger.ui.roster.RosterViewModel; @@ -27,6 +29,7 @@ public interface AppComponent { void inject(MercuryImApplication mercuryImApplication); + // Views void inject(MainActivity mainActivity); @@ -35,8 +38,11 @@ public interface AppComponent { void inject(ChatActivity chatActivity); + void inject(AccountsActivity accountsActivity); + void inject(ChatInputFragment chatInputFragment); + // ViewModels void inject(RosterViewModel rosterViewModel); @@ -47,6 +53,9 @@ public interface AppComponent { void inject(LoginViewModel loginViewModel); + void inject(AccountsViewModel accountsViewModel); + + // Services void inject(XmppStartedService service); 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 ff8a994..6ecb5f7 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 @@ -19,6 +19,7 @@ import org.mercury_im.messenger.persistence.room.model.RoomContactModel; import org.mercury_im.messenger.persistence.repository.AccountRepository; import org.mercury_im.messenger.persistence.repository.ContactRepository; import org.mercury_im.messenger.ui.chat.ChatActivity; +import org.mercury_im.messenger.ui.login.AccountsActivity; import org.mercury_im.messenger.ui.login.LoginActivity; import org.mercury_im.messenger.ui.settings.SettingsActivity; @@ -79,6 +80,10 @@ public class MainActivity extends AppCompatActivity { case R.id.action_chat: startActivity(new Intent(getApplicationContext(), ChatActivity.class)); return true; + + case R.id.action_accounts: + startActivity(new Intent(getApplicationContext(), AccountsActivity.class)); + return true; } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java index ce8aa84..d4818f4 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.ui.chat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; + +import android.content.Context; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -24,6 +26,8 @@ public class ChatInputFragment extends Fragment implements View.OnClickListener private ChatInputViewModel mViewModel; + private OnChatInputActionListener actionListener; + public static ChatInputFragment newInstance() { return new ChatInputFragment(); } @@ -42,7 +46,7 @@ public class ChatInputFragment extends Fragment implements View.OnClickListener return view; } - @Override + @Override2 public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mViewModel = ViewModelProviders.of(this).get(ChatInputViewModel.class); @@ -58,19 +62,50 @@ public class ChatInputFragment extends Fragment implements View.OnClickListener }); } + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnChatInputActionListener) { + this.actionListener = (OnChatInputActionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnListFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + this.actionListener = null; + } + @Override public void onClick(View view) { switch (view.getId()) { // Add media case R.id.chat_field__button_attachment: + if (actionListener != null) { + actionListener.onButtonAddAttachementClicked(); + } Toast.makeText(getContext(), R.string.not_yet_implemented, Toast.LENGTH_SHORT).show(); break; // Send message case R.id.chat_field__button_send: + if (actionListener != null) { + actionListener.onComposingBodySend(textInput.getText().toString()); + } textInput.setText(null); - Toast.makeText(getContext(), "Send message clicked", Toast.LENGTH_SHORT).show(); break; } } + + public interface OnChatInputActionListener { + + void onButtonAddAttachementClicked(); + + void onComposingBodyChanged(String body); + + void onComposingBodySend(String body); + } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsActivity.java new file mode 100644 index 0000000..9bd6176 --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsActivity.java @@ -0,0 +1,47 @@ +package org.mercury_im.messenger.ui.login; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Toast; + +import androidx.fragment.app.FragmentActivity; + +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.AccountRepository; + +import javax.inject.Inject; + +public class AccountsActivity extends FragmentActivity implements AccountsFragment.OnListFragmentInteractionListener { + + @Inject + AccountRepository accountRepository; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.content_accounts); + + MercuryImApplication.getApplication().getAppComponent().inject(this); + + } + + @Override + public void onListFragmentInteraction(AccountModel item) { + View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_account_details, null); + AlertDialog.Builder builder = new AlertDialog.Builder(this) + .setView(dialogView) + .setTitle(item.getJid()) + .setPositiveButton("Save", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + + } + }); + builder.create().show(); + } +} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java new file mode 100644 index 0000000..82771b0 --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -0,0 +1,104 @@ +package org.mercury_im.messenger.ui.login; + +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.R; +import org.mercury_im.messenger.persistence.model.AccountModel; + +/** + * A fragment representing a list of Items. + *

+ * Activities containing this fragment MUST implement the {@link OnListFragmentInteractionListener} + * interface. + */ +public class AccountsFragment extends Fragment { + + private OnListFragmentInteractionListener mListener; + + AccountsViewModel viewModel; + + private AccountsRecyclerViewAdapter adapter; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public AccountsFragment() { + } + + // TODO: Customize parameter initialization + @SuppressWarnings("unused") + public static AccountsFragment newInstance() { + AccountsFragment fragment = new AccountsFragment(); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + Log.d(MercuryImApplication.TAG, "AccountsFragment.onCreateView"); + View view = inflater.inflate(R.layout.fragment_account_list, container, false); + viewModel = ViewModelProviders.of(this).get(AccountsViewModel.class); + + // Set the adapter + if (view instanceof RecyclerView) { + Context context = view.getContext(); + RecyclerView recyclerView = (RecyclerView) view; + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + this.adapter = new AccountsRecyclerViewAdapter(viewModel.getAccounts().getValue(), mListener); + viewModel.getAccounts().observe(this, roomAccountModels -> adapter.setValues(roomAccountModels)); + recyclerView.setAdapter(adapter); + } + + return view; + } + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnListFragmentInteractionListener) { + mListener = (OnListFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnListFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + public interface OnListFragmentInteractionListener { + // TODO: Update argument type and name + void onListFragmentInteraction(AccountModel item); + } +} 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 new file mode 100644 index 0000000..c85ffc4 --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -0,0 +1,87 @@ +package org.mercury_im.messenger.ui.login; + +import androidx.recyclerview.widget.RecyclerView; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Switch; +import android.widget.TextView; + +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.room.model.RoomAccountModel; +import org.mercury_im.messenger.ui.login.AccountsFragment.OnListFragmentInteractionListener; + +import java.util.ArrayList; +import java.util.List; + +import de.hdodenhof.circleimageview.CircleImageView; + +public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { + + private final List mValues; + private final OnListFragmentInteractionListener mListener; + + public AccountsRecyclerViewAdapter(List items, OnListFragmentInteractionListener listener) { + mValues = items != null ? items : new ArrayList<>(); + mListener = listener; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_view_item_account, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + AccountModel account = mValues.get(position); + holder.jid.setText(account.getJid()); + holder.enabled.setChecked(account.getEnabled()); + holder.accountModel = account; + holder.mView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (null != mListener) { + // Notify the active callbacks interface (the activity, if the + // fragment is attached to one) that an item has been selected. + mListener.onListFragmentInteraction(holder.accountModel); + } + } + }); + } + + public void setValues(List values) { + this.mValues.clear(); + if (values != null) { + mValues.addAll(values); + } + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + Log.d(MercuryImApplication.TAG, "Accounts Item Count: " + mValues.size()); + return mValues.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public AccountModel accountModel; + public final View mView; + public final CircleImageView avatar; + public final TextView jid; + public final Switch enabled; + + public ViewHolder(View view) { + super(view); + mView = view; + avatar = view.findViewById(R.id.avatar_account); + jid = view.findViewById(R.id.text_account_jid); + enabled = view.findViewById(R.id.switch_account_enabled); + } + } +} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java new file mode 100644 index 0000000..474702c --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java @@ -0,0 +1,31 @@ +package org.mercury_im.messenger.ui.login; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.ViewModel; + +import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.persistence.repository.AccountRepository; +import org.mercury_im.messenger.persistence.room.model.RoomAccountModel; + +import java.util.List; + +import javax.inject.Inject; + +public class AccountsViewModel extends ViewModel { + + @Inject + AccountRepository repository; + + private LiveData> accounts; + + @Inject + public AccountsViewModel() { + super(); + MercuryImApplication.getApplication().getAppComponent().inject(this); + accounts = repository.getAllAccountsLive(); + } + + public LiveData> getAccounts() { + return accounts; + } +} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java new file mode 100644 index 0000000..eb276cc --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java @@ -0,0 +1,21 @@ +package org.mercury_im.messenger.ui.login; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +public class AddAccountDialog extends AlertDialog { + + protected AddAccountDialog(@NonNull Context context, int themeResId) { + super(context, themeResId); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + } + +} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index 8113821..e5cf1bd 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -5,6 +5,8 @@ import androidx.lifecycle.ViewModelProviders; import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; + +import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; @@ -25,6 +27,9 @@ import org.mercury_im.messenger.service.XmppStartedService; import javax.inject.Inject; +import butterknife.BindView; +import butterknife.ButterKnife; + /** * A login screen that offers login via email/password. */ @@ -34,10 +39,11 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito AccountRepository accountRepository; // UI references. + @BindView(R.id.jid) private AutoCompleteTextView mJidView; + + @BindView(R.id.password) private EditText mPasswordView; - private View mProgressView; - private View mLoginFormView; private LoginViewModel viewModel; @@ -49,8 +55,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito MercuryImApplication.getApplication().getAppComponent().inject(this); // Set up the login form. - mJidView = findViewById(R.id.jid); - mPasswordView = findViewById(R.id.password); + ButterKnife.bind(this); viewModel = ViewModelProviders.of(this).get(LoginViewModel.class); displayCredentials(viewModel.getAccount()); @@ -65,9 +70,6 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito loginDetailsEntered(); } }); - - mLoginFormView = findViewById(R.id.login_form); - mProgressView = findViewById(R.id.login_progress); } private void displayCredentials(LiveData account) { @@ -86,6 +88,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito }); } + // TODO: Move to ViewModel private void loginDetailsEntered() { boolean loginIntact = true; String jidInput = mJidView.getText().toString(); @@ -112,8 +115,8 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito accountModel.setJid(jid); accountModel.setPassword(password); long id = accountRepository.insertAccount(accountModel); + Log.d(MercuryImApplication.TAG, "LoginActivity.loginDetailsEntered: Account " + id + " inserted."); attemptLogin(jid, password, id); - } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterItemViewModel.java new file mode 100644 index 0000000..10c7b5e --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/RosterItemViewModel.java @@ -0,0 +1,30 @@ +package org.mercury_im.messenger.ui.roster; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; + +import org.mercury_im.messenger.persistence.room.model.RoomContactModel; +import org.mercury_im.messenger.persistence.room.repository.IContactRepository; + +import javax.inject.Inject; + +public class RosterItemViewModel extends AndroidViewModel { + + @Inject + IContactRepository contactRepository; + + private LiveData contact; + + @Inject + public RosterItemViewModel(@NonNull Application application) { + super(application); + } + + public RosterItemViewModel setContactId(long id) { + this.contact = contactRepository.getRosterEntry(id); + return this; + } +} 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 8220d34..1526541 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 @@ -12,8 +12,11 @@ import org.mercury_im.messenger.persistence.room.model.RoomContactModel; import java.util.List; +import butterknife.BindView; +import butterknife.ButterKnife; + public class RosterRecyclerViewAdapter - extends RecyclerView.Adapter { + extends RecyclerView.Adapter { private List entryModelList; @@ -23,17 +26,28 @@ public class RosterRecyclerViewAdapter @NonNull @Override - public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new RecyclerViewHolder(LayoutInflater.from(parent.getContext()) - .inflate(R.layout.recycler_view_item_roster_entry, parent, false)); + public AbstractRosterItem onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { +// switch (viewType) { +// case RosterItemViewHolder.TYPE: + return new RosterItemViewHolder(LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_view_item_roster_entry, parent, false)); +// default: +// return new RosterItemViewHolder(LayoutInflater.from(parent.getContext()) +// .inflate(R.layout.recycler_view_item_roster_entry, parent, false)); +// } } @Override - public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) { + public void onBindViewHolder(@NonNull AbstractRosterItem holder, int position) { RoomContactModel model = entryModelList.get(position); - holder.jidView.setText(model.getJid().toString()); - holder.nicknameView.setText(model.getNickname()); - holder.itemView.setTag(model); +// switch (holder.getItemViewType()) { +// case RosterItemViewHolder.TYPE: + RosterItemViewHolder rosterItem = (RosterItemViewHolder) holder; + rosterItem.jidView.setText(model.getJid().toString()); + rosterItem.nicknameView.setText(model.getNickname()); + rosterItem.itemView.setTag(model); +// break; +// } } @Override @@ -46,15 +60,31 @@ public class RosterRecyclerViewAdapter notifyDataSetChanged(); } - public class RecyclerViewHolder extends RecyclerView.ViewHolder { + public abstract class AbstractRosterItem extends RecyclerView.ViewHolder { - private TextView jidView; - private TextView nicknameView; - - public RecyclerViewHolder(View itemView) { + public AbstractRosterItem(@NonNull View itemView) { super(itemView); - this.jidView = itemView.findViewById(R.id.roster_entry__jid); - this.nicknameView = itemView.findViewById(R.id.roster_entry__nickname); + } + + abstract void bind(RosterViewModel viewModel); + } + + public class RosterItemViewHolder extends AbstractRosterItem { + + @BindView(R.id.roster_entry__jid) + TextView jidView; + + @BindView(R.id.roster_entry__nickname) + TextView nicknameView; + + public RosterItemViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(itemView); + } + + @Override + void bind(RosterViewModel viewModel) { + // viewModel.getRosterEntryList().observe(); } } } diff --git a/app/src/main/res/layout/content_accounts.xml b/app/src/main/res/layout/content_accounts.xml new file mode 100644 index 0000000..c7b5adb --- /dev/null +++ b/app/src/main/res/layout/content_accounts.xml @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_account_details.xml b/app/src/main/res/layout/dialog_account_details.xml new file mode 100644 index 0000000..61f7675 --- /dev/null +++ b/app/src/main/res/layout/dialog_account_details.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_account_list.xml b/app/src/main/res/layout/fragment_account_list.xml new file mode 100644 index 0000000..251633c --- /dev/null +++ b/app/src/main/res/layout/fragment_account_list.xml @@ -0,0 +1,13 @@ + + diff --git a/app/src/main/res/layout/recycler_view_item_account.xml b/app/src/main/res/layout/recycler_view_item_account.xml new file mode 100644 index 0000000..b3c6406 --- /dev/null +++ b/app/src/main/res/layout/recycler_view_item_account.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_view_item_roster_entry.xml b/app/src/main/res/layout/recycler_view_item_roster_entry.xml index 284071f..811be67 100644 --- a/app/src/main/res/layout/recycler_view_item_roster_entry.xml +++ b/app/src/main/res/layout/recycler_view_item_roster_entry.xml @@ -1,56 +1,63 @@ - + + + + + - + - + - + - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 0c00173..5033235 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -19,4 +19,10 @@ android:orderInCategory="120" android:title="Chat" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 812cb7b..3206c09 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,4 +3,5 @@ 16dp 16dp 16dp + 16dp diff --git a/persistence-room/build.gradle b/persistence-room/build.gradle index a1fb13b..95ea247 100644 --- a/persistence-room/build.gradle +++ b/persistence-room/build.gradle @@ -42,8 +42,8 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' - androidTestImplementation "androidx.test:core:1.2.0-beta01" - androidTestImplementation 'androidx.test.ext:junit:1.1.1-beta01' + androidTestImplementation "androidx.test:core:1.2.0" + androidTestImplementation 'androidx.test.ext:junit:1.1.1' // Room api "androidx.room:room-runtime:$roomVersion" 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 42f97cf..a9307af 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,11 +2,11 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "378204e8bb2f9f4c8bf432291835718c", + "identityHash": "8cbb04481870b8e1320677566696f9ad", "entities": [ { "tableName": "RoomContactModel", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `jid` TEXT NOT NULL, `rosterName` TEXT, `nickname` TEXT, PRIMARY KEY(`accountId`, `jid`), FOREIGN KEY(`accountId`) REFERENCES `accounts`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `jid` TEXT NOT NULL, `rosterName` TEXT, `nickname` TEXT, `avatarFile` TEXT, PRIMARY KEY(`accountId`, `jid`), FOREIGN KEY(`accountId`) REFERENCES `accounts`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`accountId`, `jid`) REFERENCES `entities`(`accountId`, `jid`) ON UPDATE NO ACTION ON DELETE RESTRICT )", "fields": [ { "fieldPath": "accountId", @@ -31,6 +31,12 @@ "columnName": "nickname", "affinity": "TEXT", "notNull": false + }, + { + "fieldPath": "avatarFile", + "columnName": "avatarFile", + "affinity": "TEXT", + "notNull": false } ], "primaryKey": { @@ -62,6 +68,19 @@ "referencedColumns": [ "id" ] + }, + { + "table": "entities", + "onDelete": "RESTRICT", + "onUpdate": "NO ACTION", + "columns": [ + "accountId", + "jid" + ], + "referencedColumns": [ + "accountId", + "jid" + ] } ] }, @@ -100,7 +119,16 @@ ], "autoGenerate": true }, - "indices": [], + "indices": [ + { + "name": "index_accounts_id", + "unique": false, + "columnNames": [ + "id" + ], + "createSql": "CREATE INDEX `index_accounts_id` ON `${TABLE_NAME}` (`id`)" + } + ], "foreignKeys": [] }, { @@ -150,7 +178,71 @@ ], "autoGenerate": true }, - "indices": [], + "indices": [ + { + "name": "index_messages_id", + "unique": false, + "columnNames": [ + "id" + ], + "createSql": "CREATE INDEX `index_messages_id` ON `${TABLE_NAME}` (`id`)" + } + ], + "foreignKeys": [ + { + "table": "accounts", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "accountId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "entities", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `jid` TEXT NOT NULL, `avatarFile` TEXT, PRIMARY KEY(`accountId`, `jid`), FOREIGN KEY(`accountId`) REFERENCES `accounts`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "accountId", + "columnName": "accountId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "jid", + "columnName": "jid", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "avatarFile", + "columnName": "avatarFile", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "accountId", + "jid" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_entities_accountId_jid", + "unique": true, + "columnNames": [ + "accountId", + "jid" + ], + "createSql": "CREATE UNIQUE INDEX `index_entities_accountId_jid` ON `${TABLE_NAME}` (`accountId`, `jid`)" + } + ], "foreignKeys": [ { "table": "accounts", @@ -169,7 +261,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, \"378204e8bb2f9f4c8bf432291835718c\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"8cbb04481870b8e1320677566696f9ad\")" ] } } \ No newline at end of file diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java index 0cc08e3..e3d3c00 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/AppDatabase.java @@ -12,8 +12,14 @@ import org.mercury_im.messenger.persistence.room.dao.ContactDao; import org.mercury_im.messenger.persistence.room.model.RoomAccountModel; import org.mercury_im.messenger.persistence.room.model.RoomContactModel; import org.mercury_im.messenger.persistence.room.model.RoomMessageModel; +import org.mercury_im.messenger.persistence.room.model.RoomXmppIdentityModel; -@Database(entities = {RoomContactModel.class, RoomAccountModel.class, RoomMessageModel.class}, version = 1) +@Database(entities = { + RoomContactModel.class, + RoomAccountModel.class, + RoomMessageModel.class, + RoomXmppIdentityModel.class}, + version = 1) public abstract class AppDatabase extends RoomDatabase { private static final String DB_NAME = "mercury_db"; 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 33ba034..12a4211 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 @@ -5,20 +5,22 @@ import androidx.room.Dao; import androidx.room.Query; import androidx.room.TypeConverters; +import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.EntityFullJid; import org.mercury_im.messenger.persistence.room.model.RoomMessageModel; +import org.mercury_im.messenger.persistence.room.type_converter.EntityBareJidConverter; import org.mercury_im.messenger.persistence.room.type_converter.EntityFullJidConverter; import java.util.List; @Dao -@TypeConverters(EntityFullJidConverter.class) +@TypeConverters(EntityBareJidConverter.class) public interface MessageDao extends BaseDao { @Query("SELECT * FROM messages WHERE accountId=:accountId ORDER BY sendDate DESC") LiveData> getAllMessagesOf(long accountId); @Query("SELECT * FROM messages WHERE accountId=:accountId AND `from`=:sender ORDER BY sendDate DESC") - LiveData> getAllMessagesFrom(long accountId, EntityFullJid sender); + LiveData> getAllMessagesFrom(long accountId, EntityBareJid sender); } 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 15ccf04..b04554f 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 @@ -3,6 +3,7 @@ package org.mercury_im.messenger.persistence.room.model; import androidx.room.ColumnInfo; import androidx.room.Entity; +import androidx.room.Index; import androidx.room.PrimaryKey; import androidx.room.TypeConverters; @@ -10,7 +11,7 @@ import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.model.AccountModel; import org.mercury_im.messenger.persistence.room.type_converter.EntityBareJidConverter; -@Entity(tableName = "accounts") +@Entity(tableName = "accounts", indices = {@Index("id")}) public class RoomAccountModel implements AccountModel { @PrimaryKey(autoGenerate = true) 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 e0a0d24..e4172d1 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 @@ -1,23 +1,30 @@ package org.mercury_im.messenger.persistence.room.model; -import androidx.lifecycle.LiveData; -import androidx.paging.PagedList; import androidx.room.Entity; +import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.model.ChatModel; -import org.mercury_im.messenger.persistence.model.ContactModel; -import org.mercury_im.messenger.persistence.model.MessageModel; @Entity public class RoomChatModel implements ChatModel { @Override - public LiveData getContact() { + public EntityBareJid getJid() { return null; } @Override - public LiveData> getMessages() { - return null; + public void setJid(EntityBareJid jid) { + + } + + @Override + public long getAccountId() { + return 0; + } + + @Override + public void setAccountId() { + } } 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 5011f7f..b82813d 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 @@ -10,6 +10,7 @@ import androidx.room.TypeConverters; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.model.ContactModel; import org.mercury_im.messenger.persistence.room.type_converter.EntityBareJidConverter; +import org.mercury_im.messenger.persistence.room.type_converter.FileConverter; import java.io.File; @@ -39,6 +40,7 @@ public class RoomContactModel implements ContactModel { private String nickname; + @TypeConverters(FileConverter.class) private File avatarFile; public RoomContactModel(@NonNull EntityBareJid jid, @@ -90,7 +92,6 @@ public class RoomContactModel implements ContactModel { this.accountId = accountId; } - @Override public File getAvatarFile() { return avatarFile; } 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 2c73d15..5e5a1a2 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 @@ -2,21 +2,22 @@ package org.mercury_im.messenger.persistence.room.model; import androidx.room.Entity; import androidx.room.ForeignKey; +import androidx.room.Index; import androidx.room.PrimaryKey; -import androidx.room.TypeConverter; import androidx.room.TypeConverters; -import org.jxmpp.jid.EntityFullJid; +import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.model.MessageModel; import org.mercury_im.messenger.persistence.room.type_converter.DateConverter; -import org.mercury_im.messenger.persistence.room.type_converter.EntityFullJidConverter; +import org.mercury_im.messenger.persistence.room.type_converter.EntityBareJidConverter; import java.util.Date; import static androidx.room.ForeignKey.CASCADE; @Entity(tableName = "messages", foreignKeys = @ForeignKey(entity = RoomAccountModel.class, - parentColumns = "id", childColumns = "accountId", onDelete = CASCADE)) + parentColumns = "id", childColumns = "accountId", onDelete = CASCADE), + indices = {@Index("id")}) public class RoomMessageModel implements MessageModel { @PrimaryKey(autoGenerate = true) @@ -29,11 +30,11 @@ public class RoomMessageModel implements MessageModel { @TypeConverters(DateConverter.class) private Date sendDate; - @TypeConverters(EntityFullJidConverter.class) - private EntityFullJid from; + @TypeConverters(EntityBareJidConverter.class) + private EntityBareJid from; - @TypeConverters(EntityFullJidConverter.class) - private EntityFullJid to; + @TypeConverters(EntityBareJidConverter.class) + private EntityBareJid to; public RoomMessageModel() { @@ -80,22 +81,22 @@ public class RoomMessageModel implements MessageModel { } @Override - public EntityFullJid getFrom() { + public EntityBareJid getFrom() { return from; } @Override - public void setFrom(EntityFullJid sender) { + public void setFrom(EntityBareJid sender) { this.from = sender; } @Override - public EntityFullJid getTo() { + public EntityBareJid getTo() { return to; } @Override - public void setTo(EntityFullJid recipient) { + public void setTo(EntityBareJid recipient) { this.to = recipient; } } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomXmppIdentityModel.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomXmppIdentityModel.java index c79bc08..3f28185 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomXmppIdentityModel.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/model/RoomXmppIdentityModel.java @@ -6,9 +6,12 @@ import androidx.annotation.NonNull; import androidx.room.Entity; import androidx.room.ForeignKey; import androidx.room.Index; +import androidx.room.TypeConverters; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.persistence.model.XmppIdentityModel; +import org.mercury_im.messenger.persistence.room.type_converter.EntityBareJidConverter; +import org.mercury_im.messenger.persistence.room.type_converter.FileConverter; import java.io.File; @@ -24,8 +27,11 @@ public class RoomXmppIdentityModel implements XmppIdentityModel { protected long accountId; + @NonNull + @TypeConverters(EntityBareJidConverter.class) protected EntityBareJid jid; + @TypeConverters(FileConverter.class) protected File avatarFile; @NonNull 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 49cac45..6454f98 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 @@ -1,7 +1,27 @@ package org.mercury_im.messenger.persistence.room.repository; +import androidx.lifecycle.LiveData; + +import org.mercury_im.messenger.persistence.model.ChatModel; +import org.mercury_im.messenger.persistence.model.XmppIdentityModel; import org.mercury_im.messenger.persistence.repository.ChatRepository; +import java.util.List; + public class IChatRepository implements ChatRepository { + @Override + public LiveData> getAllChats() { + return null; + } + + @Override + public void getChatWith(XmppIdentityModel identity) { + + } + + @Override + public void closeChat(ChatModel chat) { + + } } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IContactRepository.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IContactRepository.java index 3b6cfe0..9436d40 100644 --- a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IContactRepository.java +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/repository/IContactRepository.java @@ -26,5 +26,10 @@ public class IContactRepository implements ContactRepository { contactDao.insert(rosterEntryModel); } + @Override + public LiveData getRosterEntry(long id) { + return null; + } + } 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 d2edf64..30e63e0 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 @@ -29,7 +29,12 @@ public class IMessageRepository implements MessageRepository { } @Override - public LiveData> getAllMessagesFrom(long accountId, EntityFullJid contact) { + public LiveData> getAllMessagesFrom(long accountId, EntityBareJid contact) { return messageDao.getAllMessagesFrom(accountId, contact); } + + @Override + public LiveData> findMessageByQuery(String query) { + return null; + } } diff --git a/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/type_converter/FileConverter.java b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/type_converter/FileConverter.java new file mode 100644 index 0000000..6d01351 --- /dev/null +++ b/persistence-room/src/main/java/org/mercury_im/messenger/persistence/room/type_converter/FileConverter.java @@ -0,0 +1,18 @@ +package org.mercury_im.messenger.persistence.room.type_converter; + +import androidx.room.TypeConverter; + +import java.io.File; + +public class FileConverter { + + @TypeConverter + public static String toString(File file) { + return file.getAbsolutePath(); + } + + @TypeConverter + public static File toFile(String string) { + return new File(string); + } +} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ContactModel.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ContactModel.java index 1d8382d..813c227 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ContactModel.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/model/ContactModel.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.persistence.model; import org.jxmpp.jid.EntityBareJid; +import java.io.File; + public interface ContactModel { long getAccountId(); @@ -19,4 +21,8 @@ public interface ContactModel { String getNickname(); void setNickname(String nickname); + + File getAvatarFile(); + + void setAvatarFile(File file); } diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ContactRepository.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ContactRepository.java index dff6450..a5c44eb 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ContactRepository.java +++ b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ContactRepository.java @@ -11,4 +11,6 @@ public interface ContactRepository { LiveData> getAllRosterEntries(); void updateOrInsertRosterEntry(E rosterEntryModel); + + LiveData getRosterEntry(long id); } diff --git a/version.gradle b/version.gradle index cbf10cf..c9e34b9 100644 --- a/version.gradle +++ b/version.gradle @@ -37,7 +37,7 @@ ext { // Architecture Components lifecycleVersion = "2.0.0" - roomVersion = "2.1.0-beta01" + roomVersion = "2.1.0-rc01" pagingVersion = "2.1.0" // Dagger 2 @@ -45,4 +45,7 @@ ext { // Android Support Library supportLibVersion = "28.0.0" + + // Butter Knife + butterKnifeVersion = "10.1.0" } \ No newline at end of file