package com.fsck.k9.activity; import java.util.Collections; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.Preferences; import com.fsck.k9.R; import com.fsck.k9.controller.MessagingController; import com.fsck.k9.notification.NotificationActionService; import static com.fsck.k9.activity.MessageReferenceHelper.toMessageReferenceList; import static com.fsck.k9.activity.MessageReferenceHelper.toMessageReferenceStringList; public class NotificationDeleteConfirmation extends Activity { private final static String EXTRA_ACCOUNT_UUID = "accountUuid"; private final static String EXTRA_MESSAGE_REFERENCES = "messageReferences"; private final static int DIALOG_CONFIRM = 1; private Account account; private List<MessageReference> messagesToDelete; public static Intent getIntent(Context context, MessageReference messageReference) { return getIntent(context, Collections.singletonList(messageReference)); } public static Intent getIntent(Context context, List<MessageReference> messageReferences) { String accountUuid = messageReferences.get(0).getAccountUuid(); Intent intent = new Intent(context, NotificationDeleteConfirmation.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra(EXTRA_ACCOUNT_UUID, accountUuid); intent.putExtra(EXTRA_MESSAGE_REFERENCES, toMessageReferenceStringList(messageReferences)); return intent; } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setTheme(K9.getK9Theme() == K9.Theme.LIGHT ? R.style.Theme_K9_Dialog_Translucent_Light : R.style.Theme_K9_Dialog_Translucent_Dark); extractExtras(); showDialog(DIALOG_CONFIRM); } private void extractExtras() { Intent intent = getIntent(); String accountUuid = intent.getStringExtra(EXTRA_ACCOUNT_UUID); List<String> messageReferenceStrings = intent.getStringArrayListExtra(EXTRA_MESSAGE_REFERENCES); List<MessageReference> messagesToDelete = toMessageReferenceList(messageReferenceStrings); if (accountUuid == null) { throw new IllegalArgumentException(EXTRA_ACCOUNT_UUID + " can't be null"); } if (messagesToDelete == null) { throw new IllegalArgumentException(EXTRA_MESSAGE_REFERENCES + " can't be null"); } if (messagesToDelete.isEmpty()) { throw new IllegalArgumentException(EXTRA_MESSAGE_REFERENCES + " can't be empty"); } Account account = getAccountFromUuid(accountUuid); if (account == null) { throw new IllegalStateException(EXTRA_ACCOUNT_UUID + " couldn't be resolved to an account"); } this.account = account; this.messagesToDelete = messagesToDelete; } @Override public Dialog onCreateDialog(int dialogId) { switch (dialogId) { case DIALOG_CONFIRM: { return createDeleteConfirmationDialog(dialogId); } } return super.onCreateDialog(dialogId); } @Override public void onPrepareDialog(int dialogId, @NonNull Dialog dialog) { AlertDialog alert = (AlertDialog) dialog; switch (dialogId) { case DIALOG_CONFIRM: { int messageCount = messagesToDelete.size(); alert.setMessage(getResources().getQuantityString( R.plurals.dialog_confirm_delete_messages, messageCount, messageCount)); break; } } super.onPrepareDialog(dialogId, dialog); } private Account getAccountFromUuid(String accountUuid) { Preferences preferences = Preferences.getPreferences(this); return preferences.getAccount(accountUuid); } private Dialog createDeleteConfirmationDialog(int dialogId) { return ConfirmationDialog.create(this, dialogId, R.string.dialog_confirm_delete_title, "", R.string.dialog_confirm_delete_confirm_button, R.string.dialog_confirm_delete_cancel_button, new Runnable() { @Override public void run() { deleteAndFinish(); } }, new Runnable() { @Override public void run() { finish(); } }); } private void deleteAndFinish() { cancelNotifications(); triggerDelete(); finish(); } private void cancelNotifications() { MessagingController controller = MessagingController.getInstance(this); for (MessageReference messageReference : messagesToDelete) { controller.cancelNotificationForMessage(account, messageReference); } } private void triggerDelete() { String accountUuid = account.getUuid(); Intent intent = NotificationActionService.createDeleteAllMessagesIntent(this, accountUuid, messagesToDelete); startService(intent); } }