Signal-Android/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFr...

125 wiersze
5.0 KiB
Java

package org.thoughtcrime.securesms.payments.preferences;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.Navigation;
import org.signal.core.util.concurrent.SimpleTask;
import org.thoughtcrime.securesms.ContactSelectionListFragment;
import org.thoughtcrime.securesms.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.ContactFilterView;
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader.DisplayMode;
import org.thoughtcrime.securesms.conversation.ConversationIntents;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.payments.CanNotSendPaymentDialog;
import org.thoughtcrime.securesms.payments.preferences.model.PayeeParcelable;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
import org.whispersystems.signalservice.api.util.ExpiringProfileCredentialUtil;
import java.util.Optional;
import java.util.function.Consumer;
public class PaymentRecipientSelectionFragment extends LoggingFragment implements ContactSelectionListFragment.OnContactSelectedListener, ContactSelectionListFragment.ScrollCallback {
private Toolbar toolbar;
private ContactFilterView contactFilterView;
private ContactSelectionListFragment contactsFragment;
public PaymentRecipientSelectionFragment() {
super(R.layout.payment_recipient_selection_fragment);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
toolbar = view.findViewById(R.id.payment_recipient_selection_fragment_toolbar);
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(v).popBackStack());
contactFilterView = view.findViewById(R.id.contact_filter_edit_text);
Bundle arguments = new Bundle();
arguments.putBoolean(ContactSelectionListFragment.REFRESHABLE, false);
arguments.putInt(ContactSelectionListFragment.DISPLAY_MODE, DisplayMode.FLAG_PUSH | DisplayMode.FLAG_HIDE_NEW);
arguments.putBoolean(ContactSelectionListFragment.CAN_SELECT_SELF, false);
Fragment child = getChildFragmentManager().findFragmentById(R.id.contact_selection_list_fragment_holder);
if (child == null) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
contactsFragment = new ContactSelectionListFragment();
contactsFragment.setArguments(arguments);
transaction.add(R.id.contact_selection_list_fragment_holder, contactsFragment);
transaction.commit();
} else {
contactsFragment = (ContactSelectionListFragment) child;
}
initializeSearch();
}
private void initializeSearch() {
contactFilterView.setOnFilterChangedListener(filter -> contactsFragment.setQueryFilter(filter));
}
@Override
public void onBeforeContactSelected(@NonNull Optional<RecipientId> recipientId, @Nullable String number, @NonNull Consumer<Boolean> callback) {
if (recipientId.isPresent()) {
SimpleTask.run(getViewLifecycleOwner().getLifecycle(),
() -> Recipient.resolved(recipientId.get()),
this::createPaymentOrShowWarningDialog);
}
callback.accept(false);
}
@Override
public void onContactDeselected(@NonNull Optional<RecipientId> recipientId, @Nullable String number) {}
@Override
public void onSelectionChanged() {
}
@Override
public void onBeginScroll() {
hideKeyboard();
}
private void hideKeyboard() {
ViewUtil.hideKeyboard(requireContext(), toolbar);
toolbar.clearFocus();
}
private void createPaymentOrShowWarningDialog(@NonNull Recipient recipient) {
if (ExpiringProfileCredentialUtil.isValid(recipient.getExpiringProfileKeyCredential())) {
createPayment(recipient.getId());
} else {
showWarningDialog(recipient.getId());
}
}
private void createPayment(@NonNull RecipientId recipientId) {
hideKeyboard();
SafeNavigation.safeNavigate(Navigation.findNavController(requireView()), PaymentRecipientSelectionFragmentDirections.actionPaymentRecipientSelectionToCreatePayment(new PayeeParcelable(recipientId)));
}
private void showWarningDialog(@NonNull RecipientId recipientId) {
CanNotSendPaymentDialog.show(requireContext(),
() -> openConversation(recipientId));
}
private void openConversation(@NonNull RecipientId recipientId) {
SimpleTask.run(getViewLifecycleOwner().getLifecycle(),
() -> SignalDatabase.threads().getThreadIdIfExistsFor(recipientId),
threadId -> startActivity(ConversationIntents.createBuilder(requireContext(), recipientId, threadId).build()));
}
}