Refactoring
This commit is contained in:
parent
aebbe29836
commit
dc5df7117f
|
@ -3,12 +3,13 @@ package org.mercury_im.messenger.android.di.component;
|
|||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.android.di.module.AndroidDatabaseModule;
|
||||
import org.mercury_im.messenger.android.di.module.AndroidSchedulersModule;
|
||||
import org.mercury_im.messenger.android.ui.account.AndroidAccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.android.ui.account.detail.AndroidAccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.android.ui.roster.contacts.AndroidContactListViewModel;
|
||||
import org.mercury_im.messenger.core.di.module.RxMercuryMessageStoreFactoryModule;
|
||||
import org.mercury_im.messenger.core.di.module.RxMercuryRosterStoreFactoryModule;
|
||||
import org.mercury_im.messenger.core.di.module.XmppTcpConnectionFactoryModule;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.detail.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.list.AccountListViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.chat.ChatViewModel;
|
||||
import org.mercury_im.messenger.data.di.RepositoryModule;
|
||||
import org.mercury_im.messenger.android.di.module.AppModule;
|
||||
|
@ -16,17 +17,16 @@ import org.mercury_im.messenger.core.di.module.ViewModelModule;
|
|||
import org.mercury_im.messenger.android.service.MercuryForegroundService;
|
||||
import org.mercury_im.messenger.core.store.caps.MercuryEntityCapsStore;
|
||||
import org.mercury_im.messenger.android.ui.MainActivity;
|
||||
import org.mercury_im.messenger.android.ui.account.AndroidAccountsViewModel;
|
||||
import org.mercury_im.messenger.android.ui.account.AndroidLoginViewModel;
|
||||
import org.mercury_im.messenger.android.ui.account.list.AndroidAccountListViewModel;
|
||||
import org.mercury_im.messenger.android.ui.account.login.AndroidLoginViewModel;
|
||||
import org.mercury_im.messenger.android.ui.chat.ChatActivity;
|
||||
import org.mercury_im.messenger.android.ui.chat.ChatInputFragment;
|
||||
import org.mercury_im.messenger.android.ui.chat.ChatInputViewModel;
|
||||
import org.mercury_im.messenger.android.ui.chat.AndroidChatViewModel;
|
||||
import org.mercury_im.messenger.android.ui.chatlist.ChatListViewModel;
|
||||
import org.mercury_im.messenger.android.ui.chatlist.AndroidChatListViewModel;
|
||||
import org.mercury_im.messenger.android.ui.roster.contacts.detail.ContactDetailActivity;
|
||||
import org.mercury_im.messenger.android.ui.roster.contacts.detail.ContactDetailViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.LoginViewModel;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
|
@ -79,9 +79,9 @@ public interface AppComponent {
|
|||
|
||||
void inject(AndroidLoginViewModel androidLoginViewModel);
|
||||
|
||||
void inject(AndroidAccountsViewModel androidAccountsViewModel);
|
||||
void inject(AndroidAccountListViewModel androidAccountsViewModel);
|
||||
|
||||
void inject(ChatListViewModel chatListViewModel);
|
||||
void inject(AndroidChatListViewModel chatListViewModel);
|
||||
|
||||
void inject(ContactDetailViewModel contactDetailViewModel);
|
||||
|
||||
|
@ -95,7 +95,7 @@ public interface AppComponent {
|
|||
// Common VMs
|
||||
void inject(LoginViewModel loginViewModel);
|
||||
|
||||
void inject(AccountsViewModel accountsViewModel);
|
||||
void inject(AccountListViewModel accountsViewModel);
|
||||
|
||||
|
||||
// Services
|
||||
|
|
|
@ -16,13 +16,13 @@ import com.google.android.material.navigation.NavigationView;
|
|||
|
||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.android.ui.account.AccountDetailsFragment;
|
||||
import org.mercury_im.messenger.android.ui.account.detail.AccountDetailsFragment;
|
||||
import org.mercury_im.messenger.android.ui.account.DeleteAccountDialogFragment;
|
||||
import org.mercury_im.messenger.android.ui.account.OnAccountListItemClickListener;
|
||||
import org.mercury_im.messenger.android.ui.account.list.AccountListFragment;
|
||||
import org.mercury_im.messenger.core.data.repository.AccountRepository;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.mercury_im.messenger.android.ui.chatlist.ChatListFragment;
|
||||
import org.mercury_im.messenger.android.ui.account.AccountsFragment;
|
||||
import org.mercury_im.messenger.android.ui.roster.RosterFragment;
|
||||
import org.mercury_im.messenger.android.ui.settings.SettingsActivity;
|
||||
|
||||
|
@ -43,7 +43,7 @@ public class MainActivity extends AppCompatActivity
|
|||
|
||||
private ChatListFragment chatListFragment = new ChatListFragment();
|
||||
private RosterFragment rosterFragment = new RosterFragment();
|
||||
private AccountsFragment accountsFragment = new AccountsFragment();
|
||||
private AccountListFragment accountListFragment = new AccountListFragment();
|
||||
private SearchView.OnQueryTextListener searchViewListeningFragment;
|
||||
|
||||
@Inject
|
||||
|
@ -103,8 +103,8 @@ public class MainActivity extends AppCompatActivity
|
|||
return true;
|
||||
|
||||
case R.id.entry_accounts:
|
||||
transaction.replace(R.id.fragment, accountsFragment).commit();
|
||||
searchViewListeningFragment = accountsFragment;
|
||||
transaction.replace(R.id.fragment, accountListFragment).commit();
|
||||
searchViewListeningFragment = accountListFragment;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -112,7 +112,7 @@ public class MainActivity extends AppCompatActivity
|
|||
|
||||
@Override
|
||||
public void onAccountListItemClick(Account item) {
|
||||
getSupportFragmentManager().beginTransaction().addToBackStack("ACCOUNT")
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.replace(R.id.fragment, new AccountDetailsFragment(item.getId())).commit();
|
||||
}
|
||||
|
||||
|
|
|
@ -9,12 +9,13 @@ import androidx.appcompat.app.AppCompatDialogFragment;
|
|||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.android.ui.account.list.AndroidAccountListViewModel;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class DeleteAccountDialogFragment extends AppCompatDialogFragment {
|
||||
|
||||
private AndroidAccountsViewModel viewModel;
|
||||
private AndroidAccountListViewModel viewModel;
|
||||
private final UUID accountId;
|
||||
|
||||
public DeleteAccountDialogFragment(UUID accountId) {
|
||||
|
@ -24,7 +25,7 @@ public class DeleteAccountDialogFragment extends AppCompatDialogFragment {
|
|||
@Override
|
||||
@NonNull
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
viewModel = new ViewModelProvider(requireActivity()).get(AndroidAccountsViewModel.class);
|
||||
viewModel = new ViewModelProvider(requireActivity()).get(AndroidAccountListViewModel.class);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setMessage("Do you really want to delete this account?")
|
||||
.setPositiveButton(R.string.button_delete, (dialog, id) -> viewModel.onDeleteAccount(accountId))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.detail;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
@ -19,8 +19,8 @@ import com.google.android.material.card.MaterialCardView;
|
|||
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.android.ui.ToggleableFingerprintsAdapter;
|
||||
import org.mercury_im.messenger.android.util.OpenPgpV4FingerprintFormatter;
|
||||
import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter;
|
||||
import org.mercury_im.messenger.android.ui.openpgp.OpenPgpV4FingerprintFormatter;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
|
||||
import java.util.UUID;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.detail;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
|
@ -15,8 +15,8 @@ import org.mercury_im.messenger.android.MercuryImApplication;
|
|||
import org.mercury_im.messenger.android.ui.MercuryAndroidViewModel;
|
||||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.detail.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
|
||||
import java.util.ArrayList;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.list;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
|
@ -15,11 +15,10 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.mercury_im.messenger.android.ui.account.OnAccountListItemClickListener;
|
||||
import org.mercury_im.messenger.android.ui.account.login.AddAccountDialogFragment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
@ -30,13 +29,13 @@ import butterknife.ButterKnife;
|
|||
* Activities containing this fragment MUST implement the {@link OnAccountListItemClickListener}
|
||||
* interface.
|
||||
*/
|
||||
public class AccountsFragment extends Fragment implements SearchView.OnQueryTextListener {
|
||||
public class AccountListFragment extends Fragment implements SearchView.OnQueryTextListener {
|
||||
|
||||
private OnAccountListItemClickListener accountClickListener;
|
||||
|
||||
AndroidAccountsViewModel viewModel;
|
||||
AndroidAccountListViewModel viewModel;
|
||||
|
||||
private AccountsRecyclerViewAdapter adapter;
|
||||
private AccountListRecyclerViewAdapter adapter;
|
||||
|
||||
@BindView(R.id.list)
|
||||
RecyclerView recyclerView;
|
||||
|
@ -44,15 +43,15 @@ public class AccountsFragment extends Fragment implements SearchView.OnQueryText
|
|||
@BindView(R.id.fab)
|
||||
ExtendedFloatingActionButton fab;
|
||||
|
||||
public AccountsFragment() {
|
||||
public AccountListFragment() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
viewModel = new ViewModelProvider(this).get(AndroidAccountsViewModel.class);
|
||||
this.adapter = new AccountsRecyclerViewAdapter(viewModel, accountClickListener);
|
||||
viewModel = new ViewModelProvider(this).get(AndroidAccountListViewModel.class);
|
||||
this.adapter = new AccountListRecyclerViewAdapter(viewModel, accountClickListener);
|
||||
}
|
||||
|
||||
@Override
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.list;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -12,7 +12,8 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountViewItem;
|
||||
import org.mercury_im.messenger.android.ui.account.OnAccountListItemClickListener;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.list.AccountViewItem;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
|
||||
import org.mercury_im.messenger.android.util.AbstractDiffCallback;
|
||||
|
@ -20,13 +21,13 @@ import org.mercury_im.messenger.android.util.AbstractDiffCallback;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRecyclerViewAdapter.ViewHolder> {
|
||||
public class AccountListRecyclerViewAdapter extends RecyclerView.Adapter<AccountListRecyclerViewAdapter.ViewHolder> {
|
||||
|
||||
private final List<AccountViewItem> connectionStates = new ArrayList<>();
|
||||
private final OnAccountListItemClickListener onAccountClickListener;
|
||||
private final AndroidAccountsViewModel viewModel;
|
||||
private final AndroidAccountListViewModel viewModel;
|
||||
|
||||
public AccountsRecyclerViewAdapter(AndroidAccountsViewModel viewModel, OnAccountListItemClickListener listener) {
|
||||
public AccountListRecyclerViewAdapter(AndroidAccountListViewModel viewModel, OnAccountListItemClickListener listener) {
|
||||
onAccountClickListener = listener;
|
||||
this.viewModel = viewModel;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.list;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
|
@ -8,10 +8,10 @@ import androidx.lifecycle.LiveData;
|
|||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountViewItem;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.list.AccountViewItem;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.mercury_im.messenger.android.ui.MercuryAndroidViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.list.AccountListViewModel;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -21,16 +21,16 @@ import java.util.logging.Logger;
|
|||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class AndroidAccountsViewModel extends AndroidViewModel implements MercuryAndroidViewModel<AccountsViewModel> {
|
||||
public class AndroidAccountListViewModel extends AndroidViewModel implements MercuryAndroidViewModel<AccountListViewModel> {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(AndroidAccountsViewModel.class.getName());
|
||||
private static final Logger LOGGER = Logger.getLogger(AndroidAccountListViewModel.class.getName());
|
||||
|
||||
private final MutableLiveData<List<AccountViewItem>> accounts = new MutableLiveData<>(Collections.emptyList());
|
||||
|
||||
@Inject
|
||||
AccountsViewModel viewModel;
|
||||
AccountListViewModel viewModel;
|
||||
|
||||
public AndroidAccountsViewModel(@NonNull Application application) {
|
||||
public AndroidAccountListViewModel(@NonNull Application application) {
|
||||
super(application);
|
||||
|
||||
MercuryImApplication.getApplication().getAppComponent().inject(this);
|
||||
|
@ -48,7 +48,7 @@ public class AndroidAccountsViewModel extends AndroidViewModel implements Mercur
|
|||
}
|
||||
|
||||
@Override
|
||||
public AccountsViewModel getCommonViewModel() {
|
||||
public AccountListViewModel getCommonViewModel() {
|
||||
return viewModel;
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.login;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.account;
|
||||
package org.mercury_im.messenger.android.ui.account.login;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
|
@ -13,7 +13,7 @@ import org.mercury_im.messenger.android.util.TextChangedListener;
|
|||
import org.mercury_im.messenger.core.account.error.PasswordError;
|
||||
import org.mercury_im.messenger.core.account.error.UsernameError;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.LoginViewModel;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
|
@ -41,21 +41,9 @@ public class AndroidChatViewModel extends ViewModel implements MercuryAndroidVie
|
|||
@Inject
|
||||
ChatViewModel commonViewModel;
|
||||
|
||||
@Inject
|
||||
PeerRepository contactRepository;
|
||||
|
||||
@Inject
|
||||
DirectChatRepository chatRepository;
|
||||
|
||||
@Inject
|
||||
MessageRepository messageRepository;
|
||||
|
||||
@Inject
|
||||
SchedulersFacade schedulers;
|
||||
|
||||
@Inject
|
||||
Messenger messenger;
|
||||
|
||||
private MutableLiveData<Peer> contact = new MutableLiveData<>();
|
||||
private MutableLiveData<List<Message>> messages = new MutableLiveData<>();
|
||||
private MutableLiveData<String> contactDisplayName = new MutableLiveData<>();
|
||||
|
@ -67,10 +55,8 @@ public class AndroidChatViewModel extends ViewModel implements MercuryAndroidVie
|
|||
}
|
||||
|
||||
public void init(UUID accountId, EntityBareJid jid) {
|
||||
disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString())
|
||||
.flatMap(peer -> chatRepository.getOrCreateChatWithPeer(peer))
|
||||
.subscribe(this::init,
|
||||
error -> LOGGER.log(Level.SEVERE, "Error subscribing to peer data", error)));
|
||||
commonViewModel.init(accountId, jid);
|
||||
|
||||
}
|
||||
|
||||
public void init(DirectChat chat) {
|
||||
|
@ -79,8 +65,8 @@ public class AndroidChatViewModel extends ViewModel implements MercuryAndroidVie
|
|||
this.commonViewModel.init(chat);
|
||||
|
||||
// Subscribe peer
|
||||
disposable.add(commonViewModel.getPeer()
|
||||
.subscribe(peer -> contactDisplayName.setValue(peer.getName()),
|
||||
disposable.add(commonViewModel.getContactDisplayName()
|
||||
.subscribe(name -> contactDisplayName.setValue(name),
|
||||
error -> LOGGER.log(Level.SEVERE, "Error subscribing display name to peer", error)));
|
||||
|
||||
// Subscribe messages
|
||||
|
@ -112,20 +98,11 @@ public class AndroidChatViewModel extends ViewModel implements MercuryAndroidVie
|
|||
}
|
||||
|
||||
public void deleteContact() {
|
||||
Peer contact = getContact().getValue();
|
||||
disposable.add(messenger.deleteContact(contact)
|
||||
.subscribeOn(schedulers.getIoScheduler())
|
||||
.observeOn(schedulers.getUiScheduler())
|
||||
.subscribe(
|
||||
() -> LOGGER.log(Level.INFO, "Contact deleted."),
|
||||
e -> LOGGER.log(Level.SEVERE, e.getMessage(), e)));
|
||||
getCommonViewModel().deleteContact();
|
||||
}
|
||||
|
||||
public void sendMessage(String body) {
|
||||
disposable.add(messenger.sendEncryptedMessage(getContact().getValue(), body)
|
||||
.subscribeOn(schedulers.getIoScheduler())
|
||||
.observeOn(schedulers.getUiScheduler())
|
||||
.subscribe());
|
||||
getCommonViewModel().sendMessage(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.entity.message.Message;
|
||||
import org.mercury_im.messenger.android.ui.util.MessageBackgroundDrawable;
|
||||
import org.mercury_im.messenger.android.ui.chat.util.MessageBackgroundDrawable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.util;
|
||||
package org.mercury_im.messenger.android.ui.chat.util;
|
||||
|
||||
import org.mercury_im.messenger.R;
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package org.mercury_im.messenger.android.ui.chatlist;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
|
||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.android.ui.MercuryAndroidViewModel;
|
||||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
|
||||
import org.mercury_im.messenger.core.viewmodel.chat.ChatListViewModel;
|
||||
import org.mercury_im.messenger.entity.chat.DirectChat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
|
||||
public class AndroidChatListViewModel extends AndroidViewModel implements MercuryAndroidViewModel<ChatListViewModel> {
|
||||
|
||||
@Inject
|
||||
DirectChatRepository chatRepository;
|
||||
|
||||
@Inject
|
||||
ChatListViewModel commonViewModel;
|
||||
|
||||
@Inject
|
||||
SchedulersFacade schedulers;
|
||||
|
||||
private final MutableLiveData<List<DirectChat>> chats = new MutableLiveData<>(new ArrayList<>());
|
||||
|
||||
public AndroidChatListViewModel(@NonNull Application application) {
|
||||
super(application);
|
||||
((MercuryImApplication) application).getAppComponent().inject(this);
|
||||
|
||||
addDisposable(commonViewModel.observeAllDirectChats()
|
||||
.compose(schedulers.executeUiSafeObservable())
|
||||
.subscribe(chats::setValue));
|
||||
}
|
||||
|
||||
public LiveData<List<DirectChat>> getChats() {
|
||||
return chats;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatListViewModel getCommonViewModel() {
|
||||
return commonViewModel;
|
||||
}
|
||||
}
|
|
@ -25,7 +25,7 @@ import butterknife.ButterKnife;
|
|||
|
||||
public class ChatListFragment extends Fragment implements SearchView.OnQueryTextListener {
|
||||
|
||||
private ChatListViewModel viewModel;
|
||||
private AndroidChatListViewModel viewModel;
|
||||
|
||||
@BindView(R.id.chat_list__recycler_view)
|
||||
RecyclerView recyclerView;
|
||||
|
@ -37,7 +37,7 @@ public class ChatListFragment extends Fragment implements SearchView.OnQueryText
|
|||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
viewModel = new ViewModelProvider(this).get(ChatListViewModel.class);
|
||||
viewModel = new ViewModelProvider(this).get(AndroidChatListViewModel.class);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
package org.mercury_im.messenger.android.ui.chatlist;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
|
||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
|
||||
import org.mercury_im.messenger.entity.chat.DirectChat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
|
||||
public class ChatListViewModel extends ViewModel {
|
||||
|
||||
@Inject
|
||||
DirectChatRepository chatRepository;
|
||||
|
||||
private CompositeDisposable disposable = new CompositeDisposable();
|
||||
|
||||
private final MutableLiveData<List<DirectChat>> chats = new MutableLiveData<>(new ArrayList<>());
|
||||
|
||||
public ChatListViewModel() {
|
||||
MercuryImApplication.getApplication().getAppComponent().inject(this);
|
||||
|
||||
disposable.add(chatRepository.observeAllDirectChats()
|
||||
.subscribe(chats::setValue));
|
||||
}
|
||||
|
||||
public LiveData<List<DirectChat>> getChats() {
|
||||
return chats;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCleared() {
|
||||
super.onCleared();
|
||||
disposable.dispose();
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.ox;
|
||||
package org.mercury_im.messenger.android.ui.openpgp;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
|
@ -6,17 +6,14 @@ import androidx.annotation.NonNull;
|
|||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||
import org.mercury_im.messenger.android.ui.MercuryAndroidViewModel;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.ox.OxBackupRestoreError;
|
||||
import org.mercury_im.messenger.core.viewmodel.ox.OxSecretKeyBackupRestoreViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.OxBackupRestoreError;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.OxSecretKeyBackupRestoreViewModel;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class AndroidOxSecretKeyBackupRestoreViewModel extends AndroidViewModel
|
||||
implements MercuryAndroidViewModel<OxSecretKeyBackupRestoreViewModel> {
|
||||
|
|
@ -1,10 +1,11 @@
|
|||
package org.mercury_im.messenger.android.util;
|
||||
package org.mercury_im.messenger.android.ui.openpgp;
|
||||
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
|
||||
import org.jivesoftware.smackx.colors.ConsistentColor;
|
||||
import org.mercury_im.messenger.android.util.ColorUtil;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
|
||||
public class OpenPgpV4FingerprintFormatter {
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui.ox;
|
||||
package org.mercury_im.messenger.android.ui.openpgp;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.android.ui;
|
||||
package org.mercury_im.messenger.android.ui.openpgp;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -10,8 +10,7 @@ import androidx.annotation.NonNull;
|
|||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.android.util.OpenPgpV4FingerprintFormatter;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
|
||||
import java.text.DateFormat;
|
|
@ -1,26 +0,0 @@
|
|||
package org.mercury_im.messenger.android.ui.roster.contacts;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import org.mercury_im.messenger.core.data.repository.PeerRepository;
|
||||
import org.mercury_im.messenger.entity.contact.Peer;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class ContactListItemViewModel extends AndroidViewModel {
|
||||
|
||||
@Inject
|
||||
PeerRepository contactRepository;
|
||||
|
||||
private LiveData<Peer> contact;
|
||||
|
||||
@Inject
|
||||
public ContactListItemViewModel(@NonNull Application application) {
|
||||
super(application);
|
||||
}
|
||||
|
||||
}
|
|
@ -18,7 +18,6 @@ import androidx.annotation.Nullable;
|
|||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.lifecycle.ViewModelStoreOwner;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.card.MaterialCardView;
|
||||
|
@ -26,14 +25,12 @@ import com.google.android.material.chip.Chip;
|
|||
import com.google.android.material.chip.ChipGroup;
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||
|
||||
import org.mercury_im.messenger.android.ui.ToggleableFingerprintsAdapter;
|
||||
import org.mercury_im.messenger.android.util.OpenPgpV4FingerprintFormatter;
|
||||
import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter;
|
||||
import org.mercury_im.messenger.core.Messenger;
|
||||
import org.mercury_im.messenger.R;
|
||||
import org.mercury_im.messenger.android.ui.chat.ChatActivity;
|
||||
import org.mercury_im.messenger.android.util.ColorUtil;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.FingerprintViewItem;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.mercury_im.messenger.core.Messenger;
|
|||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
import org.mercury_im.messenger.core.data.repository.OpenPgpRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.PeerRepository;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.entity.contact.Peer;
|
||||
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
|
||||
import org.mercury_im.messenger.core.util.CombinedPresenceListener;
|
||||
|
@ -38,9 +38,7 @@ import java.util.UUID;
|
|||
import javax.inject.Inject;
|
||||
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
public class ContactDetailViewModel extends ViewModel {
|
||||
|
||||
|
@ -77,11 +75,12 @@ public class ContactDetailViewModel extends ViewModel {
|
|||
|
||||
public void bind(UUID accountId, String peerAddress) {
|
||||
Log.d("MMMMMM", "Bind!");
|
||||
EntityBareJid peerJid = JidCreate.entityBareFromOrThrowUnchecked(peerAddress);
|
||||
roster = Roster.getInstanceFor(messenger.getConnectionManager().getConnection(accountId).getConnection());
|
||||
roster.addPresenceEventListener(presenceEventListener);
|
||||
contactAddress.setValue(peerAddress);
|
||||
contactAccountId.setValue(accountId);
|
||||
disposable.add(peerRepository.observePeerByAddress(accountId, peerAddress)
|
||||
disposable.add(peerRepository.observePeerByAddress(accountId, peerJid)
|
||||
.subscribeOn(schedulers.getIoScheduler())
|
||||
.observeOn(schedulers.getUiScheduler())
|
||||
.subscribe(peerOptional -> {
|
||||
|
@ -104,15 +103,13 @@ public class ContactDetailViewModel extends ViewModel {
|
|||
}
|
||||
}));
|
||||
|
||||
EntityBareJid jid = JidCreate.entityBareFromOrThrowUnchecked(peerAddress);
|
||||
|
||||
Presence presence = roster.getPresence(jid);
|
||||
Presence presence = roster.getPresence(peerJid);
|
||||
if (presence != null) {
|
||||
contactPresenceMode.postValue(presence.getMode());
|
||||
contactPresenceStatus.postValue(presence.getStatus());
|
||||
}
|
||||
|
||||
disposable.add(openPgpRepository.observeFingerprints(accountId, jid)
|
||||
disposable.add(openPgpRepository.observeFingerprints(accountId, peerJid)
|
||||
.subscribeOn(schedulers.getIoScheduler())
|
||||
.observeOn(schedulers.getUiScheduler())
|
||||
.subscribe(list -> contactFingerprints.setValue(list)));
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
app:layoutManager="LinearLayoutManager"
|
||||
tools:context=".android.ui.account.AccountsFragment"
|
||||
tools:context=".android.ui.account.list.AccountListFragment"
|
||||
tools:listitem="@layout/list_item_account" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
|
|
|
@ -9,7 +9,7 @@ import org.jxmpp.stringprep.XmppStringprepException;
|
|||
import org.mercury_im.messenger.cli.di.component.CliComponent;
|
||||
import org.mercury_im.messenger.cli.di.component.DaggerCliComponent;
|
||||
import org.mercury_im.messenger.core.Messenger;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.xmpp.MercuryConnection;
|
||||
|
||||
import java.util.List;
|
||||
|
|
|
@ -3,14 +3,13 @@ package org.mercury_im.messenger.data.repository;
|
|||
import org.bouncycastle.openpgp.PGPPublicKeyRing;
|
||||
import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
|
||||
import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
|
||||
import org.jivesoftware.smackx.bytestreams.ibb.packet.Open;
|
||||
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
import org.jxmpp.jid.impl.JidCreate;
|
||||
import org.mercury_im.messenger.core.data.repository.AccountRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.OpenPgpRepository;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.data.model.AnnouncedOpenPgpContactKey;
|
||||
import org.mercury_im.messenger.data.model.OpenPgpKeyFetchDate;
|
||||
import org.mercury_im.messenger.data.model.OpenPgpKeyTrust;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.mercury_im.messenger.data.repository;
|
||||
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
import org.mercury_im.messenger.core.data.repository.AccountRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.PeerRepository;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
|
@ -62,38 +63,38 @@ public class RxPeerRepository
|
|||
}
|
||||
|
||||
@Override
|
||||
public Observable<Optional<Peer>> observePeerByAddress(UUID accountId, String address) {
|
||||
public Observable<Optional<Peer>> observePeerByAddress(UUID accountId, EntityBareJid address) {
|
||||
return data().select(PeerModel.class)
|
||||
.where(PeerModel.ACCOUNT_ID.eq(accountId))
|
||||
.and(PeerModel.ADDRESS.eq(address))
|
||||
.and(PeerModel.ADDRESS.eq(address.asEntityBareJidString()))
|
||||
.get().observableResult()
|
||||
.map(result -> new Optional<>(result.firstOrNull()))
|
||||
.map(peerMapping::toEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Single<Peer> getOrCreatePeer(UUID accountId, String address) {
|
||||
public Single<Peer> getOrCreatePeer(UUID accountId, EntityBareJid address) {
|
||||
return accountRepository.getAccount(accountId).toSingle()
|
||||
.flatMap(account -> getOrCreatePeer(account, address));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Maybe<Peer> getPeerByAddress(UUID accountId, String address) {
|
||||
public Maybe<Peer> getPeerByAddress(UUID accountId, EntityBareJid address) {
|
||||
return data().select(PeerModel.class)
|
||||
.where(PeerModel.ACCOUNT_ID.eq(accountId))
|
||||
.and(PeerModel.ADDRESS.eq(address))
|
||||
.and(PeerModel.ADDRESS.eq(address.asEntityBareJidString()))
|
||||
.get().maybe()
|
||||
.map(peerMapping::toEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Single<Peer> getOrCreatePeer(Account account, String address) {
|
||||
public Single<Peer> getOrCreatePeer(Account account, EntityBareJid address) {
|
||||
return getPeerByAddress(account, address)
|
||||
.switchIfEmpty(
|
||||
Single.just(new Peer())
|
||||
.map(peer -> {
|
||||
peer.setAccount(account);
|
||||
peer.setAddress(address);
|
||||
peer.setAddress(address.asEntityBareJidString());
|
||||
return peer;
|
||||
})
|
||||
.flatMap(this::upsertPeer));
|
||||
|
@ -162,10 +163,10 @@ public class RxPeerRepository
|
|||
}
|
||||
|
||||
@Override
|
||||
public Completable deletePeer(UUID accountId, String address) {
|
||||
public Completable deletePeer(UUID accountId, EntityBareJid address) {
|
||||
return data().delete(PeerModel.class)
|
||||
.where(PeerModel.ACCOUNT_ID.eq(accountId)
|
||||
.and(PeerModel.ADDRESS.eq(address)))
|
||||
.and(PeerModel.ADDRESS.eq(address.asEntityBareJidString())))
|
||||
.get().single().ignoreElement();
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
|
|||
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
|
||||
import java.util.Date;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.mercury_im.messenger.core.data.repository;
|
||||
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.mercury_im.messenger.entity.contact.Peer;
|
||||
|
@ -24,21 +25,21 @@ public interface PeerRepository {
|
|||
|
||||
Maybe<Peer> getPeer(UUID PeerId);
|
||||
|
||||
default Observable<Optional<Peer>> observePeerByAddress(Account account, String address) {
|
||||
default Observable<Optional<Peer>> observePeerByAddress(Account account, EntityBareJid address) {
|
||||
return observePeerByAddress(account.getId(), address);
|
||||
}
|
||||
|
||||
Observable<Optional<Peer>> observePeerByAddress(UUID accountId, String address);
|
||||
Observable<Optional<Peer>> observePeerByAddress(UUID accountId, EntityBareJid address);
|
||||
|
||||
default Maybe<Peer> getPeerByAddress(Account account, String address) {
|
||||
default Maybe<Peer> getPeerByAddress(Account account, EntityBareJid address) {
|
||||
return getPeerByAddress(account.getId(), address);
|
||||
}
|
||||
|
||||
Maybe<Peer> getPeerByAddress(UUID accountId, String address);
|
||||
Maybe<Peer> getPeerByAddress(UUID accountId, EntityBareJid address);
|
||||
|
||||
Single<Peer> getOrCreatePeer(Account account, String address);
|
||||
Single<Peer> getOrCreatePeer(Account account, EntityBareJid address);
|
||||
|
||||
Single<Peer> getOrCreatePeer(UUID accountId, String address);
|
||||
Single<Peer> getOrCreatePeer(UUID accountId, EntityBareJid address);
|
||||
|
||||
Observable<List<Peer>> observeAllPeers();
|
||||
|
||||
|
@ -54,7 +55,7 @@ public interface PeerRepository {
|
|||
|
||||
Completable deletePeer(Peer Peer);
|
||||
|
||||
Completable deletePeer(UUID accountId, String address);
|
||||
Completable deletePeer(UUID accountId, EntityBareJid address);
|
||||
|
||||
default Completable deleteAllPeers(Account account) {
|
||||
return deleteAllPeers(account.getId());
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package org.mercury_im.messenger.core.di.component;
|
||||
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.detail.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.list.AccountListViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.chat.ChatViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.ox.OxSecretKeyBackupRestoreViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.OxSecretKeyBackupRestoreViewModel;
|
||||
|
||||
import dagger.Component;
|
||||
|
||||
|
@ -13,7 +13,7 @@ public interface CoreComponent {
|
|||
|
||||
void inject(LoginViewModel viewModel);
|
||||
|
||||
void inject(AccountsViewModel viewModel);
|
||||
void inject(AccountListViewModel viewModel);
|
||||
|
||||
void inject(AccountDetailsViewModel viewModel);
|
||||
|
||||
|
|
|
@ -3,11 +3,15 @@ package org.mercury_im.messenger.core.di.module;
|
|||
import org.mercury_im.messenger.core.Messenger;
|
||||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
import org.mercury_im.messenger.core.data.repository.AccountRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.MessageRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.OpenPgpRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.PeerRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.Repositories;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.AccountsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.accounts.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.detail.AccountDetailsViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.list.AccountListViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.account.LoginViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.chat.ChatListViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.chat.ChatViewModel;
|
||||
import org.mercury_im.messenger.core.xmpp.MercuryConnectionManager;
|
||||
|
||||
|
@ -29,11 +33,11 @@ public class ViewModelModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
static AccountsViewModel provideAccountsViewModel(MercuryConnectionManager connectionManager,
|
||||
AccountRepository accountRepository,
|
||||
OpenPgpRepository openPgpRepository,
|
||||
SchedulersFacade schedulers) {
|
||||
return new AccountsViewModel(connectionManager, accountRepository, openPgpRepository, schedulers);
|
||||
static AccountListViewModel provideAccountsViewModel(MercuryConnectionManager connectionManager,
|
||||
AccountRepository accountRepository,
|
||||
OpenPgpRepository openPgpRepository,
|
||||
SchedulersFacade schedulers) {
|
||||
return new AccountListViewModel(connectionManager, accountRepository, openPgpRepository, schedulers);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
@ -46,9 +50,20 @@ public class ViewModelModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
static ChatViewModel provideChatViewModel(Messenger messenger, Repositories repositories, SchedulersFacade schedulers) {
|
||||
return new ChatViewModel(messenger, repositories, schedulers);
|
||||
static ChatViewModel provideChatViewModel(Messenger messenger,
|
||||
PeerRepository peerRepository,
|
||||
DirectChatRepository directChatRepository,
|
||||
MessageRepository messageRepository,
|
||||
SchedulersFacade schedulers) {
|
||||
return new ChatViewModel(messenger, peerRepository, directChatRepository, messageRepository, schedulers);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static ChatListViewModel provideChatListViewModel(DirectChatRepository directChatRepository, SchedulersFacade schedulers) {
|
||||
return new ChatListViewModel(directChatRepository, schedulers);
|
||||
}
|
||||
|
||||
/*
|
||||
@Provides
|
||||
@Singleton
|
||||
|
|
|
@ -72,7 +72,7 @@ public class MercuryMessageStore implements IncomingChatMessageListener, Outgoin
|
|||
if (smackMessage.getBody() != null) {
|
||||
message.setBody(smackMessage.getBody());
|
||||
}
|
||||
disposable.add(writeMessageToStore(from.asEntityBareJidString(), message));
|
||||
disposable.add(writeMessageToStore(from, message));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -91,10 +91,10 @@ public class MercuryMessageStore implements IncomingChatMessageListener, Outgoin
|
|||
if (smackMessage.getBody() != null) {
|
||||
message.setBody(smackMessage.getBody());
|
||||
}
|
||||
disposable.add(writeMessageToStore(to.asEntityBareJidString(), message));
|
||||
disposable.add(writeMessageToStore(to, message));
|
||||
}
|
||||
|
||||
private Disposable writeMessageToStore(String peer, Message message) {
|
||||
private Disposable writeMessageToStore(EntityBareJid peer, Message message) {
|
||||
return peerRepository.getOrCreatePeer(account, peer)
|
||||
.flatMap(directChatRepository::getOrCreateChatWithPeer)
|
||||
.flatMap(chat -> messageRepository.insertMessage(chat, message))
|
||||
|
@ -119,6 +119,6 @@ public class MercuryMessageStore implements IncomingChatMessageListener, Outgoin
|
|||
if (body != null) {
|
||||
message.setBody(body.getMessage());
|
||||
}
|
||||
disposable.add(writeMessageToStore(contact.getJid().toString(), message));
|
||||
disposable.add(writeMessageToStore(contact.getJid().asEntityBareJidOrThrow(), message));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -112,7 +112,7 @@ public class MercuryRosterStore implements RosterStore {
|
|||
}
|
||||
|
||||
private void writeEntryToDatabase(RosterPacket.Item item) {
|
||||
disposable.add(peerRepository.getOrCreatePeer(accountId, item.getJid().asUnescapedString())
|
||||
disposable.add(peerRepository.getOrCreatePeer(accountId, item.getJid().asEntityBareJidOrThrow())
|
||||
.map(peer -> toEntity(item, peer))
|
||||
.flatMap(peerRepository::upsertPeer)
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
@ -158,7 +158,7 @@ public class MercuryRosterStore implements RosterStore {
|
|||
public boolean removeEntry(Jid bareJid, String version) {
|
||||
LOGGER.log(Level.INFO, "Remove entry " + bareJid.toString());
|
||||
|
||||
disposable.add(peerRepository.deletePeer(accountId, bareJid.asEntityBareJidOrThrow().asEntityBareJidString())
|
||||
disposable.add(peerRepository.deletePeer(accountId, bareJid.asEntityBareJidOrThrow())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.computation())
|
||||
.subscribe(
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.accounts;
|
||||
package org.mercury_im.messenger.core.viewmodel.account;
|
||||
|
||||
import org.jivesoftware.smack.util.StringUtils;
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
|
@ -16,7 +16,6 @@ import org.mercury_im.messenger.core.xmpp.exception.InvalidCredentialsException;
|
|||
import org.mercury_im.messenger.core.xmpp.exception.ServerUnreachableException;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.accounts;
|
||||
package org.mercury_im.messenger.core.viewmodel.account.detail;
|
||||
|
||||
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
|
@ -7,6 +7,7 @@ import org.mercury_im.messenger.core.data.repository.AccountRepository;
|
|||
import org.mercury_im.messenger.core.data.repository.OpenPgpRepository;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.MercuryViewModel;
|
||||
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
|
||||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.pgpainless.key.OpenPgpV4Fingerprint;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.accounts;
|
||||
package org.mercury_im.messenger.core.viewmodel.account.list;
|
||||
|
||||
import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
|
||||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
|
@ -25,9 +25,9 @@ import io.reactivex.Observable;
|
|||
import io.reactivex.ObservableSource;
|
||||
import io.reactivex.ObservableTransformer;
|
||||
|
||||
public class AccountsViewModel implements MercuryViewModel {
|
||||
public class AccountListViewModel implements MercuryViewModel {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(AccountsViewModel.class.getName());
|
||||
private static final Logger LOGGER = Logger.getLogger(AccountListViewModel.class.getName());
|
||||
|
||||
private final MercuryConnectionManager connectionManager;
|
||||
private final AccountRepository accountRepository;
|
||||
|
@ -35,10 +35,10 @@ public class AccountsViewModel implements MercuryViewModel {
|
|||
private final SchedulersFacade schedulers;
|
||||
|
||||
@Inject
|
||||
public AccountsViewModel(MercuryConnectionManager connectionManager,
|
||||
AccountRepository accountRepository,
|
||||
OpenPgpRepository openPgpRepository,
|
||||
SchedulersFacade schedulers) {
|
||||
public AccountListViewModel(MercuryConnectionManager connectionManager,
|
||||
AccountRepository accountRepository,
|
||||
OpenPgpRepository openPgpRepository,
|
||||
SchedulersFacade schedulers) {
|
||||
|
||||
this.connectionManager = connectionManager;
|
||||
this.accountRepository = accountRepository;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.accounts;
|
||||
package org.mercury_im.messenger.core.viewmodel.account.list;
|
||||
|
||||
import org.mercury_im.messenger.core.xmpp.state.ConnectivityState;
|
||||
import org.mercury_im.messenger.entity.Account;
|
|
@ -0,0 +1,28 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.chat;
|
||||
|
||||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
|
||||
import org.mercury_im.messenger.core.viewmodel.MercuryViewModel;
|
||||
import org.mercury_im.messenger.entity.chat.DirectChat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
|
||||
public class ChatListViewModel implements MercuryViewModel {
|
||||
|
||||
private final SchedulersFacade schedulers;
|
||||
private final DirectChatRepository directChatRepository;
|
||||
|
||||
@Inject
|
||||
public ChatListViewModel(DirectChatRepository directChatRepository, SchedulersFacade schedulers) {
|
||||
this.directChatRepository = directChatRepository;
|
||||
this.schedulers = schedulers;
|
||||
}
|
||||
|
||||
public Observable<List<DirectChat>> observeAllDirectChats() {
|
||||
return directChatRepository.observeAllDirectChats();
|
||||
}
|
||||
}
|
|
@ -1,7 +1,11 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.chat;
|
||||
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
import org.mercury_im.messenger.core.Messenger;
|
||||
import org.mercury_im.messenger.core.SchedulersFacade;
|
||||
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.MessageRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.PeerRepository;
|
||||
import org.mercury_im.messenger.core.data.repository.Repositories;
|
||||
import org.mercury_im.messenger.core.util.Optional;
|
||||
import org.mercury_im.messenger.core.viewmodel.MercuryViewModel;
|
||||
|
@ -10,6 +14,9 @@ import org.mercury_im.messenger.entity.contact.Peer;
|
|||
import org.mercury_im.messenger.entity.message.Message;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.subjects.BehaviorSubject;
|
||||
|
@ -17,13 +24,17 @@ import lombok.Getter;
|
|||
|
||||
public class ChatViewModel implements MercuryViewModel {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(ChatViewModel.class.getName());
|
||||
|
||||
private final Messenger messenger;
|
||||
private final Repositories repositories;
|
||||
private final PeerRepository contactRepository;
|
||||
private final DirectChatRepository directChatRepository;
|
||||
private final MessageRepository messageRepository;
|
||||
private final SchedulersFacade schedulers;
|
||||
private DirectChat chat;
|
||||
|
||||
@Getter
|
||||
private Observable<Peer> peer;
|
||||
private BehaviorSubject<Optional<Peer>> peer = BehaviorSubject.createDefault(new Optional<>());
|
||||
|
||||
@Getter
|
||||
private Observable<List<Message>> messages;
|
||||
|
@ -35,31 +46,58 @@ public class ChatViewModel implements MercuryViewModel {
|
|||
|
||||
|
||||
public ChatViewModel(Messenger messenger,
|
||||
Repositories repositories,
|
||||
PeerRepository peerRepository,
|
||||
DirectChatRepository directChatRepository,
|
||||
MessageRepository messageRepository,
|
||||
SchedulersFacade schedulers) {
|
||||
this.messenger = messenger;
|
||||
this.repositories = repositories;
|
||||
this.contactRepository = peerRepository;
|
||||
this.directChatRepository = directChatRepository;
|
||||
this.messageRepository = messageRepository;
|
||||
this.schedulers = schedulers;
|
||||
}
|
||||
|
||||
public void init(UUID accountId, EntityBareJid contactJid) {
|
||||
addDisposable(contactRepository.getOrCreatePeer(accountId, contactJid)
|
||||
.flatMap(directChatRepository::getOrCreateChatWithPeer)
|
||||
.subscribe(this::init,
|
||||
e -> LOGGER.log(Level.SEVERE, "Error subscribing to peer data", e)));
|
||||
}
|
||||
|
||||
public void init(DirectChat directChat) {
|
||||
this.chat = directChat;
|
||||
//peer = repositories.getPeerRepository().observePeer(chat.getPeer());
|
||||
messageQueryObservable.onNext(repositories.getMessageRepository().observeMessages(chat));
|
||||
|
||||
messageQueryObservable.onNext(messageRepository.observeMessages(chat));
|
||||
messages = Observable.switchOnNext(messageQueryObservable);
|
||||
|
||||
peer = repositories.getPeerRepository().observePeer(chat.getPeer().getId())
|
||||
.filter(Optional::isPresent).map(Optional::getItem);
|
||||
contactRepository.observePeer(chat.getPeer().getId()).subscribe(peer);
|
||||
|
||||
contactDisplayName = repositories.getPeerRepository().observePeer(chat.getPeer())
|
||||
.map(optional -> optional.isPresent() ? optional.getItem().getDisplayName() : "DELETED");
|
||||
contactDisplayName = peer.map(optional -> optional.isPresent() ? optional.getItem().getDisplayName() : "DELETED");
|
||||
}
|
||||
|
||||
public void onQueryTextChanged(String query) {
|
||||
if (query.trim().isEmpty()) {
|
||||
messageQueryObservable.onNext(repositories.getMessageRepository().observeMessages(chat));
|
||||
messageQueryObservable.onNext(messageRepository.observeMessages(chat));
|
||||
} else {
|
||||
messageQueryObservable.onNext(repositories.getMessageRepository().findMessagesWithBody(chat, query));
|
||||
messageQueryObservable.onNext(messageRepository.findMessagesWithBody(chat, query));
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteContact() {
|
||||
addDisposable(peer.single(new Optional<>())
|
||||
.filter(Optional::isPresent)
|
||||
.map(Optional::getItem)
|
||||
.flatMapCompletable(messenger::deleteContact)
|
||||
.compose(schedulers.executeUiSafeCompletable())
|
||||
.subscribe(
|
||||
() -> LOGGER.log(Level.INFO, "Contact deleted."),
|
||||
e -> LOGGER.log(Level.SEVERE, "Error deleting contact.", e)));
|
||||
}
|
||||
|
||||
public void sendMessage(String body) {
|
||||
addDisposable(messenger.sendEncryptedMessage(getPeer().getValue().getItem(), body)
|
||||
.compose(schedulers.executeUiSafeCompletable())
|
||||
.subscribe(() -> LOGGER.log(Level.INFO, "Successfully sent encrypted message."),
|
||||
e -> LOGGER.log(Level.SEVERE, "Error sending encrypted message.", e)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.accounts;
|
||||
package org.mercury_im.messenger.core.viewmodel.openpgp;
|
||||
|
||||
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
|
||||
import org.jxmpp.jid.EntityBareJid;
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.ox;
|
||||
package org.mercury_im.messenger.core.viewmodel.openpgp;
|
||||
|
||||
public enum OxBackupRestoreError {
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.mercury_im.messenger.core.viewmodel.ox;
|
||||
package org.mercury_im.messenger.core.viewmodel.openpgp;
|
||||
|
||||
import org.bouncycastle.openpgp.PGPException;
|
||||
import org.jivesoftware.smack.SmackException;
|
|
@ -101,9 +101,9 @@ public class XmppDirectMessageCenter
|
|||
public void newIncomingMessage(EntityBareJid from, org.jivesoftware.smack.packet.Message message, Chat chat) {
|
||||
disposable.add(peerRepository
|
||||
// get peer
|
||||
.getOrCreatePeer(account, from.asEntityBareJidString())
|
||||
.getOrCreatePeer(account, from)
|
||||
// get chat
|
||||
.flatMap(peer -> directChatRepository.getOrCreateChatWithPeer(peer))
|
||||
.flatMap(directChatRepository::getOrCreateChatWithPeer)
|
||||
// notify listeners
|
||||
.subscribe(chatEntity -> {
|
||||
for (IncomingDirectMessageListener listener : messageListeners) {
|
||||
|
|
Loading…
Reference in New Issue