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