SwipeToDismissActivity.java revision e8e0eae2600001c8b1e9d5a9f0331cf045193746
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 com.example.android.supportv7.R;
20import com.example.android.supportv7.widget.util.ConfigToggle;
21
22import android.annotation.TargetApi;
23import android.graphics.Canvas;
24import android.os.Build;
25import android.support.v4.content.ContextCompat;
26import android.support.v4.view.MotionEventCompat;
27import android.support.v7.widget.RecyclerView;
28import android.support.v7.widget.helper.ItemTouchHelper;
29import android.view.MotionEvent;
30import android.view.View;
31import android.view.ViewGroup;
32
33public class SwipeToDismissActivity extends ItemTouchHelperActivity {
34    boolean mSwipeStartEnabled = true;
35    boolean mSwipeEndEnabled = true;
36    boolean mPointerSwipeEnabled = true;
37    boolean mCustomSwipeEnabled = false;
38
39    @Override
40    ConfigToggle[] createConfigToggles() {
41        ConfigToggle[] configToggles = {
42                new ConfigToggle(this, R.string.swipe_start) {
43                    @Override
44                    public boolean isChecked() {
45                        return mSwipeStartEnabled;
46                    }
47
48                    @Override
49                    public void onChange(boolean newValue) {
50                        mSwipeStartEnabled = newValue;
51                    }
52                },
53                new ConfigToggle(this, R.string.swipe_end) {
54                    @Override
55                    public boolean isChecked() {
56                        return mSwipeEndEnabled;
57                    }
58
59                    @Override
60                    public void onChange(boolean newValue) {
61                        mSwipeEndEnabled = newValue;
62                    }
63                },
64                new ConfigToggle(this, R.string.pointer_swipe_enabled) {
65                    @Override
66                    public boolean isChecked() {
67                        return mPointerSwipeEnabled;
68                    }
69
70                    @Override
71                    public void onChange(boolean newValue) {
72                        mPointerSwipeEnabled = newValue;
73                        mAdapter.notifyDataSetChanged();
74                    }
75                }
76        };
77        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
78            ConfigToggle[] copy = new ConfigToggle[configToggles.length + 1];
79            System.arraycopy(configToggles, 0, copy, 0, configToggles.length);
80            copy[copy.length - 1] = new ConfigToggle(this, R.string.custom_swipe_enabled) {
81                @Override
82                public boolean isChecked() {
83                    return mCustomSwipeEnabled;
84                }
85
86                @Override
87                public void onChange(boolean newValue) {
88                    mCustomSwipeEnabled = newValue;
89                }
90            };
91            return copy;
92        } else {
93            return configToggles;
94        }
95    }
96
97    @Override
98    public void onBind(ItemTouchViewHolder viewHolder) {
99        super.onBind(viewHolder);
100        viewHolder.actionButton.setVisibility(mPointerSwipeEnabled ? View.GONE : View.VISIBLE);
101    }
102
103    @Override
104    public void clearView(RecyclerView.ViewHolder viewHolder) {
105        super.clearView(viewHolder);
106        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
107        touchVH.cardView.setCardBackgroundColor(
108                ContextCompat.getColor(this, android.R.color.white));
109        touchVH.overlay.setVisibility(View.GONE);
110    }
111
112    @Override
113    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
114    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
115        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
116        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
117            touchVH.cardView.setCardBackgroundColor(
118                    ContextCompat.getColor(this, R.color.card_aquatic));
119            if (mCustomSwipeEnabled) {
120                // hide it
121                touchVH.overlay.setTranslationX(viewHolder.itemView.getWidth());
122                touchVH.overlay.setVisibility(View.VISIBLE);
123            }
124        }
125        super.onSelectedChanged(viewHolder, actionState);
126    }
127
128    @Override
129    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
130    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
131            RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
132            boolean isCurrentlyActive) {
133        if (!mCustomSwipeEnabled) {
134            return false;
135        }
136        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
137        final float dir = Math.signum(dX);
138        if (dir == 0) {
139            touchVH.overlay.setTranslationX(-touchVH.overlay.getWidth());
140        } else {
141            final float overlayOffset = dX - dir * viewHolder.itemView.getWidth();
142            touchVH.overlay.setTranslationX(overlayOffset);
143        }
144        float alpha = (float) (.2 + .8 * Math.abs(dX) / viewHolder.itemView.getWidth());
145        touchVH.overlay.setAlpha(alpha);
146        return true;
147    }
148
149    @Override
150    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
151        final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
152        vh.actionButton.setText(R.string.swipe);
153        vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
154            @Override
155            public boolean onTouch(View v, MotionEvent event) {
156                if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
157                    mItemTouchHelper.startSwipe(vh);
158                }
159                return false;
160            }
161        });
162        return vh;
163    }
164
165    @Override
166    public boolean isPointerSwipeEnabled() {
167        return mPointerSwipeEnabled;
168    }
169
170    @Override
171    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
172        return mCallback.makeMovementFlags(0,
173                (mSwipeStartEnabled ? ItemTouchHelper.START : 0) |
174                        (mSwipeEndEnabled ? ItemTouchHelper.END : 0));
175    }
176}
177