SwipeableListView.java revision 8937bf1552a86853efc798a4d8df34c01115cdfd
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; 38f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 39866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereiraimport java.util.ArrayList; 40f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereiraimport java.util.Collection; 418db7e407109532557718c6b8064792f2df7a073dMindy Pereiraimport java.util.HashMap; 42f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 438937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereirapublic class SwipeableListView extends ListView implements Callback { 44f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira private SwipeHelper mSwipeHelper; 45ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira private boolean mEnableSwipe = false; 46489dd22c64c718b6953b4bd6acef925e82c53c87Andy Huang 47b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook public static final String LOG_TAG = LogTag.getLogTag(); 48f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 49866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira private ConversationSelectionSet mConvSelectionSet; 506c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira private int mSwipeAction; 5106642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira private Folder mFolder; 52866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 53f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public SwipeableListView(Context context) { 54f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira this(context, null); 55f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 56f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 57f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public SwipeableListView(Context context, AttributeSet attrs) { 58f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira this(context, attrs, -1); 59f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 60f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 61f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public SwipeableListView(Context context, AttributeSet attrs, int defStyle) { 62f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira super(context, attrs, defStyle); 63f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira float densityScale = getResources().getDisplayMetrics().density; 64f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira float pagingTouchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop(); 65866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira float scrollSlop = context.getResources().getInteger(R.integer.swipeScrollSlop); 66cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira float minSwipe = context.getResources().getDimension(R.dimen.min_swipe); 67cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira float minVert = context.getResources().getDimension(R.dimen.min_vert); 68cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira float minLock = context.getResources().getDimension(R.dimen.min_lock); 69f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop, 70cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira scrollSlop, minSwipe, minVert, minLock); 71f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 72f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 73f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira @Override 74f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira protected void onConfigurationChanged(Configuration newConfig) { 75f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira super.onConfigurationChanged(newConfig); 76f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira float densityScale = getResources().getDisplayMetrics().density; 77f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira mSwipeHelper.setDensityScale(densityScale); 78f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); 79f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); 80f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira } 81f913894d3f1fa80b7174477999074b813e1deb12Mindy Pereira 82ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira /** 83ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira * Enable swipe gestures. 84ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira */ 85ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira public void enableSwipe(boolean enable) { 86ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira mEnableSwipe = enable; 87ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira } 88ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira 89f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira public boolean isSwipeEnabled() { 90f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira return mEnableSwipe; 91f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira } 92f07269fdfbc0ca2607dad50bfc15c2c041c1faddMindy Pereira 936c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void setSwipeAction(int action) { 946c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira mSwipeAction = action; 95f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 96f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 97866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira public void setSelectionSet(ConversationSelectionSet set) { 98866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira mConvSelectionSet = set; 99866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 100866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 10106642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira public void setCurrentFolder(Folder folder) { 10206642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira mFolder = folder; 10306642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira } 10406642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira 105866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira @Override 106866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira public ConversationSelectionSet getSelectionSet() { 107866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira return mConvSelectionSet; 108866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 109866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 110f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 111f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public boolean onInterceptTouchEvent(MotionEvent ev) { 112ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira if (mEnableSwipe) { 11319bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return mSwipeHelper.onInterceptTouchEvent(ev) 11419bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira || super.onInterceptTouchEvent(ev); 11519bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } else { 11619bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return super.onInterceptTouchEvent(ev); 11719bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } 118f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 119f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 120f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 121f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public boolean onTouchEvent(MotionEvent ev) { 122ff9aff3c28c4c20c7866ebfaaa642997e324f274Mindy Pereira if (mEnableSwipe) { 12319bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return mSwipeHelper.onTouchEvent(ev) || super.onTouchEvent(ev); 12419bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } else { 12519bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira return super.onTouchEvent(ev); 12619bf5f5a4944f5bb4e62e1f32c47dce87f662cbdMindy Pereira } 127f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 128f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 129f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 130f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public View getChildAtPosition(MotionEvent ev) { 131f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira // find the view under the pointer, accounting for GONE views 132f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira final int count = getChildCount(); 133f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira int touchY = (int) ev.getY(); 134f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira int childIdx = 0; 135f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira View slidingChild; 136f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira for (; childIdx < count; childIdx++) { 137f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira slidingChild = getChildAt(childIdx); 138f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira if (slidingChild.getVisibility() == GONE) { 139f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira continue; 140f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 141866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira if (touchY >= slidingChild.getTop() && touchY <= slidingChild.getBottom()) { 142866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira return slidingChild; 143866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 144f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 145f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira return null; 146f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 147f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 148f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 1496c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public boolean canChildBeDismissed(SwipeableItemView v) { 1506c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira View view = v.getView(); 1516c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira return view instanceof ConversationItemView || view instanceof LeaveBehindItem; 152f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 153f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 154f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 1556c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void onChildDismissed(SwipeableItemView v) { 1566c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira View view = v.getView(); 1576c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira if (view instanceof ConversationItemView) { 1586c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira dismissChildren((ConversationItemView) v, null); 1596c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } else if (view instanceof LeaveBehindItem) { 1606c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira ((LeaveBehindItem)view).commit(); 1616c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 162f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 163f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 1648937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira // Call this whenever a new action is taken; this forces a commit of any 1658937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira // existing destructive actions. 1668937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira public void commitDestructiveActions() { 1678937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira final AnimatedAdapter adapter = ((AnimatedAdapter) getAdapter()); 1688937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira if (adapter != null) { 1698937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira adapter.commitLeaveBehindItems(); 1708937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira } 1718937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira } 1728937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira 173f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 1746c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void onChildrenDismissed(SwipeableItemView target, 1756c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira Collection<ConversationItemView> views) { 1766c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira assert(target instanceof ConversationItemView); 1776c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira dismissChildren((ConversationItemView) target.getView(), views); 178866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 179866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 1806c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira private void dismissChildren(final ConversationItemView target, 1816c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final Collection<ConversationItemView> conversationViews) { 1826c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final Context context = getContext(); 1836c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final AnimatedAdapter adapter = ((AnimatedAdapter) getAdapter()); 184d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira final ToastBarOperation undoOp; 1856c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira if (conversationViews != null) { 1866c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final ArrayList<Conversation> conversations = new ArrayList<Conversation>( 1876c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira conversationViews.size()); 18806642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira Conversation conversation; 1896c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira for (ConversationItemView view : conversationViews) { 1906c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira if (view.getConversation().id != target.getConversation().id) { 19106642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira conversation = view.getConversation(); 19206642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira conversation.localDeleteOnUpdate = true; 19306642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira conversations.add(conversation); 1946c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 1956c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 196d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira undoOp = new ToastBarOperation(conversationViews != null ? 197d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira (conversations.size() + 1) : 1, mSwipeAction, ToastBarOperation.UNDO); 1986c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira handleLeaveBehind(target, undoOp, context); 19909a4bfe3f81ee216b5c4a4e2d083432a4e387abdVikram Aggarwal adapter.delete(conversations, new DestructiveAction() { 200bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook @Override 20109a4bfe3f81ee216b5c4a4e2d083432a4e387abdVikram Aggarwal public void performAction() { 2028db7e407109532557718c6b8064792f2df7a073dMindy Pereira ConversationCursor cc = (ConversationCursor) adapter.getCursor(); 2036c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira switch (mSwipeAction) { 2046c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.archive: 205bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook cc.archive(context, conversations); 2066c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 20706642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira case R.id.change_folder: 2088db7e407109532557718c6b8064792f2df7a073dMindy Pereira FolderOperation folderOp = new FolderOperation(mFolder, false); 2098db7e407109532557718c6b8064792f2df7a073dMindy Pereira // For each conversation, for each operation, remove 2108db7e407109532557718c6b8064792f2df7a073dMindy Pereira // the current folder. 2118db7e407109532557718c6b8064792f2df7a073dMindy Pereira for (Conversation target : conversations) { 2128db7e407109532557718c6b8064792f2df7a073dMindy Pereira HashMap<Uri, Folder> targetFolders = Folder 2138db7e407109532557718c6b8064792f2df7a073dMindy Pereira .hashMapForFoldersString(target.rawFolders); 2148db7e407109532557718c6b8064792f2df7a073dMindy Pereira targetFolders.remove(folderOp.mFolder.uri); 2158db7e407109532557718c6b8064792f2df7a073dMindy Pereira target.folderList = Folder.getUriString(targetFolders.values()); 2168db7e407109532557718c6b8064792f2df7a073dMindy Pereira target.rawFolders = Folder.getSerializedFolderString(mFolder, 2178db7e407109532557718c6b8064792f2df7a073dMindy Pereira targetFolders.values()); 2188db7e407109532557718c6b8064792f2df7a073dMindy Pereira cc.updateStrings(context, Conversation.listOf(target), 2198db7e407109532557718c6b8064792f2df7a073dMindy Pereira Conversation.UPDATE_FOLDER_COLUMNS, new String[] { 2208db7e407109532557718c6b8064792f2df7a073dMindy Pereira target.folderList, target.rawFolders 2218db7e407109532557718c6b8064792f2df7a073dMindy Pereira }); 2228db7e407109532557718c6b8064792f2df7a073dMindy Pereira } 22306642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira break; 2246c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.delete: 225bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook cc.delete(context, conversations); 2266c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 2276c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 2286c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 2296c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira }); 2306c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } else { 231d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira undoOp = new ToastBarOperation(1, mSwipeAction, ToastBarOperation.UNDO); 2324cda97978c9f2c4b7e4a645268040223b8dbc83eMindy Pereira target.getConversation().position = target.getParent() != null ? 2334cda97978c9f2c4b7e4a645268040223b8dbc83eMindy Pereira getPositionForView(target) : -1; 2346c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira handleLeaveBehind(target, undoOp, context); 235f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 236866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira } 237866d319dd23ec8b7b7d5476c65f7f83469d55d2dMindy Pereira 238d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira private void handleLeaveBehind(ConversationItemView target, ToastBarOperation undoOp, 2396c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira Context context) { 2406c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira Conversation conv = target.getConversation(); 2416c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira final AnimatedAdapter adapter = ((AnimatedAdapter) getAdapter()); 24209f1ae9a9f209436c0c6b44a6e76b32b27937a01Mindy Pereira if (adapter == null) { 24309f1ae9a9f209436c0c6b44a6e76b32b27937a01Mindy Pereira return; 24409f1ae9a9f209436c0c6b44a6e76b32b27937a01Mindy Pereira } 2456c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira adapter.setupLeaveBehind(conv, undoOp, conv.position); 246bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook ConversationCursor cc = (ConversationCursor)adapter.getCursor(); 2476c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira switch (mSwipeAction) { 24806642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira case R.id.change_folder: 2498db7e407109532557718c6b8064792f2df7a073dMindy Pereira FolderOperation folderOp = new FolderOperation(mFolder, false); 2508db7e407109532557718c6b8064792f2df7a073dMindy Pereira HashMap<Uri, Folder> targetFolders = Folder 2518db7e407109532557718c6b8064792f2df7a073dMindy Pereira .hashMapForFoldersString(conv.rawFolders); 2528db7e407109532557718c6b8064792f2df7a073dMindy Pereira targetFolders.remove(folderOp.mFolder.uri); 2538db7e407109532557718c6b8064792f2df7a073dMindy Pereira conv.folderList = Folder.getUriString(targetFolders.values()); 2548db7e407109532557718c6b8064792f2df7a073dMindy Pereira conv.rawFolders = Folder.getSerializedFolderString(mFolder, targetFolders.values()); 2558db7e407109532557718c6b8064792f2df7a073dMindy Pereira cc.mostlyDestructiveUpdate(context, Conversation.listOf(conv), 2568db7e407109532557718c6b8064792f2df7a073dMindy Pereira Conversation.UPDATE_FOLDER_COLUMNS, new String[] { 2578db7e407109532557718c6b8064792f2df7a073dMindy Pereira conv.folderList, conv.rawFolders 258ebdfd98264104cb5a6888acd663970b7c0b31382Mindy Pereira }); 25906642fab1bf4ab95b5dd97a65b262845cf60c865Mindy Pereira break; 2606c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.archive: 261a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira cc.mostlyArchive(context, Conversation.listOf(conv)); 2626c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 2636c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira case R.id.delete: 264a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira cc.mostlyDelete(context, Conversation.listOf(conv)); 2656c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira break; 2666c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira } 2676c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira adapter.notifyDataSetChanged(); 268a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira if (mConvSelectionSet != null && !mConvSelectionSet.isEmpty() 269a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira && mConvSelectionSet.contains(conv)) { 270a8ead90ce1e6c66e4ecacdf7cfa25c2cafc9bb3bMindy Pereira mConvSelectionSet.toggle(null, conv); 271cff4a2b2e92258c6c85ed4af15bc13101aa71170Mindy Pereira } 272f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 273f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 274f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 275f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public void onBeginDrag(View v) { 276f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira // We do this so the underlying ScrollView knows that it won't get 277f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira // the chance to intercept events anymore 278f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira requestDisallowInterceptTouchEvent(true); 279f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 280f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 281f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira @Override 2826c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira public void onDragCancelled(SwipeableItemView v) { 283f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 284f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira 28507118a01f7183645957010779222b84930f75b4eMindy Pereira /** 28607118a01f7183645957010779222b84930f75b4eMindy Pereira * Archive items using the swipe away animation before shrinking them away. 28707118a01f7183645957010779222b84930f75b4eMindy Pereira */ 28807118a01f7183645957010779222b84930f75b4eMindy Pereira public void archiveItems(ArrayList<ConversationItemView> views, 28909a4bfe3f81ee216b5c4a4e2d083432a4e387abdVikram Aggarwal final DestructiveAction listener) { 29007118a01f7183645957010779222b84930f75b4eMindy Pereira if (views == null || views.size() == 0) { 29107118a01f7183645957010779222b84930f75b4eMindy Pereira return; 29207118a01f7183645957010779222b84930f75b4eMindy Pereira } 29307118a01f7183645957010779222b84930f75b4eMindy Pereira final ArrayList<Conversation> conversations = new ArrayList<Conversation>(); 29407118a01f7183645957010779222b84930f75b4eMindy Pereira for (ConversationItemView view : views) { 29507118a01f7183645957010779222b84930f75b4eMindy Pereira conversations.add(view.getConversation()); 29607118a01f7183645957010779222b84930f75b4eMindy Pereira } 29707118a01f7183645957010779222b84930f75b4eMindy Pereira mSwipeHelper.dismissChildren(views.get(0), views, new AnimatorListenerAdapter() { 29807118a01f7183645957010779222b84930f75b4eMindy Pereira @Override 29907118a01f7183645957010779222b84930f75b4eMindy Pereira public void onAnimationEnd(Animator animation) { 30007118a01f7183645957010779222b84930f75b4eMindy Pereira ((AnimatedAdapter) getAdapter()).delete(conversations, listener); 30107118a01f7183645957010779222b84930f75b4eMindy Pereira } 30207118a01f7183645957010779222b84930f75b4eMindy Pereira }); 30307118a01f7183645957010779222b84930f75b4eMindy Pereira } 30407118a01f7183645957010779222b84930f75b4eMindy Pereira 305f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public interface SwipeCompleteListener { 306f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira public void onSwipeComplete(Collection<Conversation> conversations); 307f6a6b50c6b45f36b9317e1688f8b87310a67b037Mindy Pereira } 3088937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira 3098937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira @Override 3108937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira public boolean performItemClick(View view, int pos, long id) { 3118937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira // Commit any existing destructive actions when the user selects a conversation to view. 3128937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira commitDestructiveActions(); 3138937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira return super.performItemClick(view, pos, id); 3148937bf1552a86853efc798a4d8df34c01115cdfdMindy Pereira } 3156c72a787b58a0bc3afcb71093eddf8c29d1cf5edMindy Pereira}