15b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar/* 25b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 35b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * 45b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 55b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * you may not use this file except in compliance with the License. 65b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * You may obtain a copy of the License at 75b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * 85b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 95b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * 105b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * Unless required by applicable law or agreed to in writing, software 115b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 125b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * See the License for the specific language governing permissions and 145b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar * limitations under the License. 155b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar */ 165b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 175b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarpackage com.example.android.supportv7.widget.touch; 185b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 195b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.annotation.TargetApi; 205b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.graphics.Canvas; 215b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.os.Build; 22e8e0eae2600001c8b1e9d5a9f0331cf045193746Aurimas Liutikasimport android.support.v4.content.ContextCompat; 235b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.support.v7.widget.RecyclerView; 245b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.support.v7.widget.helper.ItemTouchHelper; 255b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.view.MotionEvent; 265b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.view.View; 275b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarimport android.view.ViewGroup; 285b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 296ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikasimport com.example.android.supportv7.R; 306ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikasimport com.example.android.supportv7.widget.util.ConfigToggle; 316ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas 325b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyarpublic class SwipeToDismissActivity extends ItemTouchHelperActivity { 335b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar boolean mSwipeStartEnabled = true; 345b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar boolean mSwipeEndEnabled = true; 355b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar boolean mPointerSwipeEnabled = true; 365b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar boolean mCustomSwipeEnabled = false; 375b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 385b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 395b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar ConfigToggle[] createConfigToggles() { 405b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar ConfigToggle[] configToggles = { 415b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar new ConfigToggle(this, R.string.swipe_start) { 425b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 435b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean isChecked() { 445b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return mSwipeStartEnabled; 455b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 465b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 475b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 485b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void onChange(boolean newValue) { 495b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar mSwipeStartEnabled = newValue; 505b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 515b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar }, 525b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar new ConfigToggle(this, R.string.swipe_end) { 535b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 545b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean isChecked() { 555b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return mSwipeEndEnabled; 565b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 575b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 585b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 595b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void onChange(boolean newValue) { 605b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar mSwipeEndEnabled = newValue; 615b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 625b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar }, 635b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar new ConfigToggle(this, R.string.pointer_swipe_enabled) { 645b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 655b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean isChecked() { 665b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return mPointerSwipeEnabled; 675b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 685b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 695b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 705b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void onChange(boolean newValue) { 715b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar mPointerSwipeEnabled = newValue; 725b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar mAdapter.notifyDataSetChanged(); 735b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 745b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 755b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar }; 765b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 775b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar ConfigToggle[] copy = new ConfigToggle[configToggles.length + 1]; 785b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar System.arraycopy(configToggles, 0, copy, 0, configToggles.length); 795b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar copy[copy.length - 1] = new ConfigToggle(this, R.string.custom_swipe_enabled) { 805b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 815b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean isChecked() { 825b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return mCustomSwipeEnabled; 835b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 845b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 855b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 865b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void onChange(boolean newValue) { 875b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar mCustomSwipeEnabled = newValue; 885b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 895b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar }; 905b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return copy; 915b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } else { 925b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return configToggles; 935b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 945b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 955b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 965b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 975b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void onBind(ItemTouchViewHolder viewHolder) { 985b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar super.onBind(viewHolder); 995b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar viewHolder.actionButton.setVisibility(mPointerSwipeEnabled ? View.GONE : View.VISIBLE); 1005b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1015b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 1025b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1035b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void clearView(RecyclerView.ViewHolder viewHolder) { 1045b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar super.clearView(viewHolder); 1055b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder; 106e8e0eae2600001c8b1e9d5a9f0331cf045193746Aurimas Liutikas touchVH.cardView.setCardBackgroundColor( 107e8e0eae2600001c8b1e9d5a9f0331cf045193746Aurimas Liutikas ContextCompat.getColor(this, android.R.color.white)); 1085b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar touchVH.overlay.setVisibility(View.GONE); 1095b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1105b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 1115b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1125b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @TargetApi(Build.VERSION_CODES.HONEYCOMB) 1135b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 1145b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder; 1155b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 116e8e0eae2600001c8b1e9d5a9f0331cf045193746Aurimas Liutikas touchVH.cardView.setCardBackgroundColor( 117e8e0eae2600001c8b1e9d5a9f0331cf045193746Aurimas Liutikas ContextCompat.getColor(this, R.color.card_aquatic)); 1185b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar if (mCustomSwipeEnabled) { 1195b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar // hide it 1205b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar touchVH.overlay.setTranslationX(viewHolder.itemView.getWidth()); 1215b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar touchVH.overlay.setVisibility(View.VISIBLE); 1225b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1235b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1245b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar super.onSelectedChanged(viewHolder, actionState); 1255b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1265b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 1275b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1285b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @TargetApi(Build.VERSION_CODES.HONEYCOMB) 1295b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean onChildDraw(Canvas c, RecyclerView recyclerView, 1305b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, 1315b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar boolean isCurrentlyActive) { 1325b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar if (!mCustomSwipeEnabled) { 1335b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return false; 1345b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1355b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder; 1365b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar final float dir = Math.signum(dX); 1375b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar if (dir == 0) { 1385b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar touchVH.overlay.setTranslationX(-touchVH.overlay.getWidth()); 1395b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } else { 1405b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar final float overlayOffset = dX - dir * viewHolder.itemView.getWidth(); 1415b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar touchVH.overlay.setTranslationX(overlayOffset); 1425b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1435b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar float alpha = (float) (.2 + .8 * Math.abs(dX) / viewHolder.itemView.getWidth()); 1445b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar touchVH.overlay.setAlpha(alpha); 1455b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return true; 1465b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1475b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 1485b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1495b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) { 1505b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar final ItemTouchViewHolder vh = super.onCreateViewHolder(parent); 1515b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar vh.actionButton.setText(R.string.swipe); 1525b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar vh.actionButton.setOnTouchListener(new View.OnTouchListener() { 1535b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1545b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean onTouch(View v, MotionEvent event) { 1556ed40c1f86bcb172a1f0f069cde1c571a7781aeeAurimas Liutikas if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 1565b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar mItemTouchHelper.startSwipe(vh); 1575b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1585b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return false; 1595b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1605b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar }); 1615b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return vh; 1625b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1635b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 1645b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1655b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public boolean isPointerSwipeEnabled() { 1665b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return mPointerSwipeEnabled; 1675b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1685b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar 1695b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar @Override 1705b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 1715b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar return mCallback.makeMovementFlags(0, 1725b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar (mSwipeStartEnabled ? ItemTouchHelper.START : 0) | 1735b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar (mSwipeEndEnabled ? ItemTouchHelper.END : 0)); 1745b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar } 1755b611d45d8d84bd604e6ce855f9520499ff89b68Yigit Boyar} 176