Wip: Work on trusting ikeys

This commit is contained in:
Paul Schaub 2020-12-21 21:07:28 +01:00
parent c4e672cc21
commit b67af2c702
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
6 changed files with 61 additions and 18 deletions

View File

@ -0,0 +1,28 @@
package org.mercury_im.messenger.android.ui.contacts;
import androidx.annotation.ColorInt;
import org.jivesoftware.smack.packet.Presence;
import org.mercury_im.messenger.android.util.ColorUtil;
public class PresenceModeToColorMapper {
@ColorInt
public static int map(Presence.Mode mode) {
int color = 0;
switch (mode) {
case chat:
case available:
color = ColorUtil.rgb(0, 255, 0);
break;
case away:
case xa:
color = ColorUtil.rgb(255, 128, 0);
break;
case dnd:
color = ColorUtil.rgb(255, 0, 0);
break;
}
return color;
}
}

View File

@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModel;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import org.jxmpp.jid.EntityBareJid;
import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
import org.mercury_im.messenger.android.ui.base.MercuryAndroidViewModel;
@ -129,4 +130,8 @@ public class AndroidContactDetailViewModel extends ViewModel implements MercuryA
public ContactDetailViewModel getCommonViewModel() {
return commonViewModel;
}
public void markIkeyFingerprintTrusted(OpenPgpV4Fingerprint fingerprint, EntityBareJid owner, boolean isChecked) {
commonViewModel.markIkeyFingerprintTrusted(fingerprint, owner, isChecked);
}
}

View File

@ -9,9 +9,12 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.ToggleButton;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -25,6 +28,7 @@ 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.contacts.PresenceModeToColorMapper;
import org.mercury_im.messenger.android.ui.openpgp.OpenPgpV4FingerprintFormatter;
import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter;
import org.mercury_im.messenger.core.Messenger;
@ -90,12 +94,14 @@ public class ContactDetailFragment extends Fragment {
private ToggleableFingerprintsAdapter fingerprintsAdapter;
private AndroidContactDetailViewModel viewModel;
private Switch ikeyTrustToggle;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_contact_details, container, false);
ButterKnife.bind(this, view);
ikeyTrustToggle = ikeyLayout.findViewById(R.id.fingerprint_toggle);
if (fab != null) {
fab.setOnClickListener(v -> {
@ -142,20 +148,7 @@ public class ContactDetailFragment extends Fragment {
private void observeViewModel() {
viewModel.getContactAvatar().observe(this, drawable -> contactAvatar.setImageDrawable(drawable));
viewModel.getContactPresenceMode().observe(this, mode -> {
int color = 0;
switch (mode) {
case chat:
case available:
color = ColorUtil.rgb(0, 255, 0);
break;
case away:
case xa:
color = ColorUtil.rgb(255, 128, 0);
break;
case dnd:
color = ColorUtil.rgb(255, 0, 0);
break;
}
int color = PresenceModeToColorMapper.map(mode);
contactStatusBadge.setColorFilter(color);
});
viewModel.getContactName().observe(this, name -> contactName.setText(name));
@ -178,8 +171,16 @@ public class ContactDetailFragment extends Fragment {
private void setIkeyFingerprint(Optional<FingerprintViewItem> fingerprintViewItemOptional) {
if (fingerprintViewItemOptional.isPresent()) {
FingerprintViewItem item = fingerprintViewItemOptional.getItem();
ikeyLayout.setVisibility(View.VISIBLE);
ikeyFingerprint.setText(OpenPgpV4FingerprintFormatter.formatOpenPgpV4Fingerprint(fingerprintViewItemOptional.getItem().getFingerprint()));
ikeyFingerprint.setText(OpenPgpV4FingerprintFormatter.formatOpenPgpV4Fingerprint(item.getFingerprint()));
ikeyTrustToggle.setChecked(item.isTrusted());
ikeyTrustToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
viewModel.markIkeyFingerprintTrusted(item.getFingerprint(), item.getOwner(), isChecked);
}
});
} else {
ikeyLayout.setVisibility(View.GONE);
}

View File

@ -30,11 +30,11 @@
android:id="@+id/fingerprint_timestamp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="2018-03-01T15:26:12Z"
app:layout_constraintStart_toStartOf="@id/fingerprint"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/fingerprint"
app:layout_constraintStart_toStartOf="@id/fingerprint"
app:layout_constraintTop_toBottomOf="@id/fingerprint"
app:layout_constraintBottom_toBottomOf="parent" />
tools:text="2018-03-01T15:26:12Z" />
<View
android:id="@+id/divider"

View File

@ -159,6 +159,7 @@ public class RxIkeyRepository implements IkeyRepository {
m.setSuperordinate(record.getSuperordinate());
m.setTimestamp(record.getTimestamp());
m.getSubordinates().clear();
for (IkeySubordinateRecord s : record.getSubordinates()) {
IkeySubordinateModel sm = new IkeySubordinateModel();
sm.setId(UUID.randomUUID());

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.util.IkeyTrust;
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.Jid;
@ -224,6 +225,13 @@ public class ContactDetailViewModel implements MercuryViewModel {
.subscribe();
}
public void markIkeyFingerprintTrusted(OpenPgpV4Fingerprint fingerprint, EntityBareJid owner, boolean isChecked) {
IkeyTrust trust = new IkeyTrust();
trust.setTrust(isChecked ? OpenPgpTrustStore.Trust.trusted : OpenPgpTrustStore.Trust.untrusted);
ikeyRepository.storeSuperordinateTrust(accountId, owner, fingerprint, trust)
.subscribe();
}
public static abstract class FilteredPresenceEventListener extends CombinedPresenceListener {
@Getter