1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.example.android.supportv7.widget.touch;
18
19import android.graphics.Canvas;
20import android.view.MotionEvent;
21import android.view.View;
22import android.view.ViewGroup;
23
24import androidx.core.content.ContextCompat;
25import androidx.recyclerview.widget.ItemTouchHelper;
26import androidx.recyclerview.widget.RecyclerView;
27
28import com.example.android.supportv7.R;
29import com.example.android.supportv7.widget.util.ConfigToggle;
30
31public class SwipeToDismissActivity extends ItemTouchHelperActivity {
32    boolean mSwipeStartEnabled = true;
33    boolean mSwipeEndEnabled = true;
34    boolean mPointerSwipeEnabled = true;
35    boolean mCustomSwipeEnabled = false;
36
37    @Override
38    ConfigToggle[] createConfigToggles() {
39        ConfigToggle[] configToggles = {
40                new ConfigToggle(this, R.string.swipe_start) {
41                    @Override
42                    public boolean isChecked() {
43                        return mSwipeStartEnabled;
44                    }
45
46                    @Override
47                    public void onChange(boolean newValue) {
48                        mSwipeStartEnabled = newValue;
49                    }
50                },
51                new ConfigToggle(this, R.string.swipe_end) {
52                    @Override
53                    public boolean isChecked() {
54                        return mSwipeEndEnabled;
55                    }
56
57                    @Override
58                    public void onChange(boolean newValue) {
59                        mSwipeEndEnabled = newValue;
60                    }
61                },
62                new ConfigToggle(this, R.string.pointer_swipe_enabled) {
63                    @Override
64                    public boolean isChecked() {
65                        return mPointerSwipeEnabled;
66                    }
67
68                    @Override
69                    public void onChange(boolean newValue) {
70                        mPointerSwipeEnabled = newValue;
71                        mAdapter.notifyDataSetChanged();
72                    }
73                }
74        };
75        ConfigToggle[] copy = new ConfigToggle[configToggles.length + 1];
76        System.arraycopy(configToggles, 0, copy, 0, configToggles.length);
77        copy[copy.length - 1] = new ConfigToggle(this, R.string.custom_swipe_enabled) {
78            @Override
79            public boolean isChecked() {
80                return mCustomSwipeEnabled;
81            }
82
83            @Override
84            public void onChange(boolean newValue) {
85                mCustomSwipeEnabled = newValue;
86            }
87        };
88        return copy;
89    }
90
91    @Override
92    public void onBind(ItemTouchViewHolder viewHolder) {
93        super.onBind(viewHolder);
94        viewHolder.actionButton.setVisibility(mPointerSwipeEnabled ? View.GONE : View.VISIBLE);
95    }
96
97    @Override
98    public void clearView(RecyclerView.ViewHolder viewHolder) {
99        super.clearView(viewHolder);
100        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
101        touchVH.cardView.setCardBackgroundColor(
102                ContextCompat.getColor(this, android.R.color.white));
103        touchVH.overlay.setVisibility(View.GONE);
104    }
105
106    @Override
107    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
108        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
109        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
110            touchVH.cardView.setCardBackgroundColor(
111                    ContextCompat.getColor(this, R.color.card_aquatic));
112            if (mCustomSwipeEnabled) {
113                // hide it
114                touchVH.overlay.setTranslationX(viewHolder.itemView.getWidth());
115                touchVH.overlay.setVisibility(View.VISIBLE);
116            }
117        }
118        super.onSelectedChanged(viewHolder, actionState);
119    }
120
121    @Override
122    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
123            RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
124            boolean isCurrentlyActive) {
125        if (!mCustomSwipeEnabled) {
126            return false;
127        }
128        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
129        final float dir = Math.signum(dX);
130        if (dir == 0) {
131            touchVH.overlay.setTranslationX(-touchVH.overlay.getWidth());
132        } else {
133            final float overlayOffset = dX - dir * viewHolder.itemView.getWidth();
134            touchVH.overlay.setTranslationX(overlayOffset);
135        }
136        float alpha = (float) (.2 + .8 * Math.abs(dX) / viewHolder.itemView.getWidth());
137        touchVH.overlay.setAlpha(alpha);
138        return true;
139    }
140
141    @Override
142    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
143        final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
144        vh.actionButton.setText(R.string.swipe);
145        vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
146            @Override
147            public boolean onTouch(View v, MotionEvent event) {
148                if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
149                    mItemTouchHelper.startSwipe(vh);
150                }
151                return false;
152            }
153        });
154        return vh;
155    }
156
157    @Override
158    public boolean isPointerSwipeEnabled() {
159        return mPointerSwipeEnabled;
160    }
161
162    @Override
163    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
164        return mCallback.makeMovementFlags(0,
165                (mSwipeStartEnabled ? ItemTouchHelper.START : 0) |
166                        (mSwipeEndEnabled ? ItemTouchHelper.END : 0));
167    }
168}
169