Use connection instead of account in account fragment
This commit is contained in:
parent
bc85fe432d
commit
ae6d3ef9d4
|
@ -58,7 +58,7 @@ public class AccountsFragment extends Fragment {
|
|||
}
|
||||
|
||||
private void observeViewModel() {
|
||||
viewModel.getAccounts().observe(this, adapter::setValues);
|
||||
viewModel.getConnections().observe(this, adapter::setValues);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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.account.AccountsFragment.OnAccountListItemClickListener;
|
||||
import org.mercury_im.messenger.util.AbstractDiffCallback;
|
||||
import org.mercury_im.messenger.xmpp.MercuryConnection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
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 AccountsViewModel viewModel;
|
||||
|
||||
|
@ -40,22 +41,23 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRe
|
|||
return new ViewHolder(view);
|
||||
}
|
||||
|
||||
public void setValues(List<Account> values) {
|
||||
public void setValues(List<MercuryConnection> values) {
|
||||
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
|
||||
new AccountsDiffCallback(values, accounts), true);
|
||||
accounts.clear();
|
||||
accounts.addAll(values);
|
||||
new AccountsDiffCallback(values, connections), true);
|
||||
connections.clear();
|
||||
connections.addAll(values);
|
||||
diffResult.dispatchUpdatesTo(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return accounts.size();
|
||||
return connections.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
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.jid.setText(account.getAddress());
|
||||
|
@ -64,6 +66,8 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRe
|
|||
holder.enabled.setOnCheckedChangeListener((compoundButton, checked) ->
|
||||
viewModel.setAccountEnabled(account, checked));
|
||||
|
||||
connection.getState().subscribe(state -> holder.status.setText(state.toString()));
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
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
|
||||
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
|
||||
Account oldM = oldItems.get(oldItemPosition);
|
||||
Account newM = newItems.get(newItemPosition);
|
||||
Account oldM = oldItems.get(oldItemPosition).getAccount();
|
||||
Account newM = newItems.get(newItemPosition).getAccount();
|
||||
return oldM.equals(newM);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,10 +7,14 @@ import androidx.lifecycle.LiveData;
|
|||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
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.entity.Account;
|
||||
import org.mercury_im.messenger.xmpp.MercuryConnection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
|
@ -21,15 +25,20 @@ public class AccountsViewModel extends AndroidViewModel {
|
|||
@Inject
|
||||
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();
|
||||
|
||||
@Inject
|
||||
public AccountsViewModel(Application application) {
|
||||
super(application);
|
||||
MercuryImApplication.getApplication().getAppComponent().inject(this);
|
||||
compositeDisposable.add(repository.observeAllAccounts()
|
||||
.subscribe(accounts::setValue));
|
||||
compositeDisposable.add(messenger.getConnectionManager()
|
||||
.observeConnections()
|
||||
.map(Map::values)
|
||||
.subscribe(conns -> connections.postValue(new ArrayList<>(conns))));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -38,8 +47,8 @@ public class AccountsViewModel extends AndroidViewModel {
|
|||
compositeDisposable.clear();
|
||||
}
|
||||
|
||||
public LiveData<List<Account>> getAccounts() {
|
||||
return accounts;
|
||||
public LiveData<List<MercuryConnection>> getConnections() {
|
||||
return connections;
|
||||
}
|
||||
|
||||
public void setAccountEnabled(Account accountModel, boolean enabled) {
|
||||
|
|
|
@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.repository.AccountRepository;
|
|||
import org.mercury_im.messenger.entity.Account;
|
||||
import org.mercury_im.messenger.util.Optional;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.subjects.BehaviorSubject;
|
||||
|
||||
|
@ -29,6 +30,10 @@ public class MercuryConnection {
|
|||
observeAccountAndConnection();
|
||||
}
|
||||
|
||||
public Observable<ConnectionState> getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
private void observeAccountAndConnection() {
|
||||
observeAccount();
|
||||
observeConnection();
|
||||
|
|
|
@ -19,12 +19,14 @@ import javax.inject.Inject;
|
|||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.subjects.BehaviorSubject;
|
||||
|
||||
public class MercuryConnectionManager {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName());
|
||||
|
||||
private final Map<UUID, MercuryConnection> connections = new ConcurrentHashMap<>();
|
||||
private final BehaviorSubject<Map<UUID, MercuryConnection>> connectionsSubject = BehaviorSubject.createDefault(connections);
|
||||
private final AccountRepository accountRepository;
|
||||
private final Messenger messenger;
|
||||
|
||||
|
@ -40,6 +42,10 @@ public class MercuryConnectionManager {
|
|||
return new ArrayList<>(connections.values());
|
||||
}
|
||||
|
||||
public Observable<Map<UUID, MercuryConnection>> observeConnections() {
|
||||
return connectionsSubject;
|
||||
}
|
||||
|
||||
public MercuryConnection getConnection(Account account) {
|
||||
return getConnection(account.getId());
|
||||
}
|
||||
|
@ -49,7 +55,7 @@ public class MercuryConnectionManager {
|
|||
}
|
||||
|
||||
public void registerConnection(MercuryConnection connection) {
|
||||
messenger.bindConnection(connection);
|
||||
putConnection(connection);
|
||||
if (connection.getConnection().isAuthenticated()) {
|
||||
registerLiveConnection(connection);
|
||||
} 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) {
|
||||
Observable<Optional<Account>> observableAccount = accountRepository
|
||||
.observeAccount(connection.getAccount().getId());
|
||||
|
@ -88,12 +100,7 @@ public class MercuryConnectionManager {
|
|||
}
|
||||
|
||||
private void handleAccountDisabled(MercuryConnection connection) {
|
||||
disconnectAndRemoveConnection(connection);
|
||||
}
|
||||
|
||||
private void disconnectAndRemoveConnection(MercuryConnection connection) {
|
||||
shutdownConnection(connection);
|
||||
removeConnection(connection);
|
||||
}
|
||||
|
||||
private void handleAccountEnabled(MercuryConnection connection) {
|
||||
|
@ -110,6 +117,11 @@ public class MercuryConnectionManager {
|
|||
disconnectAndRemoveConnection(connection);
|
||||
}
|
||||
|
||||
private void disconnectAndRemoveConnection(MercuryConnection connection) {
|
||||
shutdownConnection(connection);
|
||||
removeConnection(connection);
|
||||
}
|
||||
|
||||
private void shutdownConnection(MercuryConnection connection) {
|
||||
if (connection.getConnection().isAuthenticated()) {
|
||||
((AbstractXMPPConnection) connection.getConnection()).instantShutdown();
|
||||
|
@ -118,6 +130,7 @@ public class MercuryConnectionManager {
|
|||
|
||||
private void removeConnection(MercuryConnection connection) {
|
||||
connections.remove(connection.getAccount().getId());
|
||||
connectionsSubject.onNext(connections);
|
||||
connection.dispose();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue