SwipeableListView.java revision 09f1ae9a9f209436c0c6b44a6e76b32b27937a01
1f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira/* 2f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * Copyright (C) 2012 Google Inc. 3f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * Licensed to The Android Open Source Project. 4f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * 5f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 6f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * you may not use this file except in compliance with the License. 7f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * You may obtain a copy of the License at 8f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * 9f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 10f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * 11f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * Unless required by applicable law or agreed to in writing, software 12f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 13f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * See the License for the specific language governing permissions and 15f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira * limitations under the License. 16f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira */ 17f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 18f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereirapackage com.android.mail.ui; 19f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 2007118a01f7183645957010779222b84930f75b4eMindy Pereiraimport android.animation.Animator; 2107118a01f7183645957010779222b84930f75b4eMindy Pereiraimport android.animation.AnimatorListenerAdapter; 22f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport android.content.Context; 23f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereiraimport android.content.res.Configuration; 248db7e407109532557718c6b8064792f2df7a073dMindy Pereiraimport android.net.Uri; 25f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport android.util.AttributeSet; 26f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport android.view.MotionEvent; 27f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport android.view.View; 28f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereiraimport android.view.ViewConfiguration; 29f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport android.widget.ListView; 30f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 31f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport com.android.mail.R; 32bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrookimport com.android.mail.browse.ConversationCursor; 33f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport com.android.mail.browse.ConversationItemView; 34f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport com.android.mail.providers.Conversation; 3506642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereiraimport com.android.mail.providers.Folder; 36f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport com.android.mail.ui.SwipeHelper.Callback; 37b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrookimport com.android.mail.utils.LogTag; 3806642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereiraimport com.google.common.base.Objects; 39f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 40866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereiraimport java.util.ArrayList; 41f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport java.util.Collection; 428db7e407109532557718c6b8064792f2df7a073dMindy Pereiraimport java.util.HashMap; 43f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 4407118a01f7183645957010779222b84930f75b4eMindy Pereirapublic class SwipeableListView extends ListView implements Callback{ 45f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira private SwipeHelper mSwipeHelper; 46ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira private boolean mEnableSwipe = false; 47489dd22c64c718b6953b4bd6acef925e82c53c87Andy Huang 48b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook public static final String LOG_TAG = LogTag.getLogTag(); 49f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 50866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira private ConversationSelectionSet mConvSelectionSet; 516c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira private int mSwipeAction; 5206642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira private Folder mFolder; 53866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 54f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public SwipeableListView(Context context) { 55f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira this(context, null); 56f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 57f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 58f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public SwipeableListView(Context context, AttributeSet attrs) { 59f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira this(context, attrs, -1); 60f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 61f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 62f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public SwipeableListView(Context context, AttributeSet attrs, int defStyle) { 63f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira super(context, attrs, defStyle); 64f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira float densityScale = getResources().getDisplayMetrics().density; 65f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira float pagingTouchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop(); 66866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira float scrollSlop = context.getResources().getInteger(R.integer.swipeScrollSlop); 67cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira float minSwipe = context.getResources().getDimension(R.dimen.min_swipe); 68cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira float minVert = context.getResources().getDimension(R.dimen.min_vert); 69cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira float minLock = context.getResources().getDimension(R.dimen.min_lock); 70f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop, 71cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira scrollSlop, minSwipe, minVert, minLock); 72f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 73f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 74f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira @Override 75f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira protected void onConfigurationChanged(Configuration newConfig) { 76f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira super.onConfigurationChanged(newConfig); 77f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira float densityScale = getResources().getDisplayMetrics().density; 78f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira mSwipeHelper.setDensityScale(densityScale); 79f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); 80f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); 81f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira } 82f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira 83ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira /** 84ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira * Enable swipe gestures. 85ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira */ 86ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira public void enableSwipe(boolean enable) { 87ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira mEnableSwipe = enable; 88ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira } 89ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira 90f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira public boolean isSwipeEnabled() { 91f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira return mEnableSwipe; 92f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira } 93f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira 946c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void setSwipeAction(int action) { 956c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira mSwipeAction = action; 96f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 97f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 98866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira public void setSelectionSet(ConversationSelectionSet set) { 99866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira mConvSelectionSet = set; 100866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 101866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 10206642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira public void setCurrentFolder(Folder folder) { 10306642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira mFolder = folder; 10406642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira } 10506642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira 106866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira @Override 107866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira public ConversationSelectionSet getSelectionSet() { 108866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira return mConvSelectionSet; 109866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 110866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 111f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 112f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public boolean onInterceptTouchEvent(MotionEvent ev) { 113ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira if (mEnableSwipe) { 11419bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return mSwipeHelper.onInterceptTouchEvent(ev) 11519bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira || super.onInterceptTouchEvent(ev); 11619bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } else { 11719bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return super.onInterceptTouchEvent(ev); 11819bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } 119f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 120f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 121f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 122f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public boolean onTouchEvent(MotionEvent ev) { 123ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira if (mEnableSwipe) { 12419bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return mSwipeHelper.onTouchEvent(ev) || super.onTouchEvent(ev); 12519bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } else { 12619bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return super.onTouchEvent(ev); 12719bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } 128f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 129f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 130f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 131f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public View getChildAtPosition(MotionEvent ev) { 132f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira // find the view under the pointer, accounting for GONE views 133f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira final int count = getChildCount(); 134f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira int touchY = (int) ev.getY(); 135f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira int childIdx = 0; 136f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira View slidingChild; 137f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira for (; childIdx < count; childIdx++) { 138f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira slidingChild = getChildAt(childIdx); 139f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira if (slidingChild.getVisibility() == GONE) { 140f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira continue; 141f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 142866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira if (touchY >= slidingChild.getTop() && touchY <= slidingChild.getBottom()) { 143866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira return slidingChild; 144866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 145f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 146f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira return null; 147f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 148f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 149f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 1506c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public boolean canChildBeDismissed(SwipeableItemView v) { 1516c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira View view = v.getView(); 1526c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira return view instanceof ConversationItemView || view instanceof LeaveBehindItem; 153f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 154f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 155f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 1566c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void onChildDismissed(SwipeableItemView v) { 1576c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira View view = v.getView(); 1586c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira if (view instanceof ConversationItemView) { 1596c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira dismissChildren((ConversationItemView) v, null); 1606c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } else if (view instanceof LeaveBehindItem) { 1616c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira ((LeaveBehindItem)view).commit(); 1626c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 163f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 164f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 165f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 1666c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void onChildrenDismissed(SwipeableItemView target, 1676c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira Collection<ConversationItemView> views) { 1686c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira assert(target instanceof ConversationItemView); 1696c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira dismissChildren((ConversationItemView) target.getView(), views); 170866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 171866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 1726c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira private void dismissChildren(final ConversationItemView target, 1736c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final Collection<ConversationItemView> conversationViews) { 1746c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final Context context = getContext(); 1756c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final AnimatedAdapter adapter = ((AnimatedAdapter) getAdapter()); 176d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira final ToastBarOperation undoOp; 1776c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira if (conversationViews != null) { 1786c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final ArrayList<Conversation> conversations = new ArrayList<Conversation>( 1796c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira conversationViews.size()); 18006642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira Conversation conversation; 1816c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira for (ConversationItemView view : conversationViews) { 1826c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira if (view.getConversation().id != target.getConversation().id) { 18306642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira conversation = view.getConversation(); 18406642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira conversation.localDeleteOnUpdate = true; 18506642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira conversations.add(conversation); 1866c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 1876c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 188d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira undoOp = new ToastBarOperation(conversationViews != null ? 189d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira (conversations.size() + 1) : 1, mSwipeAction, ToastBarOperation.UNDO); 1906c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira handleLeaveBehind(target, undoOp, context); 19109a4bfe3f81ee216b5c4a4e2d083432a4e387abdVikram Aggarwal adapter.delete(conversations, new DestructiveAction() { 192bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook @Override 19309a4bfe3f81ee216b5c4a4e2d083432a4e387abdVikram Aggarwal public void performAction() { 1948db7e407109532557718c6b8064792f2df7a073dMindy Pereira ConversationCursor cc = (ConversationCursor) adapter.getCursor(); 1956c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira switch (mSwipeAction) { 1966c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.archive: 197bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook cc.archive(context, conversations); 1986c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 19906642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira case R.id.change_folder: 2008db7e407109532557718c6b8064792f2df7a073dMindy Pereira FolderOperation folderOp = new FolderOperation(mFolder, false); 2018db7e407109532557718c6b8064792f2df7a073dMindy Pereira // For each conversation, for each operation, remove 2028db7e407109532557718c6b8064792f2df7a073dMindy Pereira // the current folder. 2038db7e407109532557718c6b8064792f2df7a073dMindy Pereira for (Conversation target : conversations) { 2048db7e407109532557718c6b8064792f2df7a073dMindy Pereira HashMap<Uri, Folder> targetFolders = Folder 2058db7e407109532557718c6b8064792f2df7a073dMindy Pereira .hashMapForFoldersString(target.rawFolders); 2068db7e407109532557718c6b8064792f2df7a073dMindy Pereira targetFolders.remove(folderOp.mFolder.uri); 2078db7e407109532557718c6b8064792f2df7a073dMindy Pereira target.folderList = Folder.getUriString(targetFolders.values()); 2088db7e407109532557718c6b8064792f2df7a073dMindy Pereira target.rawFolders = Folder.getSerializedFolderString(mFolder, 2098db7e407109532557718c6b8064792f2df7a073dMindy Pereira targetFolders.values()); 2108db7e407109532557718c6b8064792f2df7a073dMindy Pereira cc.updateStrings(context, Conversation.listOf(target), 2118db7e407109532557718c6b8064792f2df7a073dMindy Pereira Conversation.UPDATE_FOLDER_COLUMNS, new String[] { 2128db7e407109532557718c6b8064792f2df7a073dMindy Pereira target.folderList, target.rawFolders 2138db7e407109532557718c6b8064792f2df7a073dMindy Pereira }); 2148db7e407109532557718c6b8064792f2df7a073dMindy Pereira } 21506642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira break; 2166c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.delete: 217bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook cc.delete(context, conversations); 2186c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 2196c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 2206c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 2216c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira }); 2226c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } else { 223d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira undoOp = new ToastBarOperation(1, mSwipeAction, ToastBarOperation.UNDO); 2244cda97978c9f2c4b7e4a645268040223b8dbc83eMindy Pereira target.getConversation().position = target.getParent() != null ? 2254cda97978c9f2c4b7e4a645268040223b8dbc83eMindy Pereira getPositionForView(target) : -1; 2266c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira handleLeaveBehind(target, undoOp, context); 227f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 228866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 229866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 230d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira private void handleLeaveBehind(ConversationItemView target, ToastBarOperation undoOp, 2316c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira Context context) { 2326c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira Conversation conv = target.getConversation(); 2336c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final AnimatedAdapter adapter = ((AnimatedAdapter) getAdapter()); 23409f1ae9a9f209436c0c6b44a6e76b32b27937a01Mindy Pereira if (adapter == null) { 23509f1ae9a9f209436c0c6b44a6e76b32b27937a01Mindy Pereira return; 23609f1ae9a9f209436c0c6b44a6e76b32b27937a01Mindy Pereira } 2376c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira adapter.setupLeaveBehind(conv, undoOp, conv.position); 238bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook ConversationCursor cc = (ConversationCursor)adapter.getCursor(); 2396c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira switch (mSwipeAction) { 24006642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira case R.id.change_folder: 2418db7e407109532557718c6b8064792f2df7a073dMindy Pereira FolderOperation folderOp = new FolderOperation(mFolder, false); 2428db7e407109532557718c6b8064792f2df7a073dMindy Pereira HashMap<Uri, Folder> targetFolders = Folder 2438db7e407109532557718c6b8064792f2df7a073dMindy Pereira .hashMapForFoldersString(conv.rawFolders); 2448db7e407109532557718c6b8064792f2df7a073dMindy Pereira targetFolders.remove(folderOp.mFolder.uri); 2458db7e407109532557718c6b8064792f2df7a073dMindy Pereira conv.folderList = Folder.getUriString(targetFolders.values()); 2468db7e407109532557718c6b8064792f2df7a073dMindy Pereira conv.rawFolders = Folder.getSerializedFolderString(mFolder, targetFolders.values()); 2478db7e407109532557718c6b8064792f2df7a073dMindy Pereira cc.mostlyDestructiveUpdate(context, Conversation.listOf(conv), 2488db7e407109532557718c6b8064792f2df7a073dMindy Pereira Conversation.UPDATE_FOLDER_COLUMNS, new String[] { 2498db7e407109532557718c6b8064792f2df7a073dMindy Pereira conv.folderList, conv.rawFolders 250ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira }); 25106642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira break; 2526c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.archive: 253a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira cc.mostlyArchive(context, Conversation.listOf(conv)); 2546c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 2556c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.delete: 256a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira cc.mostlyDelete(context, Conversation.listOf(conv)); 2576c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 2586c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 2596c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira adapter.notifyDataSetChanged(); 260a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira if (mConvSelectionSet != null && !mConvSelectionSet.isEmpty() 261a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira && mConvSelectionSet.contains(conv)) { 262a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira mConvSelectionSet.toggle(null, conv); 263cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira } 264f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 265f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 266f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 267f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public void onBeginDrag(View v) { 268f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira // We do this so the underlying ScrollView knows that it won't get 269f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira // the chance to intercept events anymore 270f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira requestDisallowInterceptTouchEvent(true); 271f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 272f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 273f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 2746c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void onDragCancelled(SwipeableItemView v) { 275f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 276f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 27707118a01f7183645957010779222b84930f75b4eMindy Pereira /** 27807118a01f7183645957010779222b84930f75b4eMindy Pereira * Archive items using the swipe away animation before shrinking them away. 27907118a01f7183645957010779222b84930f75b4eMindy Pereira */ 28007118a01f7183645957010779222b84930f75b4eMindy Pereira public void archiveItems(ArrayList<ConversationItemView> views, 28109a4bfe3f81ee216b5c4a4e2d083432a4e387abdVikram Aggarwal final DestructiveAction listener) { 28207118a01f7183645957010779222b84930f75b4eMindy Pereira if (views == null || views.size() == 0) { 28307118a01f7183645957010779222b84930f75b4eMindy Pereira return; 28407118a01f7183645957010779222b84930f75b4eMindy Pereira } 28507118a01f7183645957010779222b84930f75b4eMindy Pereira final ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 28607118a01f7183645957010779222b84930f75b4eMindy Pereira for (ConversationItemView view : views) { 28707118a01f7183645957010779222b84930f75b4eMindy Pereira conversations.add(view.getConversation()); 28807118a01f7183645957010779222b84930f75b4eMindy Pereira } 28907118a01f7183645957010779222b84930f75b4eMindy Pereira mSwipeHelper.dismissChildren(views.get(0), views, new AnimatorListenerAdapter() { 29007118a01f7183645957010779222b84930f75b4eMindy Pereira @Override 29107118a01f7183645957010779222b84930f75b4eMindy Pereira public void onAnimationEnd(Animator animation) { 29207118a01f7183645957010779222b84930f75b4eMindy Pereira ((AnimatedAdapter) getAdapter()).delete(conversations, listener); 29307118a01f7183645957010779222b84930f75b4eMindy Pereira } 29407118a01f7183645957010779222b84930f75b4eMindy Pereira }); 29507118a01f7183645957010779222b84930f75b4eMindy Pereira } 29607118a01f7183645957010779222b84930f75b4eMindy Pereira 297f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public interface SwipeCompleteListener { 298f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public void onSwipeComplete(Collection<Conversation> conversations); 299f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 3006c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira}