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

182 lines
6.5 KiB
Java
Raw Normal View History

2020-07-09 02:10:47 +02:00
package org.mercury_im.messenger.android.ui.account;
import android.content.Context;
import android.content.Intent;
2020-07-09 02:10:47 +02:00
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Switch;
2020-07-09 02:10:47 +02:00
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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-07-13 01:39:26 +02:00
import org.mercury_im.messenger.android.util.OpenPgpV4FingerprintFormatter;
import org.mercury_im.messenger.core.viewmodel.accounts.AccountFingerprintViewItem;
import org.pgpainless.key.OpenPgpV4Fingerprint;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
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;
@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;
private final UUID accountId;
private ToggleableFingerprintsAdapter adapter;
private AndroidAccountDetailsViewModel viewModel;
private static final DateFormat dateFormat = SimpleDateFormat.getDateInstance();
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);
this.adapter = new ToggleableFingerprintsAdapter(viewModel);
}
private void observe() {
2020-07-13 01:39:26 +02:00
viewModel.getLocalFingerprint().observe(getViewLifecycleOwner(),
f -> localFingerprint.setText(OpenPgpV4FingerprintFormatter.formatOpenPgpV4Fingerprint(f)));
2020-07-13 01:39:26 +02:00
viewModel.getRemoteFingerprints().observe(getViewLifecycleOwner(), items -> {
otherFingerprintsLayout.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE);
adapter.setItems(items);
});
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();
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "openpgp4fpr:" + fingerprint);
sendIntent.setType("text/plain");
2020-07-13 01:39:26 +02:00
Intent shareIntent = Intent.createChooser(sendIntent, "Share OpenPGP Fingerprint");
startActivity(shareIntent);
});
}
2020-07-09 02:10:47 +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);
2020-07-13 01:39:26 +02:00
externalFingerprintRecyclerView.setAdapter(adapter);
observe();
2020-07-09 02:10:47 +02:00
return view;
}
public static class ToggleableFingerprintsAdapter extends RecyclerView.Adapter<ToggleableFingerprintsAdapter.ViewHolder> {
private final List<AccountFingerprintViewItem> fingerprints = new ArrayList<>();
private final AndroidAccountDetailsViewModel viewModel;
public ToggleableFingerprintsAdapter(AndroidAccountDetailsViewModel viewModel) {
this.viewModel = viewModel;
}
public void setItems(List<AccountFingerprintViewItem> fingerprints) {
synchronized (this.fingerprints) {
this.fingerprints.clear();
this.fingerprints.addAll(fingerprints);
this.notifyDataSetChanged();
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.view_fingerprint_toggleable, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
synchronized (fingerprints) {
AccountFingerprintViewItem f = fingerprints.get(position);
final OpenPgpV4Fingerprint fingerprint = f.getFingerprint();
2020-07-13 01:39:26 +02:00
holder.fingerprint.setText(OpenPgpV4FingerprintFormatter.formatOpenPgpV4Fingerprint(fingerprint));
holder.fingerprintTimestamp.setText(dateFormat.format(f.getAnnouncementDate()));
holder.trustSwitch.setChecked(f.isTrusted());
holder.trustSwitch.setOnCheckedChangeListener(
(buttonView, isChecked) -> viewModel.markFingerprintTrusted(fingerprint, isChecked));
2020-07-13 01:39:26 +02:00
holder.divider.setVisibility(position == fingerprints.size() - 1 ? View.GONE : View.VISIBLE);
}
}
@Override
public int getItemCount() {
return fingerprints.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final Switch trustSwitch;
private final TextView fingerprintTimestamp;
private final TextView fingerprint;
2020-07-13 01:39:26 +02:00
private final View divider;
public ViewHolder(@NonNull View itemView) {
super(itemView);
this.fingerprint = itemView.findViewById(R.id.fingerprint);
this.trustSwitch = itemView.findViewById(R.id.fingerprint_toggle);
this.fingerprintTimestamp = itemView.findViewById(R.id.fingerprint_timestamp);
2020-07-13 01:39:26 +02:00
this.divider = itemView.findViewById(R.id.divider);
}
}
}
2020-07-09 02:10:47 +02:00
}