This commit is contained in:
Paul Schaub 2021-01-13 22:31:20 +01:00
parent 2ea902a081
commit d3a8186fd8
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
5 changed files with 60 additions and 19 deletions

View File

@ -137,6 +137,15 @@ public class ContactDetailFragment extends Fragment {
builder.show();
}
/*
@Override
public void onDestroy() {
viewModel.dispose();
super.onDestroy();
}
*/
@Override
public void onAttach(Context context) {
super.onAttach(context);

View File

@ -30,6 +30,7 @@ import io.reactivex.Single;
import io.requery.Persistable;
import io.requery.query.ResultDelegate;
import io.requery.reactivex.ReactiveEntityStore;
import io.requery.reactivex.ReactiveResult;
public class RxIkeyRepository implements IkeyRepository {
@ -118,12 +119,11 @@ public class RxIkeyRepository implements IkeyRepository {
@Override
public Completable storeSuperordinateTrust(UUID accountId, EntityBareJid jid, OpenPgpV4Fingerprint fingerprint, OpenPgpTrustStore.Trust trust) {
return loadRecord(accountId, jid)
.singleOrError()
.map(record -> {
record.setTrust(trust);
return record;
})
.firstOrError()
.doOnSuccess(m -> LOGGER.log(Level.INFO, "First Record: " + m))
.flatMapCompletable(record -> storeRecord(accountId, jid, record));
}
@ -181,7 +181,7 @@ public class RxIkeyRepository implements IkeyRepository {
@Override
public Observable<IkeyRecord> loadContenderRecord(UUID accountId, EntityBareJid jid) {
return getRecordModel(accountId, jid, false)
return getRecordModel(accountId, jid, true)
.map(m -> {
List<IkeySubordinateRecord> subordinateRecords = new ArrayList<>();
for (IkeySubordinateModel s : m.getSubordinates()) {
@ -238,12 +238,25 @@ public class RxIkeyRepository implements IkeyRepository {
.get().single().ignoreElement();
}
// TODO: When this method is used in loadRecord() to get continuous updates of the record model
// unfortunately updating the model (eg. per storeSuperordinateTrust() ) no longer terminates.
private Observable<IkeyRecordModel> getContinuousRecordModel(UUID accountId, EntityBareJid jid, boolean isContender) {
return getRecordModelResult(accountId, jid, isContender)
.observableResult()
.map(ResultDelegate::first);
}
private Observable<IkeyRecordModel> getRecordModel(UUID accountId, EntityBareJid jid, boolean isContender) {
return getRecordModelResult(accountId, jid, isContender)
.observable();
}
private ReactiveResult<IkeyRecordModel> getRecordModelResult(UUID accountId, EntityBareJid jid, boolean isContender) {
return data.select(IkeyRecordModel.class)
.where(IkeyRecordModel.ACCOUNT_ID.eq(accountId)
.and(IkeyRecordModel.JID.eq(jid))
.and(IkeyRecordModel.CONTENDER.eq(isContender)))
.get().observable();
.get();
}
}

View File

@ -73,10 +73,12 @@ public class IkeyAwareOpenPgpStore extends MercuryOpenPgpStore {
private Single<Trust> readIkeyTrust(EntityBareJid owner, OpenPgpV4Fingerprint fingerprint) {
return ikeyRecordRepository.loadRecord(accountId, owner)
.filter(record -> record.getTrust() == Trust.trusted)
.filter(record -> record.hasSubordinate(fingerprint))
.map(IkeyRecord::getTrust)
.map(trust -> trust == Trust.trusted ? Trust.ikey_trusted : trust)
.map(record -> {
if (record.getTrust() == Trust.trusted && record.hasSubordinate(fingerprint)) {
return Trust.ikey_trusted;
}
return record.getTrust();
})
.firstElement()
.flatMap(t -> t == Trust.undecided ? readManualTrust(owner, fingerprint).toMaybe() : Maybe.just(t))
.switchIfEmpty(readManualTrust(owner, fingerprint));

View File

@ -6,6 +6,7 @@ import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.roster.RosterGroup;
import org.jivesoftware.smackx.ikey.record.IkeyRecord;
import org.jivesoftware.smackx.ox.OpenPgpManager;
import org.jivesoftware.smackx.ox.crypto.OpenPgpProvider;
import org.jivesoftware.smackx.ox.store.definition.OpenPgpStore;
@ -42,6 +43,7 @@ import javax.inject.Inject;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.functions.BiFunction;
import io.reactivex.subjects.BehaviorSubject;
import lombok.Getter;
@ -113,6 +115,7 @@ public class ContactDetailViewModel implements MercuryViewModel {
roster = Roster.getInstanceFor(connection.getConnection());
setupPresenceEventListener(roster, peer.getJid());
// peer
addDisposable(peerRepository
.observePeer(peerId)
.filter(Optional::isPresent)
@ -126,16 +129,28 @@ public class ContactDetailViewModel implements MercuryViewModel {
}));
// Device keys
addDisposable(openPgpRepository
.observeFingerprints(peer.getAccount().getId(), peer.getJid())
.map(viewItems -> {
for (FingerprintViewItem item : viewItems) {
item.setTrusted(openPgpStore.getTrust(item.getOwner(), item.getFingerprint()));
}
return viewItems;
})
.compose(schedulers.executeUiSafeObservable())
.subscribe(fingerprints -> contactDeviceFingerprints.onNext(fingerprints)));
addDisposable(
Observable.combineLatest(
openPgpRepository.observeFingerprints(peer.getAccount().getId(), peer.getJid())
.doOnComplete(() -> LOGGER.log(Level.INFO, "Fingerprint complete"))
.doOnNext(f -> LOGGER.log(Level.INFO, "Fingerprint Update: " + f)),
ikeyRepository.loadRecord(accountId, peer.getJid())
.doOnComplete(() -> LOGGER.log(Level.INFO, "Record complete"))
.doOnNext(r -> LOGGER.log(Level.INFO, "Record update: " + r)),
(viewItems, ikeyRecord) -> {
LOGGER.log(Level.INFO, "Combining");
for (FingerprintViewItem item : viewItems) {
OpenPgpTrustStore.Trust trust = openPgpStore.getTrust(item.getOwner(), item.getFingerprint());
item.setTrusted(trust);
}
return viewItems;
})
.doOnNext(m -> LOGGER.log(Level.INFO, "Combined Update: " + m))
.compose(schedulers.executeUiSafeObservable())
.doOnComplete(() -> LOGGER.log(Level.INFO, "Completed"))
.doOnDispose(() -> LOGGER.log(Level.INFO, "Disposed"))
.doOnTerminate(() -> LOGGER.log(Level.INFO, "Terminate"))
.subscribe(fingerprints -> contactDeviceFingerprints.onNext(fingerprints)));
// Ikey
addDisposable(ikeyRepository
@ -248,6 +263,7 @@ public class ContactDetailViewModel implements MercuryViewModel {
}
public void markIkeyFingerprintTrusted(OpenPgpV4Fingerprint fingerprint, EntityBareJid owner, boolean isChecked) {
LOGGER.log(Level.INFO, "Marking Ikey " + fingerprint + " as " + (isChecked ? "trusted" : "untrusted"));
OpenPgpTrustStore.Trust trust = isChecked ? OpenPgpTrustStore.Trust.trusted : OpenPgpTrustStore.Trust.untrusted;
addDisposable(ikeyRepository.storeSuperordinateTrust(accountId, owner, fingerprint, trust)
.subscribe(() -> LOGGER.log(Level.INFO, "Marked Ikey " + fingerprint + " of " + owner + " as " + trust),
@ -276,6 +292,7 @@ public class ContactDetailViewModel implements MercuryViewModel {
@Override
public void dispose() {
LOGGER.log(Level.INFO, "Dispose");
compositeDisposable.dispose();
if (presenceEventListener != null) roster.removePresenceEventListener(presenceEventListener);
}

@ -1 +1 @@
Subproject commit 36997c5835e8ed72b927a5543d2dc55c12e8d28a
Subproject commit 695a7982bfc9aa4720e9eb846bfaaf367b1fcaaa