Use connection instead of account in account fragment

This commit is contained in:
Paul Schaub 2020-01-05 23:13:58 +01:00
parent bc85fe432d
commit ae6d3ef9d4
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
5 changed files with 55 additions and 24 deletions

View file

@ -58,7 +58,7 @@ public class AccountsFragment extends Fragment {
} }
private void observeViewModel() { private void observeViewModel() {
viewModel.getAccounts().observe(this, adapter::setValues); viewModel.getConnections().observe(this, adapter::setValues);
} }
@Override @Override

View file

@ -17,13 +17,14 @@ import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.ui.avatar.AvatarDrawable; import org.mercury_im.messenger.ui.avatar.AvatarDrawable;
import org.mercury_im.messenger.ui.account.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.ui.account.AccountsFragment.OnAccountListItemClickListener;
import org.mercury_im.messenger.util.AbstractDiffCallback; import org.mercury_im.messenger.util.AbstractDiffCallback;
import org.mercury_im.messenger.xmpp.MercuryConnection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRecyclerViewAdapter.ViewHolder> { public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRecyclerViewAdapter.ViewHolder> {
private final List<Account> accounts = new ArrayList<>(); private final List<MercuryConnection> connections = new ArrayList<>();
private final OnAccountListItemClickListener onAccountClickListener; private final OnAccountListItemClickListener onAccountClickListener;
private final AccountsViewModel viewModel; private final AccountsViewModel viewModel;
@ -40,22 +41,23 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRe
return new ViewHolder(view); return new ViewHolder(view);
} }
public void setValues(List<Account> values) { public void setValues(List<MercuryConnection> values) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff( DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
new AccountsDiffCallback(values, accounts), true); new AccountsDiffCallback(values, connections), true);
accounts.clear(); connections.clear();
accounts.addAll(values); connections.addAll(values);
diffResult.dispatchUpdatesTo(this); diffResult.dispatchUpdatesTo(this);
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return accounts.size(); return connections.size();
} }
@Override @Override
public void onBindViewHolder(final ViewHolder holder, int position) { public void onBindViewHolder(final ViewHolder holder, int position) {
Account account = accounts.get(position); MercuryConnection connection = connections.get(position);
Account account = connection.getAccount();
holder.account = account; holder.account = account;
holder.jid.setText(account.getAddress()); holder.jid.setText(account.getAddress());
@ -64,6 +66,8 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRe
holder.enabled.setOnCheckedChangeListener((compoundButton, checked) -> holder.enabled.setOnCheckedChangeListener((compoundButton, checked) ->
viewModel.setAccountEnabled(account, checked)); viewModel.setAccountEnabled(account, checked));
connection.getState().subscribe(state -> holder.status.setText(state.toString()));
setClickListenersOnViewHolder(holder); setClickListenersOnViewHolder(holder);
} }
@ -100,21 +104,21 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRe
} }
} }
public class AccountsDiffCallback extends AbstractDiffCallback<Account> { public class AccountsDiffCallback extends AbstractDiffCallback<MercuryConnection> {
public AccountsDiffCallback(List<Account> newItems, List<Account> oldItems) { public AccountsDiffCallback(List<MercuryConnection> newItems, List<MercuryConnection> oldItems) {
super(newItems, oldItems); super(newItems, oldItems);
} }
@Override @Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldItems.get(oldItemPosition).getId() == newItems.get(newItemPosition).getId(); return oldItems.get(oldItemPosition).getAccount().getId() == newItems.get(newItemPosition).getAccount().getId();
} }
@Override @Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
Account oldM = oldItems.get(oldItemPosition); Account oldM = oldItems.get(oldItemPosition).getAccount();
Account newM = newItems.get(newItemPosition); Account newM = newItems.get(newItemPosition).getAccount();
return oldM.equals(newM); return oldM.equals(newM);
} }
} }

View file

