Add a confirmation dialog to empty trash/spam.

Fixes b/8753294. Creates a new EmptyFolderDialogFragment
that displays the dialog, handles orientation changes, and
calls back to AbstractActivityController when delete is selected
to perform the mass deletion. Additionally, we now only show
the empty overflow options if there are conversations in the
folder.

Change-Id: Ibc9ff0b9511a4cdc4c390cd7273706abedb8d9a2
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 87a10af..7b6f05e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -881,10 +881,22 @@
     <string name="checking_for_mail">Checking for mail</string>
 
     <!-- Conversation list screen overflow menu in trash folder [CHAR LIMIT=50]  -->
-    <string name="empty_trash">Empty trash</string>
+    <string name="empty_trash">Empty Trash</string>
 
     <!-- Conversation list screen overflow menu in spam folder [CHAR LIMIT=50]  -->
-    <string name="empty_spam">Empty spam</string>
+    <string name="empty_spam">Empty Spam</string>
+
+    <!-- Dialog title for empty trash confirmation dialog [CHAR LIMIT=100] -->
+    <string name="empty_trash_dialog_title">Empty Trash?</string>
+
+    <!-- Dialog title for empty spam confirmation dialog [CHAR LIMIT=100] -->
+    <string name="empty_spam_dialog_title">Empty Spam?</string>
+
+    <!-- Dialog message for empty folder confirmation dialog [CHAR LIMIT=300] -->
+    <plurals name="empty_folder_dialog_message">
+        <item quantity="one">This <xliff:g id="count">%1$d</xliff:g> message will be permanently deleted.</item>
+        <item quantity="other">These <xliff:g id="count">%1$d</xliff:g> messages will be permanently deleted.</item>
+    </plurals>
 
     <!-- Strings used for accessibility for the items that toggles the drawer action  -->
     <string name="drawer_open">Open navigation drawer</string>
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index ea2e82e..e620559 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -126,7 +126,8 @@
  * In the Gmail codebase, this was called BaseActivityController
  * </p>
  */
-public abstract class AbstractActivityController implements ActivityController {
+public abstract class AbstractActivityController implements ActivityController,
+        EmptyFolderDialogFragment.EmptyFolderDialogFragmentListener {
     // Keys for serialization of various information in Bundles.
     /** Tag for {@link #mAccount} */
     private static final String SAVED_ACCOUNT = "saved-account";
@@ -1108,8 +1109,10 @@
                 }
                 break;
             case R.id.empty_trash:
+                showEmptyDialog();
+                break;
             case R.id.empty_spam:
-                emptyFolder();
+                showEmptyDialog();
                 break;
             default:
                 handled = false;
@@ -1118,12 +1121,42 @@
         return handled;
     }
 
+    /**
+     * Opens an {@link EmptyFolderDialogFragment} for the current folder.
+     */
+    private void showEmptyDialog() {
+        if (mFolder != null) {
+            final EmptyFolderDialogFragment fragment =
+                    EmptyFolderDialogFragment.newInstance(mFolder.totalCount, mFolder.type);
+            fragment.setListener(this);
+            fragment.show(mActivity.getFragmentManager(), EmptyFolderDialogFragment.FRAGMENT_TAG);
+        }
+    }
+
+    @Override
+    public void onFolderEmptied() {
+        emptyFolder();
+    }
+
+    /**
+     * Performs the work of emptying the currently visible folder.
+     */
     private void emptyFolder() {
         if (mConversationListCursor != null) {
             mConversationListCursor.emptyFolder();
         }
     }
 
