Wip: Work on trusting ikeys
This commit is contained in:
parent
c4e672cc21
commit
b67af2c702
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModel;
|
||||||
import org.jivesoftware.smack.SmackException;
|
import org.jivesoftware.smack.SmackException;
|
||||||
import org.jivesoftware.smack.XMPPException;
|
import org.jivesoftware.smack.XMPPException;
|
||||||
import org.jivesoftware.smack.packet.Presence;
|
import org.jivesoftware.smack.packet.Presence;
|
||||||
|
import org.jxmpp.jid.EntityBareJid;
|
||||||
import org.mercury_im.messenger.android.MercuryImApplication;
|
import org.mercury_im.messenger.android.MercuryImApplication;
|
||||||
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
|
import org.mercury_im.messenger.android.ui.avatar.AvatarDrawable;
|
||||||
import org.mercury_im.messenger.android.ui.base.MercuryAndroidViewModel;
|
import org.mercury_im.messenger.android.ui.base.MercuryAndroidViewModel;
|
||||||
|
@ -129,4 +130,8 @@ public class AndroidContactDetailViewModel extends ViewModel implements MercuryA
|
||||||
public ContactDetailViewModel getCommonViewModel() {
|
public ContactDetailViewModel getCommonViewModel() {
|
||||||
return commonViewModel;
|
return commonViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void markIkeyFingerprintTrusted(OpenPgpV4Fingerprint fingerprint, EntityBareJid owner, boolean isChecked) {
|
||||||
|
commonViewModel.markIkeyFingerprintTrusted(fingerprint, owner, isChecked);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,9 +9,12 @@ import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import android.widget.Switch;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.ToggleButton;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
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.chip.ChipGroup;
|
||||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
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.OpenPgpV4FingerprintFormatter;
|
||||||
import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter;
|
import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter;
|
||||||
import org.mercury_im.messenger.core.Messenger;
|
import org.mercury_im.messenger.core.Messenger;
|
||||||
|
@ -90,12 +94,14 @@ public class ContactDetailFragment extends Fragment {
|
||||||
|
|
||||||
private ToggleableFingerprintsAdapter fingerprintsAdapter;
|
private ToggleableFingerprintsAdapter fingerprintsAdapter;
|
||||||
private AndroidContactDetailViewModel viewModel;
|
private AndroidContactDetailViewModel viewModel;
|
||||||
|
private Switch ikeyTrustToggle;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
View view = inflater.inflate(R.layout.fragment_contact_details, container, false);
|
View view = inflater.inflate(R.layout.fragment_contact_details, container, false);
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
ikeyTrustToggle = ikeyLayout.findViewById(R.id.fingerprint_toggle);
|
||||||
|
|
||||||
if (fab != null) {
|
if (fab != null) {
|
||||||
fab.setOnClickListener(v -> {
|
fab.setOnClickListener(v -> {
|
||||||
|
@ -142,20 +148,7 @@ public class ContactDetailFragment extends Fragment {
|
||||||
private void observeViewModel() {
|
private void observeViewModel() {
|
||||||
viewModel.getContactAvatar().observe(this, drawable -> contactAvatar.setImageDrawable(drawable));
|
viewModel.getContactAvatar().observe(this, drawable -> contactAvatar.setImageDrawable(drawable));
|
||||||
viewModel.getContactPresenceMode().observe(this, mode -> {
|
viewModel.getContactPresenceMode().observe(this, mode -> {
|
||||||
int color = 0;
|
int color = PresenceModeToColorMapper.map(mode);
|
||||||
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;
|
|
||||||
}
|
|
||||||
contactStatusBadge.setColorFilter(color);
|
contactStatusBadge.setColorFilter(color);
|
||||||
});
|
});
|
||||||
viewModel.getContactName().observe(this, name -> contactName.setText(name));
|
viewModel.getContactName().observe(this, name -> contactName.setText(name));
|
||||||
|
@ -178,8 +171,16 @@ public class ContactDetailFragment extends Fragment {
|
||||||
|
|
||||||
private void setIkeyFingerprint(Optional<FingerprintViewItem> fingerprintViewItemOptional) {
|
private void setIkeyFingerprint(Optional<FingerprintViewItem> fingerprintViewItemOptional) {
|
||||||
if (fingerprintViewItemOptional.isPresent()) {
|
if (fingerprintViewItemOptional.isPresent()) {
|
||||||
|
FingerprintViewItem item = fingerprintViewItemOptional.getItem();
|
||||||
ikeyLayout.setVisibility(View.VISIBLE);
|
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 {
|
} else {
|
||||||
ikeyLayout.setVisibility(View.GONE);
|
ikeyLayout.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,11 +30,11 @@
|
||||||
android:id="@+id/fingerprint_timestamp"
|
android:id="@+id/fingerprint_timestamp"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
tools:text="2018-03-01T15:26:12Z"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="@id/fingerprint"
|
|
||||||
app:layout_constraintEnd_toEndOf="@id/fingerprint"
|
app:layout_constraintEnd_toEndOf="@id/fingerprint"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/fingerprint"
|
||||||
app:layout_constraintTop_toBottomOf="@id/fingerprint"
|
app:layout_constraintTop_toBottomOf="@id/fingerprint"
|
||||||
app:layout_constraintBottom_toBottomOf="parent" />
|
tools:text="2018-03-01T15:26:12Z" />
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/divider"
|
android:id="@+id/divider"
|
||||||
|
|
|
@ -159,6 +159,7 @@ public class RxIkeyRepository implements IkeyRepository {
|
||||||
m.setSuperordinate(record.getSuperordinate());
|
m.setSuperordinate(record.getSuperordinate());
|
||||||
m.setTimestamp(record.getTimestamp());
|
m.setTimestamp(record.getTimestamp());
|
||||||
|
|
||||||
|
m.getSubordinates().clear();
|
||||||
for (IkeySubordinateRecord s : record.getSubordinates()) {
|
for (IkeySubordinateRecord s : record.getSubordinates()) {
|
||||||
IkeySubordinateModel sm = new IkeySubordinateModel();
|
IkeySubordinateModel sm = new IkeySubordinateModel();
|
||||||
sm.setId(UUID.randomUUID());
|
sm.setId(UUID.randomUUID());
|
||||||
|
|
|
@ -6,6 +6,7 @@ import org.jivesoftware.smack.packet.Presence;
|
||||||
import org.jivesoftware.smack.roster.Roster;
|
import org.jivesoftware.smack.roster.Roster;
|
||||||
import org.jivesoftware.smack.roster.RosterEntry;
|
import org.jivesoftware.smack.roster.RosterEntry;
|
||||||
import org.jivesoftware.smack.roster.RosterGroup;
|
import org.jivesoftware.smack.roster.RosterGroup;
|
||||||
|
import org.jivesoftware.smackx.ikey.util.IkeyTrust;
|
||||||
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
|
import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore;
|
||||||
import org.jxmpp.jid.EntityBareJid;
|
import org.jxmpp.jid.EntityBareJid;
|
||||||
import org.jxmpp.jid.Jid;
|
import org.jxmpp.jid.Jid;
|
||||||
|
@ -224,6 +225,13 @@ public class ContactDetailViewModel implements MercuryViewModel {
|
||||||
.subscribe();
|
.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 {
|
public static abstract class FilteredPresenceEventListener extends CombinedPresenceListener {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|
Loading…
Reference in New Issue