Mercury-IM/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java

197 lines
7.0 KiB
Java
Raw Normal View History

2020-07-13 18:49:29 +02:00
package org.mercury_im.messenger.android.ui.account.detail;
2020-07-09 02:10:47 +02:00
import android.content.Context;
import android.content.Intent;
2020-07-09 02:10:47 +02:00
import android.os.Bundle;
import android.view.LayoutInflater;
2020-10-24 19:25:28 +02:00
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
2020-07-09 02:10:47 +02:00
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
2020-10-24 19:25:28 +02:00
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
2020-07-09 02:10:47 +02:00
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView;
2020-07-09 02:10:47 +02:00
2020-07-13 01:39:26 +02:00
import com.google.android.material.card.MaterialCardView;
2020-07-09 02:10:47 +02:00
import org.mercury_im.messenger.R;
import org.mercury_im.messenger.android.MercuryImApplication;
2020-10-24 19:25:28 +02:00
import org.mercury_im.messenger.android.ui.ikey.IkeyBackupCreationFragment;
2020-07-13 18:49:29 +02:00
import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter;
import org.mercury_im.messenger.android.ui.openpgp.OpenPgpV4FingerprintFormatter;
2020-10-24 19:25:28 +02:00
import org.mercury_im.messenger.core.util.Optional;
import org.mercury_im.messenger.core.viewmodel.openpgp.FingerprintViewItem;
import org.pgpainless.key.OpenPgpV4Fingerprint;
2020-10-24 19:25:28 +02:00
import java.util.List;
import java.util.UUID;
2020-07-09 02:10:47 +02:00
import butterknife.BindView;
import butterknife.ButterKnife;
import de.hdodenhof.circleimageview.CircleImageView;
public class AccountDetailsFragment extends Fragment {
@BindView(R.id.avatar)
CircleImageView avatar;
@BindView(R.id.jid)
TextView jid;
@BindView(R.id.btn_share)
Button localFingerprintShareButton;
2020-10-24 19:25:28 +02:00
@BindView(R.id.btn_share_ikey)
Button ikeyFingerprintShareButton;
@BindView(R.id.btn_backup_ikey)
Button ikeyCreateBackupButton;
@BindView(R.id.ikey_fingerprint)
TextView ikeyFingerprint;
@BindView(R.id.local_fingerprint)
2020-07-09 02:10:47 +02:00
TextView localFingerprint;
@BindView(R.id.fingerprint_list)
2020-07-13 01:39:26 +02:00
RecyclerView externalFingerprintRecyclerView;
@BindView(R.id.other_fingerprints_card)
MaterialCardView otherFingerprintsLayout;
2020-10-24 19:25:28 +02:00
@BindView(R.id.layout_ikey)
MaterialCardView ikeyLayout;
private final UUID accountId;
2020-10-24 19:25:28 +02:00
private ToggleableFingerprintsAdapter otherFingerprintsAdapter;
private AndroidAccountDetailsViewModel viewModel;
public AccountDetailsFragment(UUID accountId) {
this.accountId = accountId;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
AndroidAccountDetailsViewModel.AndroidAccountDetailsViewModelFactory factory =
new AndroidAccountDetailsViewModel.AndroidAccountDetailsViewModelFactory(MercuryImApplication.getApplication(), accountId);
viewModel = new ViewModelProvider(this, factory)
.get(AndroidAccountDetailsViewModel.class);
2020-10-24 19:25:28 +02:00
this.otherFingerprintsAdapter = new ToggleableFingerprintsAdapter(
2020-07-13 14:43:30 +02:00
(fingerprint, checked) -> viewModel.markFingerprintTrusted(fingerprint, checked));
2020-10-24 19:25:28 +02:00
this.otherFingerprintsAdapter.setItemLongClickListener(fingerprint -> viewModel.unpublishPublicKey(fingerprint));
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.menu_account_details, menu);
super.onCreateOptionsMenu(menu, inflater);
}
2020-10-24 19:25:28 +02:00
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_generate_ikey:
viewModel.onGenerateIkey();
return true;
case R.id.action_delete_ikey:
viewModel.onDeleteIkey();
return true;
case R.id.action_restore_ikey_backup:
viewModel.onRestoreIkeyBackup();
return true;
}
return super.onOptionsItemSelected(item);
}
2020-10-24 19:25:28 +02:00
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_account_details, container, false);
ButterKnife.bind(this, view);
setHasOptionsMenu(true);
externalFingerprintRecyclerView.setAdapter(otherFingerprintsAdapter);
observeViewModel();
return view;
}
private void observeViewModel() {
viewModel.getIkeyFingerprint().observe(getViewLifecycleOwner(), this::displayIkeyFingerprint);
viewModel.getLocalFingerprint().observe(getViewLifecycleOwner(), this::displayLocalOxFingerprint);
viewModel.getRemoteFingerprints().observe(getViewLifecycleOwner(), this::displayOtherOxFingerprints);
2020-07-13 01:39:26 +02:00
viewModel.getJid().observe(getViewLifecycleOwner(), accountJid -> jid.setText(accountJid.toString()));
2020-07-13 01:39:26 +02:00
localFingerprintShareButton.setOnClickListener(v -> {
OpenPgpV4Fingerprint fingerprint = viewModel.getLocalFingerprint().getValue();
2020-10-24 19:25:28 +02:00
startShareFingerprintIntent(fingerprint);
});
2020-10-24 19:25:28 +02:00
ikeyFingerprintShareButton.setOnClickListener(v -> {
Optional<OpenPgpV4Fingerprint> fingerprint = viewModel.getIkeyFingerprint().getValue();
if (fingerprint == null || !fingerprint.isPresent()) {
return;
}
startShareFingerprintIntent(fingerprint.getItem());
});
2020-10-24 19:25:28 +02:00
ikeyCreateBackupButton.setOnClickListener(v -> {
getParentFragmentManager().beginTransaction()
.replace(R.id.fragment, IkeyBackupCreationFragment.newInstance(accountId)).commit();
});
}
2020-07-09 02:10:47 +02:00
2020-10-24 19:25:28 +02:00
private void startShareFingerprintIntent(OpenPgpV4Fingerprint fingerprint) {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "openpgp4fpr:" + fingerprint);
sendIntent.setType("text/plain");
Intent shareIntent = Intent.createChooser(sendIntent, "Share OpenPGP Fingerprint");
startActivity(shareIntent);
}
private void displayIkeyFingerprint(Optional<OpenPgpV4Fingerprint> fingerprint) {
if (fingerprint.isPresent()) {
ikeyLayout.setVisibility(View.VISIBLE);
ikeyFingerprint.setText(OpenPgpV4FingerprintFormatter.formatOpenPgpV4Fingerprint(fingerprint.getItem()));
} else {
ikeyLayout.setVisibility(View.GONE);
ikeyFingerprint.setText(null);
}
}
private void displayLocalOxFingerprint(OpenPgpV4Fingerprint fingerprint) {
if (fingerprint != null) {
localFingerprint.setText(OpenPgpV4FingerprintFormatter.formatOpenPgpV4Fingerprint(fingerprint));
} else {
localFingerprint.setText(null);
}
}
private void displayOtherOxFingerprints(List<FingerprintViewItem> fingerprints) {
otherFingerprintsAdapter.setItems(fingerprints);
if (fingerprints.isEmpty()) {
otherFingerprintsLayout.setVisibility(View.GONE);
} else {
otherFingerprintsLayout.setVisibility(View.VISIBLE);
}
}
2020-07-09 02:10:47 +02:00
}