+    private void attachEmptyFolderDialogFragmentListener() {
+        final EmptyFolderDialogFragment fragment =
+                (EmptyFolderDialogFragment) mActivity.getFragmentManager()
+                        .findFragmentByTag(EmptyFolderDialogFragment.FRAGMENT_TAG);
+
+        if (fragment != null) {
+            fragment.setListener(this);
+        }
+    }
+
     /**
      * Stand-in method overriden in OnePaneController for toggling the state
      * of the drawer.
@@ -1603,6 +1636,8 @@
         disableNotifications();
 
         mSafeToModifyFragments = true;
+
+        attachEmptyFolderDialogFragmentListener();
     }
 
     @Override
diff --git a/src/com/android/mail/ui/EmptyFolderDialogFragment.java b/src/com/android/mail/ui/EmptyFolderDialogFragment.java
new file mode 100644
index 0000000..64b1da5
--- /dev/null
+++ b/src/com/android/mail/ui/EmptyFolderDialogFragment.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Licensed to The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mail.ui;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.android.mail.R;
+import com.android.mail.providers.Folder;
+import com.android.mail.providers.UIProvider;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * A confirmation dialog for emptying folders of all contents.
+ * Currently used to empty trash or spam.
+ */
+public class EmptyFolderDialogFragment extends DialogFragment {
+
+    public interface EmptyFolderDialogFragmentListener {
+
+        /**
+         * Called when the folder is emptied by the DialogFragment.
+         */
+        void onFolderEmptied();
+    }
+
+    public static final String FRAGMENT_TAG = "EmptyFolderDialogFragment";
+
+    private static final String ARG_NUM_CONVERSATIONS = "numConversations";
+    private static final String ARG_FOLDER_TYPE = "folderType";
+
+    private WeakReference<EmptyFolderDialogFragmentListener> mListener = null;
+
+    private int mNumConversations;
+    private int mFolderType;
+
+    /**
+     * Creates a new instance of {@link EmptyFolderDialogFragment}.
+     * @param numConversations The number of conversations to display in the dialog.
+     * @param folderType The type of dialog to show. The current available options are
+     *                   {@link com.android.mail.providers.UIProvider.FolderType#TRASH} and
+     *                   {@link com.android.mail.providers.UIProvider.FolderType#SPAM}.
+     * @return The newly created {@link EmptyFolderDialogFragment}.
+     */
+    public static EmptyFolderDialogFragment newInstance(
+            final int numConversations, final int folderType) {
+        final EmptyFolderDialogFragment fragment =
+                new EmptyFolderDialogFragment();
+
+        final Bundle args = new Bundle(2);
+        args.putInt(ARG_NUM_CONVERSATIONS, numConversations);
+        args.putInt(ARG_FOLDER_TYPE, folderType);
+        fragment.setArguments(args);
+
+        return fragment;
+    }
+
+    @Override
+    public Dialog onCreateDialog(final Bundle savedInstanceState) {
+        mNumConversations = getArguments().getInt(ARG_NUM_CONVERSATIONS);
+        mFolderType = getArguments().getInt(ARG_FOLDER_TYPE);
+
+        final String dialogMessage = getResources().getQuantityString(
+                R.plurals.empty_folder_dialog_message, mNumConversations, mNumConversations);
+
+        // Checks if we're in the spam folder, otherwise just uses trash as the default.
+        final int dialogTitleId = Folder.isType(mFolderType, UIProvider.FolderType.SPAM) ?
+                R.string.empty_spam_dialog_title : R.string.empty_trash_dialog_title;
+
+        return new AlertDialog.Builder(getActivity()).setTitle(dialogTitleId)
+                .setMessage(dialogMessage)
+                .setNegativeButton(R.string.cancel, null)
+                .setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(final DialogInterface dialog, final int whichButton) {
+                        if (mListener != null) {
+                            final EmptyFolderDialogFragmentListener listener =
+                                    mListener.get();
+                            if (listener != null) {
+                                listener.onFolderEmptied();
+                            }
+                        }
+                    }
+                })
+                .create();
+    }
+
+    public void setListener(final EmptyFolderDialogFragmentListener listener) {
+        mListener = new WeakReference<EmptyFolderDialogFragmentListener>(listener);
+    }
+}
diff --git a/src/com/android/mail/ui/MailActionBarView.java b/src/com/android/mail/ui/MailActionBarView.java
index 272e129..5afa6ca 100644
--- a/src/com/android/mail/ui/MailActionBarView.java
+++ b/src/com/android/mail/ui/MailActionBarView.java
@@ -412,12 +412,12 @@
         if (mEmptyTrashItem != null) {
             mEmptyTrashItem.setVisible(mAccount != null && mFolder != null
                     && mAccount.supportsCapability(AccountCapabilities.EMPTY_TRASH)
-                    && mFolder.isTrash());
+                    && mFolder.isTrash() && mFolder.totalCount > 0);
         }
         if (mEmptySpamItem != null) {
             mEmptySpamItem.setVisible(mAccount != null && mFolder != null
                     && mAccount.supportsCapability(AccountCapabilities.EMPTY_SPAM)
-                    && mFolder.isType(FolderType.SPAM));
+                    && mFolder.isType(FolderType.SPAM) && mFolder.totalCount > 0);
         }
 
         switch (mMode) {