Add subscription cancellation step during account deletion.

fork-5.53.8
Alex Hart 2022-02-23 09:00:02 -04:00 zatwierdzone przez Greyson Parrelli
rodzic 2de5ea43fb
commit 2ed39e4448
5 zmienionych plików z 52 dodań i 0 usunięć

Wyświetl plik

@ -17,6 +17,8 @@ sealed class DeleteAccountEvent(val type: Type) {
object PinDeletionFailed : DeleteAccountEvent(Type.PIN_DELETION_FAILED) object PinDeletionFailed : DeleteAccountEvent(Type.PIN_DELETION_FAILED)
object CancelSubscriptionFailed : DeleteAccountEvent(Type.CANCEL_SUBSCRIPTION_FAILED)
object LeaveGroupsFailed : DeleteAccountEvent(Type.LEAVE_GROUPS_FAILED) object LeaveGroupsFailed : DeleteAccountEvent(Type.LEAVE_GROUPS_FAILED)
object ServerDeletionFailed : DeleteAccountEvent(Type.SERVER_DELETION_FAILED) object ServerDeletionFailed : DeleteAccountEvent(Type.SERVER_DELETION_FAILED)
@ -25,6 +27,8 @@ sealed class DeleteAccountEvent(val type: Type) {
object LeaveGroupsFinished : DeleteAccountEvent(Type.LEAVE_GROUPS_FINISHED) object LeaveGroupsFinished : DeleteAccountEvent(Type.LEAVE_GROUPS_FINISHED)
object CancelingSubscription : DeleteAccountEvent(Type.CANCELING_SUBSCRIPTION)
/** /**
* Progress update for leaving groups * Progress update for leaving groups
* *
@ -43,6 +47,8 @@ sealed class DeleteAccountEvent(val type: Type) {
CONFIRM_DELETION, CONFIRM_DELETION,
LEAVE_GROUPS_FAILED, LEAVE_GROUPS_FAILED,
PIN_DELETION_FAILED, PIN_DELETION_FAILED,
CANCELING_SUBSCRIPTION,
CANCEL_SUBSCRIPTION_FAILED,
SERVER_DELETION_FAILED, SERVER_DELETION_FAILED,
LOCAL_DATA_DELETION_FAILED, LOCAL_DATA_DELETION_FAILED,
LEAVE_GROUPS_PROGRESS, LEAVE_GROUPS_PROGRESS,

Wyświetl plik

@ -246,6 +246,7 @@ public class DeleteAccountFragment extends Fragment {
case LEAVE_GROUPS_FAILED: case LEAVE_GROUPS_FAILED:
case PIN_DELETION_FAILED: case PIN_DELETION_FAILED:
case SERVER_DELETION_FAILED: case SERVER_DELETION_FAILED:
case CANCEL_SUBSCRIPTION_FAILED:
dismissDeletionProgressDialog(); dismissDeletionProgressDialog();
showNetworkDeletionFailedDialog(); showNetworkDeletionFailedDialog();
break; break;
@ -260,6 +261,9 @@ public class DeleteAccountFragment extends Fragment {
case LEAVE_GROUPS_FINISHED: case LEAVE_GROUPS_FINISHED:
ensureDeletionProgressDialog(); ensureDeletionProgressDialog();
deletionProgressDialog.presentDeletingAccount(); deletionProgressDialog.presentDeletingAccount();
case CANCELING_SUBSCRIPTION:
ensureDeletionProgressDialog();
deletionProgressDialog.presentCancelingSubscription();
break; break;
default: default:
throw new IllegalStateException("Unknown error type: " + deleteAccountEvent); throw new IllegalStateException("Unknown error type: " + deleteAccountEvent);

Wyświetl plik

@ -19,9 +19,16 @@ class DeleteAccountProgressDialog private constructor(private val alertDialog: A
val message: TextView = alertDialog.findViewById(R.id.delete_account_progress_dialog_message)!! val message: TextView = alertDialog.findViewById(R.id.delete_account_progress_dialog_message)!!
val progressBar: ProgressBar = alertDialog.findViewById(R.id.delete_account_progress_dialog_spinner)!! val progressBar: ProgressBar = alertDialog.findViewById(R.id.delete_account_progress_dialog_spinner)!!
fun presentCancelingSubscription() {
title.setText(R.string.DeleteAccountFragment__deleting_account)
message.setText(R.string.DeleteAccountFragment__canceling_your_subscription)
progressBar.isIndeterminate = true
}
fun presentLeavingGroups(leaveGroupsProgress: DeleteAccountEvent.LeaveGroupsProgress) { fun presentLeavingGroups(leaveGroupsProgress: DeleteAccountEvent.LeaveGroupsProgress) {
title.setText(R.string.DeleteAccountFragment__leaving_groups) title.setText(R.string.DeleteAccountFragment__leaving_groups)
message.setText(R.string.DeleteAccountFragment__depending_on_the_number_of_groups) message.setText(R.string.DeleteAccountFragment__depending_on_the_number_of_groups)
progressBar.isIndeterminate = false
progressBar.max = leaveGroupsProgress.totalCount progressBar.max = leaveGroupsProgress.totalCount
progressBar.progress = leaveGroupsProgress.leaveCount progressBar.progress = leaveGroupsProgress.leaveCount
} }

Wyświetl plik

@ -12,9 +12,13 @@ import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupManager; import org.thoughtcrime.securesms.groups.GroupManager;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.pin.KbsEnclaves; import org.thoughtcrime.securesms.pin.KbsEnclaves;
import org.thoughtcrime.securesms.subscription.Subscriber;
import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.ServiceUtil;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
import org.whispersystems.signalservice.internal.EmptyResponse;
import org.whispersystems.signalservice.internal.ServiceResponse;
import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException; import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException;
import java.io.IOException; import java.io.IOException;
@ -42,6 +46,35 @@ class DeleteAccountRepository {
void deleteAccount(@NonNull Consumer<DeleteAccountEvent> onDeleteAccountEvent) { void deleteAccount(@NonNull Consumer<DeleteAccountEvent> onDeleteAccountEvent) {
SignalExecutors.BOUNDED.execute(() -> { SignalExecutors.BOUNDED.execute(() -> {
if (SignalStore.donationsValues().getSubscriber() != null) {
Log.i(TAG, "deleteAccount: attempting to cancel subscription");
onDeleteAccountEvent.accept(DeleteAccountEvent.CancelingSubscription.INSTANCE);
Subscriber subscriber = SignalStore.donationsValues().requireSubscriber();
ServiceResponse<EmptyResponse> cancelSubscriptionResponse = ApplicationDependencies.getDonationsService()
.cancelSubscription(subscriber.getSubscriberId())
.blockingGet();
if (cancelSubscriptionResponse.getExecutionError().isPresent()) {
Log.w(TAG, "deleteAccount: failed attempt to cancel subscription");
onDeleteAccountEvent.accept(DeleteAccountEvent.CancelSubscriptionFailed.INSTANCE);
return;
}
switch (cancelSubscriptionResponse.getStatus()) {
case 404:
Log.i(TAG, "deleteAccount: subscription does not exist. Continuing deletion...");
break;
case 200:
Log.i(TAG, "deleteAccount: successfully cancelled subscription. Continuing deletion...");
break;
default:
Log.w(TAG, "deleteAccount: an unexpected error occurred. " + cancelSubscriptionResponse.getStatus());
onDeleteAccountEvent.accept(DeleteAccountEvent.CancelSubscriptionFailed.INSTANCE);
return;
}
}
Log.i(TAG, "deleteAccount: attempting to leave groups..."); Log.i(TAG, "deleteAccount: attempting to leave groups...");
int groupsLeft = 0; int groupsLeft = 0;

Wyświetl plik

@ -3442,6 +3442,8 @@
<string name="DeleteAccountFragment__leaving_groups">Leaving groups…</string> <string name="DeleteAccountFragment__leaving_groups">Leaving groups…</string>
<!-- Title of progress dialog shown when a user deletes their account and the process has left all groups --> <!-- Title of progress dialog shown when a user deletes their account and the process has left all groups -->
<string name="DeleteAccountFragment__deleting_account">Deleting account…</string> <string name="DeleteAccountFragment__deleting_account">Deleting account…</string>
<!-- Message of progress dialog shown when a user deletes their account and the process is canceling their subscription -->
<string name="DeleteAccountFragment__canceling_your_subscription">Canceling your subscription…</string>
<!-- Message of progress dialog shown when a user deletes their account and the process is leaving groups --> <!-- Message of progress dialog shown when a user deletes their account and the process is leaving groups -->
<string name="DeleteAccountFragment__depending_on_the_number_of_groups">Depending on the number of groups you\'re in, this might take a few minutes</string> <string name="DeleteAccountFragment__depending_on_the_number_of_groups">Depending on the number of groups you\'re in, this might take a few minutes</string>
<!-- Message of progress dialog shown when a user deletes their account and the process has left all groups --> <!-- Message of progress dialog shown when a user deletes their account and the process has left all groups -->