Destructive action dialogs.

Use delete/ archive settings to determine if we should show a confirmation dialog.
Show confirm discard dialog in Compose and actually discard.

Change-Id: I992bdf598af72a62deadfdfe695a64b89fad5c24
diff --git a/src/com/android/mail/browse/SelectedConversationsActionMenu.java b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
index 0695965..c11ab0e 100644
--- a/src/com/android/mail/browse/SelectedConversationsActionMenu.java
+++ b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
@@ -21,6 +21,7 @@
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Conversation;
 import com.android.mail.providers.Folder;
+import com.android.mail.providers.Settings;
 import com.android.mail.providers.UIProvider;
 import com.android.mail.providers.UIProvider.FolderCapabilities;
 import com.android.mail.providers.UIProvider.ConversationColumns;
@@ -34,6 +35,7 @@
 import com.android.mail.ui.UndoBarView.UndoListener;
 import com.android.mail.ui.UndoOperation;
 import com.android.mail.utils.LogUtils;
+import com.android.mail.utils.Utils;
 import com.google.common.annotations.VisibleForTesting;
 
 import java.util.ArrayList;
@@ -41,7 +43,9 @@
 import java.util.Collection;
 import java.util.HashSet;
 
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.text.TextUtils;
 import android.view.ActionMode;
 import android.view.Menu;
@@ -123,10 +127,10 @@
         Collection<Conversation> conversations = mSelectionSet.values();
         switch (item.getItemId()) {
             case R.id.delete:
-                mListAdapter.delete(conversations, mDeleteListener);
+                performDestructiveAction(R.id.delete, mDeleteListener);
                 break;
             case R.id.archive:
-                mListAdapter.delete(conversations, mArchiveListener);
+                performDestructiveAction(R.id.archive, mArchiveListener);
                 break;
             case R.id.mute:
                 mListAdapter.delete(conversations, mMuteListener);
@@ -162,9 +166,32 @@
         return handled;
     }
 
+    private void performDestructiveAction(int id, final ActionCompleteListener listener) {
+        Settings settings = mActivity.getSettings();
+        final Collection<Conversation> conversations = mSelectionSet.values();
+        boolean showDialog = false;
+        if (settings != null) {
+            showDialog = (id == R.id.delete) ? settings.confirmDelete : settings.confirmArchive;
+        }
+        if (showDialog) {
+            int resId = id == R.id.delete ? R.plurals.confirm_delete_conversation
+                    : R.plurals.confirm_archive_conversation;
+            CharSequence message = Utils.formatPlural(mContext, resId, conversations.size());
+            new AlertDialog.Builder(mContext).setMessage(message)
+                    .setPositiveButton(R.string.ok, new AlertDialog.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            mListAdapter.delete(conversations, listener);
+                        }
+
+                    }).setNegativeButton(R.string.cancel, null).create().show();
+        } else {
+            mListAdapter.delete(conversations, listener);
+        }
+    }
+
     private void markConversationsRead(boolean read) {
         Collection<Conversation> conversations = mSelectionSet.values();
-        // TODO: Interpret properly (rather than as "mark read")
         Conversation.updateBoolean(mContext, conversations, ConversationColumns.READ, read);
         mSelectionSet.clear();
         // Redraw with changes
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java
index fbd2e86..cd478ef 100644
--- a/src/com/android/mail/compose/ComposeActivity.java
+++ b/src/com/android/mail/compose/ComposeActivity.java
@@ -658,6 +658,9 @@
             case R.id.send:
                 doSend();
                 break;
+            case R.id.discard:
+                doDiscard();
+                break;
             default:
                 handled = false;
                 break;
@@ -1408,6 +1411,12 @@
 
     }
 
+    private void doDiscard() {
+        new AlertDialog.Builder(this).setMessage(R.string.confirm_discard_text)
+                .setPositiveButton(R.string.ok, this)
+                .setNegativeButton(R.string.cancel, null)
+                .create().show();
+    }
     /**
      * Effectively discard the current message.
      *
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 67f066f..76feb78 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -275,6 +275,11 @@
         resetActionBarIcon();
     }
 
+    @Override
+    public Settings getSettings() {
+        return mCachedSettings;
+    }
+
     private void fetchAccountFolderInfo() {
         if (mFetchAccountFolderTask != null) {
             mFetchAccountFolderTask.cancel(true);
diff --git a/src/com/android/mail/ui/ActivityController.java b/src/com/android/mail/ui/ActivityController.java
index baf396b..f4cc093 100644
--- a/src/com/android/mail/ui/ActivityController.java
+++ b/src/com/android/mail/ui/ActivityController.java
@@ -31,6 +31,7 @@
 import com.android.mail.ConversationListContext;
 import com.android.mail.browse.ConversationItemView.StarHandler;
 import com.android.mail.providers.Conversation;
+import com.android.mail.providers.Settings;
 import com.android.mail.ui.ViewMode.ModeChangeListener;
 
 /**
@@ -250,4 +251,10 @@
      * Handle a touch event.
      */
     void onTouchEvent(MotionEvent event);
+
+    /**
+     * Return the settings currently being used by this activity.
+     * @return
+     */
+    Settings getSettings();
 }
diff --git a/src/com/android/mail/ui/FolderSelectionActivity.java b/src/com/android/mail/ui/FolderSelectionActivity.java
index 36f7d7d..f1b7cf5 100644
--- a/src/com/android/mail/ui/FolderSelectionActivity.java
+++ b/src/com/android/mail/ui/FolderSelectionActivity.java
@@ -35,6 +35,7 @@
 import com.android.mail.browse.ConversationItemView.StarHandler;
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Folder;
+import com.android.mail.providers.Settings;
 import com.android.mail.providers.UIProvider;
 import com.android.mail.ui.ViewMode.ModeChangeListener;
 import com.android.mail.utils.LogUtils;
@@ -260,4 +261,9 @@
     public FolderChangeListener getFolderChangeListener() {
         return this;
     }
+
+    @Override
+    public Settings getSettings() {
+        return null;
+    }
 }
diff --git a/src/com/android/mail/ui/MailActivity.java b/src/com/android/mail/ui/MailActivity.java
index 720e522..8cd285f 100644
--- a/src/com/android/mail/ui/MailActivity.java
+++ b/src/com/android/mail/ui/MailActivity.java
@@ -28,6 +28,7 @@
 import android.view.MotionEvent;
 
 import com.android.mail.browse.ConversationItemView.StarHandler;
+import com.android.mail.providers.Settings;
 import com.android.mail.ui.ViewMode.ModeChangeListener;
 import com.android.mail.utils.Utils;
 
@@ -251,4 +252,9 @@
     public FolderChangeListener getFolderChangeListener() {
         return mController;
     }
+
+    @Override
+    public Settings getSettings() {
+        return mController.getSettings();
+    }
 }
diff --git a/src/com/android/mail/ui/RestrictedActivity.java b/src/com/android/mail/ui/RestrictedActivity.java
index b9863e9..7fbedfc 100644
--- a/src/com/android/mail/ui/RestrictedActivity.java
+++ b/src/com/android/mail/ui/RestrictedActivity.java
@@ -32,6 +32,8 @@
 import android.view.View;
 import android.view.Window;
 
+import com.android.mail.providers.Settings;
+
 /**
  * {@link RestrictedActivity} gives access to a subset of {@link Activity} methods. These methods
  * match the signatures from {@link Activity}.
@@ -181,4 +183,10 @@
      * @return the context associated with this activity.
      */
     Context getActivityContext();
+
+    /**
+     * Return the settings currently being used by this activity.
+     * @return
+     */
+    Settings getSettings();
 }