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.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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue