summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMindy Pereira <mindyp@google.com>2012-07-12 16:23:27 -0700
committerMindy Pereira <mindyp@google.com>2012-07-13 08:06:31 -0700
commit06642fab1bf4ab95b5dd97a65b262845cf60c865 (patch)
tree0114285fef0b82f0ff1b28091158e8abe5a1393c
parent76b2062b8c6d18a7b3a05292c385b47b0fcbd09f (diff)
downloadandroid_packages_apps_UnifiedEmail-06642fab1bf4ab95b5dd97a65b262845cf60c865.tar.gz
android_packages_apps_UnifiedEmail-06642fab1bf4ab95b5dd97a65b262845cf60c865.tar.bz2
android_packages_apps_UnifiedEmail-06642fab1bf4ab95b5dd97a65b262845cf60c865.zip
Make swipe remove label when not in inbox.
Change-Id: I80b22ccd04d3c1b27ebd8af7b84dadea127ed4c4
-rw-r--r--src/com/android/mail/browse/ConversationCursor.java28
-rw-r--r--src/com/android/mail/ui/AbstractActivityController.java21
-rw-r--r--src/com/android/mail/ui/ConversationListFragment.java14
-rw-r--r--src/com/android/mail/ui/ConversationUpdater.java5
-rw-r--r--src/com/android/mail/ui/FolderDisplayer.java5
-rw-r--r--src/com/android/mail/ui/FoldersSelectionDialog.java2
-rw-r--r--src/com/android/mail/ui/SwipeableListView.java54
7 files changed, 109 insertions, 20 deletions
diff --git a/src/com/android/mail/browse/ConversationCursor.java b/src/com/android/mail/browse/ConversationCursor.java
index f86a979db..b91964701 100644
--- a/src/com/android/mail/browse/ConversationCursor.java
+++ b/src/com/android/mail/browse/ConversationCursor.java
@@ -1188,6 +1188,7 @@ public final class ConversationCursor implements Cursor {
public static final int REPORT_PHISHING = 7;
public static final int MOSTLY_ARCHIVE = MOSTLY | ARCHIVE;
public static final int MOSTLY_DELETE = MOSTLY | DELETE;
+ public static final int MOSTLY_DESTRUCTIVE_UPDATE = MOSTLY | UPDATE;
private final int mType;
private final Uri mUri;
@@ -1242,9 +1243,17 @@ public final class ConversationCursor implements Cursor {
sProvider.updateLocal(mUri, mValues, ConversationCursor.this);
mRecalibrateRequired = false;
}
- op = ContentProviderOperation.newUpdate(uri)
- .withValues(mValues)
- .build();
+ if (!mMostlyDead) {
+ op = ContentProviderOperation.newUpdate(uri)
+ .withValues(mValues)
+ .build();
+ } else {
+ sProvider.commitMostlyDead(mConversation, ConversationCursor.this);
+ }
+ break;
+ case MOSTLY_DESTRUCTIVE_UPDATE:
+ sProvider.setMostlyDead(mConversation, ConversationCursor.this);
+ op = ContentProviderOperation.newUpdate(uri).withValues(mValues).build();
break;
case INSERT:
sProvider.insertLocal(mUri, mValues);
@@ -1680,6 +1689,19 @@ public final class ConversationCursor implements Cursor {
}
/**
+ * As above, for mostly destructive updates
+ */
+ public int mostlyDestructiveUpdate(Context context, Collection<Conversation> conversations,
+ String columnName, String value) {
+ ContentValues cv = new ContentValues();
+ cv.put(columnName, value);
+ return apply(
+ context,
+ getOperationsForConversations(conversations,
+ ConversationOperation.MOSTLY_DESTRUCTIVE_UPDATE, cv));
+ }
+
+ /**
* Convenience method for performing an operation on a group of conversations
* @param context the caller's context
* @param conversations the conversations to be affected
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index f74f9a358..c595ac5ab 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -1635,8 +1635,8 @@ public abstract class AbstractActivityController implements ActivityController {
// Called from the FolderSelectionDialog after a user is done selecting folders to assign the
// conversations to.
@Override
- public final void assignFolder(
- Collection<Folder> folders, Collection<Conversation> target, boolean batch) {
+ public final void assignFolder(Collection<Folder> folders, Collection<Conversation> target,
+ boolean batch, boolean showUndo) {
// Actions are destructive only when the current folder can be assigned to (which is the
// same as being able to un-assign a conversation from the folder) and when the list of
// folders contains the current folder.
@@ -1650,7 +1650,7 @@ public abstract class AbstractActivityController implements ActivityController {
}
}
final DestructiveAction folderChange = getFolderChange(target, folders, isDestructive,
- batch);
+ batch, showUndo);
// Update the UI elements depending no their visibility and availability
// TODO(viki): Consolidate this into a single method requestDelete.
if (isDestructive) {
@@ -1861,7 +1861,8 @@ public abstract class AbstractActivityController implements ActivityController {
final Collection<Conversation> conversations = mSelectedSet.values();
final Collection<Folder> dropTarget = Folder.listOf(folder);
// Drag and drop is destructive: we remove conversations from the current folder.
- final DestructiveAction action = getFolderChange(conversations, dropTarget, true, true);
+ final DestructiveAction action = getFolderChange(conversations, dropTarget, true, true,
+ true);
delete(conversations, action);
}
@@ -2015,17 +2016,20 @@ public abstract class AbstractActivityController implements ActivityController {
/** Whether this destructive action has already been performed */
private boolean mCompleted;
private boolean mIsSelectedSet;
+ private boolean mShowUndo;
/**
* Create a new folder destruction object to act on the given conversations.
* @param target
*/
private FolderDestruction(final Collection<Conversation> target,
- final Collection<Folder> folders, boolean isDestructive, boolean isBatch) {
+ final Collection<Folder> folders, boolean isDestructive, boolean isBatch,
+ boolean showUndo) {
mTarget = ImmutableList.copyOf(target);
mFolderList.addAll(folders);
mIsDestructive = isDestructive;
mIsSelectedSet = isBatch;
+ mShowUndo = showUndo;
}
@Override
@@ -2033,7 +2037,7 @@ public abstract class AbstractActivityController implements ActivityController {
if (isPerformed()) {
return;
}
- if (mIsDestructive) {
+ if (mIsDestructive && mShowUndo) {
UndoOperation undoOp = new UndoOperation(mTarget.size(), R.id.change_folder);
onUndoAvailable(undoOp);
}
@@ -2061,8 +2065,9 @@ public abstract class AbstractActivityController implements ActivityController {
}
private final DestructiveAction getFolderChange(Collection<Conversation> target,
- Collection<Folder> folders, boolean isDestructive, boolean isBatch){
- final DestructiveAction da = new FolderDestruction(target, folders, isDestructive, isBatch);
+ Collection<Folder> folders, boolean isDestructive, boolean isBatch, boolean showUndo) {
+ final DestructiveAction da = new FolderDestruction(target, folders, isDestructive, isBatch,
+ showUndo);
registerDestructiveAction(da);
return da;
}
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index c30315cbc..bff74e62f 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -213,6 +213,7 @@ public final class ConversationListFragment extends ListFragment implements
null);
mListAdapter.addFooter(mFooterView);
mListView.setAdapter(mListAdapter);
+ mListView.setConversationUpdater(mActivity.getConversationUpdater());
mListView.setSelectionSet(mActivity.getSelectedSet());
mListAdapter.hideFooter();
mActivity.setViewModeListener(this);
@@ -282,9 +283,6 @@ public final class ConversationListFragment extends ListFragment implements
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
mListView.setOnItemLongClickListener(this);
mListView.enableSwipe(mAccount.supportsCapability(UIProvider.AccountCapabilities.UNDO));
- mListView.setSwipeAction(mAccount
- .supportsCapability(UIProvider.AccountCapabilities.ARCHIVE) ? R.id.archive
- : R.id.delete);
// Note - we manually save/restore the listview state.
mListView.setSaveEnabled(false);
@@ -452,6 +450,7 @@ public final class ConversationListFragment extends ListFragment implements
public void onFolderUpdated(Folder folder) {
mFolder = folder;
+ setSwipeAction();
if (mFolder == null) {
return;
}
@@ -482,6 +481,15 @@ public final class ConversationListFragment extends ListFragment implements
}
}
+ private void setSwipeAction() {
+ mListView.setSwipeAction(!mAccount
+ .supportsCapability(UIProvider.AccountCapabilities.ARCHIVE) ?
+ R.id.delete :
+ mFolder != null && mFolder.type == UIProvider.FolderType.INBOX ?
+ R.id.archive : R.id.change_folder);
+ mListView.setCurrentFolder(mFolder);
+ }
+
@Override
public void onSwipeComplete(Collection<Conversation> conversations) {
Context context = getActivity().getApplicationContext();
diff --git a/src/com/android/mail/ui/ConversationUpdater.java b/src/com/android/mail/ui/ConversationUpdater.java
index 45dbf9195..5f6b93f97 100644
--- a/src/com/android/mail/ui/ConversationUpdater.java
+++ b/src/com/android/mail/ui/ConversationUpdater.java
@@ -78,9 +78,10 @@ public interface ConversationUpdater {
* @param folders the folders to assign the conversations to.
* @param target the conversations to act upon.
* @param batch whether this is a batch operation
+ * @param showUndo whether to show the undo bar
*/
- public void assignFolder(
- Collection<Folder> folders, Collection<Conversation> target, boolean batch);
+ public void assignFolder(Collection<Folder> folders, Collection<Conversation> target,
+ boolean batch, boolean showUndo);
/**
* Refreshes the conversation list, if one exists.
diff --git a/src/com/android/mail/ui/FolderDisplayer.java b/src/com/android/mail/ui/FolderDisplayer.java
index 8702c04f0..bd059f20d 100644
--- a/src/com/android/mail/ui/FolderDisplayer.java
+++ b/src/com/android/mail/ui/FolderDisplayer.java
@@ -26,8 +26,8 @@ import android.text.TextUtils;
import com.android.mail.R;
import com.android.mail.providers.Conversation;
import com.android.mail.providers.Folder;
-import com.android.mail.utils.LogUtils;
+import java.util.List;
import java.util.SortedSet;
/**
@@ -59,7 +59,8 @@ public class FolderDisplayer {
public void loadConversationFolders(String foldersString, Folder ignoreFolder) {
mFoldersSortedSet.clear();
- for (Folder f : Folder.forFoldersString(foldersString)) {
+ List<Folder> folders = Folder.forFoldersString(foldersString);
+ for (Folder f : folders) {
// We will sometimes see folders that do not have names yet.
if (TextUtils.isEmpty(f.name) || (ignoreFolder != null && ignoreFolder.equals(f))) {
continue;
diff --git a/src/com/android/mail/ui/FoldersSelectionDialog.java b/src/com/android/mail/ui/FoldersSelectionDialog.java
index 069e847a0..66afbedbe 100644
--- a/src/com/android/mail/ui/FoldersSelectionDialog.java
+++ b/src/com/android/mail/ui/FoldersSelectionDialog.java
@@ -163,7 +163,7 @@ public class FoldersSelectionDialog implements OnClickListener, OnMultiChoiceCli
}
}
if (mUpdater != null) {
- mUpdater.assignFolder(folders, mTarget, mBatch);
+ mUpdater.assignFolder(folders, mTarget, mBatch, true);
}
break;
case DialogInterface.BUTTON_NEGATIVE:
diff --git a/src/com/android/mail/ui/SwipeableListView.java b/src/com/android/mail/ui/SwipeableListView.java
index 1d891ac59..694d00830 100644
--- a/src/com/android/mail/ui/SwipeableListView.java
+++ b/src/com/android/mail/ui/SwipeableListView.java
@@ -21,6 +21,8 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.content.res.Configuration;
+import android.net.Uri;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -31,11 +33,18 @@ import com.android.mail.R;
import com.android.mail.browse.ConversationCursor;
import com.android.mail.browse.ConversationItemView;
import com.android.mail.providers.Conversation;
+import com.android.mail.providers.Folder;
+import com.android.mail.providers.UIProvider.ConversationColumns;
import com.android.mail.ui.SwipeHelper.Callback;
import com.android.mail.utils.LogTag;
+import com.google.common.base.Objects;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
public class SwipeableListView extends ListView implements Callback{
private SwipeHelper mSwipeHelper;
@@ -45,6 +54,8 @@ public class SwipeableListView extends ListView implements Callback{
private ConversationSelectionSet mConvSelectionSet;
private int mSwipeAction;
+ private Folder mFolder;
+ private ConversationUpdater mConversationUpdater;
public SwipeableListView(Context context) {
this(context, null);
@@ -94,6 +105,14 @@ public class SwipeableListView extends ListView implements Callback{
mConvSelectionSet = set;
}
+ public void setCurrentFolder(Folder folder) {
+ mFolder = folder;
+ }
+
+ public void setConversationUpdater(ConversationUpdater updater) {
+ mConversationUpdater = updater;
+ }
+
@Override
public ConversationSelectionSet getSelectionSet() {
return mConvSelectionSet;
@@ -168,9 +187,12 @@ public class SwipeableListView extends ListView implements Callback{
if (conversationViews != null) {
final ArrayList<Conversation> conversations = new ArrayList<Conversation>(
conversationViews.size());
+ Conversation conversation;
for (ConversationItemView view : conversationViews) {
if (view.getConversation().id != target.getConversation().id) {
- conversations.add(view.getConversation());
+ conversation = view.getConversation();
+ conversation.localDeleteOnUpdate = true;
+ conversations.add(conversation);
}
}
undoOp = new UndoOperation(
@@ -184,6 +206,14 @@ public class SwipeableListView extends ListView implements Callback{
case R.id.archive:
cc.archive(context, conversations);
break;
+ case R.id.change_folder:
+ Collection<Folder> folders = getFolders(conversations);
+ cc.updateString(context, conversations,
+ ConversationColumns.FOLDER_LIST, Folder.getUriString(folders));
+ cc.updateString(context, conversations,
+ ConversationColumns.RAW_FOLDERS,
+ Folder.getSerializedFolderString(mFolder, folders));
+ break;
case R.id.delete:
cc.delete(context, conversations);
break;
@@ -198,6 +228,19 @@ public class SwipeableListView extends ListView implements Callback{
}
}
+ private Collection<Folder> getFolders(Collection<Conversation> conversations) {
+ ArrayList<Folder> folders = new ArrayList<Folder>();
+ for (Conversation conversation : conversations) {
+ folders.addAll(Folder.forFoldersString(conversation.rawFolders));
+ }
+ for (Folder folder : folders) {
+ if (Objects.equal(folder.uri, mFolder.uri)) {
+ folders.remove(folder);
+ }
+ }
+ return folders;
+ }
+
private void handleLeaveBehind(ConversationItemView target, UndoOperation undoOp,
Context context) {
Conversation conv = target.getConversation();
@@ -205,6 +248,15 @@ public class SwipeableListView extends ListView implements Callback{
adapter.setupLeaveBehind(conv, undoOp, conv.position);
ConversationCursor cc = (ConversationCursor)adapter.getCursor();
switch (mSwipeAction) {
+ case R.id.change_folder:
+ Collection<Conversation> convs = Conversation.listOf(conv);
+ Collection<Folder> folders = getFolders(convs);
+ cc.mostlyDestructiveUpdate(context, convs,
+ ConversationColumns.FOLDER_LIST, Folder.getUriString(folders));
+ cc.mostlyDestructiveUpdate(context, convs,
+ ConversationColumns.RAW_FOLDERS,
+ Folder.getSerializedFolderString(mFolder, folders));
+ break;
case R.id.archive:
cc.mostlyArchive(context, Conversation.listOf(conv));
break;