diff options
author | Mindy Pereira <mindyp@google.com> | 2012-07-12 16:23:27 -0700 |
---|---|---|
committer | Mindy Pereira <mindyp@google.com> | 2012-07-13 08:06:31 -0700 |
commit | 06642fab1bf4ab95b5dd97a65b262845cf60c865 (patch) | |
tree | 0114285fef0b82f0ff1b28091158e8abe5a1393c | |
parent | 76b2062b8c6d18a7b3a05292c385b47b0fcbd09f (diff) | |
download | android_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.java | 28 | ||||
-rw-r--r-- | src/com/android/mail/ui/AbstractActivityController.java | 21 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationListFragment.java | 14 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationUpdater.java | 5 | ||||
-rw-r--r-- | src/com/android/mail/ui/FolderDisplayer.java | 5 | ||||
-rw-r--r-- | src/com/android/mail/ui/FoldersSelectionDialog.java | 2 | ||||
-rw-r--r-- | src/com/android/mail/ui/SwipeableListView.java | 54 |
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; |