@ -7,10 +7,14 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.MercuryImApplication;
import org.mercury_im.messenger.Messenger;
import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.AccountRepository;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.xmpp.MercuryConnection;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
@ -21,15 +25,20 @@ public class AccountsViewModel extends AndroidViewModel {
@Inject @Inject
AccountRepository repository; AccountRepository repository;
private final MutableLiveData<List<Account>> accounts = new MutableLiveData<>(); @Inject
Messenger messenger;
private final MutableLiveData<List<MercuryConnection>> connections = new MutableLiveData<>();
private final CompositeDisposable compositeDisposable = new CompositeDisposable(); private final CompositeDisposable compositeDisposable = new CompositeDisposable();
@Inject @Inject
public AccountsViewModel(Application application) { public AccountsViewModel(Application application) {
super(application); super(application);
MercuryImApplication.getApplication().getAppComponent().inject(this); MercuryImApplication.getApplication().getAppComponent().inject(this);
compositeDisposable.add(repository.observeAllAccounts() compositeDisposable.add(messenger.getConnectionManager()
.subscribe(accounts::setValue)); .observeConnections()
.map(Map::values)
.subscribe(conns -> connections.postValue(new ArrayList<>(conns))));
} }
@Override @Override
@ -38,8 +47,8 @@ public class AccountsViewModel extends AndroidViewModel {
compositeDisposable.clear(); compositeDisposable.clear();
} }
public LiveData<List<Account>> getAccounts() { public LiveData<List<MercuryConnection>> getConnections() {
return accounts; return connections;
} }
public void setAccountEnabled(Account accountModel, boolean enabled) { public void setAccountEnabled(Account accountModel, boolean enabled) {

View file

@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.repository.AccountRepository;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.util.Optional;
import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.subjects.BehaviorSubject; import io.reactivex.subjects.BehaviorSubject;
@ -29,6 +30,10 @@ public class MercuryConnection {
observeAccountAndConnection(); observeAccountAndConnection();
} }
public Observable<ConnectionState> getState() {
return state;
}
private void observeAccountAndConnection() { private void observeAccountAndConnection() {
observeAccount(); observeAccount();
observeConnection(); observeConnection();

View file

@ -19,12 +19,14 @@ import javax.inject.Inject;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.subjects.BehaviorSubject;
public class MercuryConnectionManager { public class MercuryConnectionManager {
private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName()); private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName());
private final Map<UUID, MercuryConnection> connections = new ConcurrentHashMap<>(); private final Map<UUID, MercuryConnection> connections = new ConcurrentHashMap<>();
private final BehaviorSubject<Map<UUID, MercuryConnection>> connectionsSubject = BehaviorSubject.createDefault(connections);
private final AccountRepository accountRepository; private final AccountRepository accountRepository;
private final Messenger messenger; private final Messenger messenger;
@ -40,6 +42,10 @@ public class MercuryConnectionManager {
return new ArrayList<>(connections.values()); return new ArrayList<>(connections.values());
} }
public Observable<Map<UUID, MercuryConnection>> observeConnections() {
return connectionsSubject;
}
public MercuryConnection getConnection(Account account) { public MercuryConnection getConnection(Account account) {
return getConnection(account.getId()); return getConnection(account.getId());
} }
@ -49,7 +55,7 @@ public class MercuryConnectionManager {
} }
public void registerConnection(MercuryConnection connection) { public void registerConnection(MercuryConnection connection) {
messenger.bindConnection(connection); putConnection(connection);
if (connection.getConnection().isAuthenticated()) { if (connection.getConnection().isAuthenticated()) {
registerLiveConnection(connection); registerLiveConnection(connection);
} else { } else {
@ -57,6 +63,12 @@ public class MercuryConnectionManager {
} }
} }
private void putConnection(MercuryConnection connection) {
connections.put(connection.getAccount().getId(), connection);
connectionsSubject.onNext(connections);
messenger.bindConnection(connection);
}
private void registerLiveConnection(MercuryConnection connection) { private void registerLiveConnection(MercuryConnection connection) {
Observable<Optional<Account>> observableAccount = accountRepository Observable<Optional<Account>> observableAccount = accountRepository
.observeAccount(connection.getAccount().getId()); .observeAccount(connection.getAccount().getId());
@ -88,12 +100,7 @@ public class MercuryConnectionManager {
} }
private void handleAccountDisabled(MercuryConnection connection) { private void handleAccountDisabled(MercuryConnection connection) {
disconnectAndRemoveConnection(connection);
}
private void disconnectAndRemoveConnection(MercuryConnection connection) {
shutdownConnection(connection); shutdownConnection(connection);
removeConnection(connection);
} }
private void handleAccountEnabled(MercuryConnection connection) { private void handleAccountEnabled(MercuryConnection connection) {
@ -110,6 +117,11 @@ public class MercuryConnectionManager {
disconnectAndRemoveConnection(connection); disconnectAndRemoveConnection(connection);
} }
private void disconnectAndRemoveConnection(MercuryConnection connection) {
shutdownConnection(connection);
removeConnection(connection);
}
private void shutdownConnection(MercuryConnection connection) { private void shutdownConnection(MercuryConnection connection) {
if (connection.getConnection().isAuthenticated()) { if (connection.getConnection().isAuthenticated()) {
((AbstractXMPPConnection) connection.getConnection()).instantShutdown(); ((AbstractXMPPConnection) connection.getConnection()).instantShutdown();
@ -118,6 +130,7 @@ public class MercuryConnectionManager {
private void removeConnection(MercuryConnection connection) { private void removeConnection(MercuryConnection connection) {
connections.remove(connection.getAccount().getId()); connections.remove(connection.getAccount().getId());
connectionsSubject.onNext(connections);
connection.dispose(); connection.dispose();
} }