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.support.v4.content.ContextCompat;
20import android.support.v7.widget.RecyclerView;
21import android.support.v7.widget.helper.ItemTouchHelper;
22import android.view.MotionEvent;
23import android.view.View;
24import android.view.ViewGroup;
25
26import com.example.android.supportv7.R;
27import com.example.android.supportv7.widget.util.ConfigToggle;
28
29public class DragAndDropActivity extends ItemTouchHelperActivity {
30
31    boolean mDragUpEnabled = true;
32    boolean mDragDownEnabled = true;
33    boolean mLongPressDragEnabled = true;
34
35    @Override
36    ConfigToggle[] createConfigToggles() {
37        return new ConfigToggle[]{
38                new ConfigToggle(this, R.string.drag_up) {
39                    @Override
40                    public boolean isChecked() {
41                        return mDragUpEnabled;
42                    }
43
44                    @Override
45                    public void onChange(boolean newValue) {
46                        mDragUpEnabled = newValue;
47                    }
48                },
49                new ConfigToggle(this, R.string.drag_down) {
50                    @Override
51                    public boolean isChecked() {
52                        return mDragDownEnabled;
53                    }
54
55                    @Override
56                    public void onChange(boolean newValue) {
57                        mDragDownEnabled = newValue;
58                    }
59                },
60                new ConfigToggle(this, R.string.long_press_drag) {
61                    @Override
62                    public boolean isChecked() {
63                        return mLongPressDragEnabled;
64                    }
65
66                    @Override
67                    public void onChange(boolean newValue) {
68                        mLongPressDragEnabled = newValue;
69                        mAdapter.notifyDataSetChanged();
70                    }
71                }
72        };
73    }
74
75    @Override
76    public boolean isLongPressDragEnabled() {
77        return mLongPressDragEnabled;
78    }
79
80    @Override
81    public void onBind(ItemTouchViewHolder viewHolder) {
82        super.onBind(viewHolder);
83        viewHolder.actionButton.setVisibility(mLongPressDragEnabled ? View.GONE : View.VISIBLE);
84    }
85
86    @Override
87    public void clearView(RecyclerView.ViewHolder viewHolder) {
88        super.clearView(viewHolder);
89        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
90        touchVH.cardView.setCardBackgroundColor(
91                ContextCompat.getColor(this, android.R.color.white));
92        touchVH.overlay.setVisibility(View.GONE);
93    }
94
95    @Override
96    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
97        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
98        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
99            touchVH.cardView.setCardBackgroundColor(
100                    ContextCompat.getColor(this, R.color.card_aquatic));
101        }
102        super.onSelectedChanged(viewHolder, actionState);
103    }
104
105    @Override
106    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
107        final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
108        vh.actionButton.setText(R.string.drag);
109        vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
110            @Override
111            public boolean onTouch(View v, MotionEvent event) {
112                if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
113                    mItemTouchHelper.startDrag(vh);
114                }
115                return false;
116            }
117        });
118        return vh;
119    }
120
121    @Override
122    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
123        return mCallback.makeMovementFlags(
124                (mDragUpEnabled ? ItemTouchHelper.UP : 0) |
125                        (mDragDownEnabled ? ItemTouchHelper.DOWN : 0), 0);
126    }
127}
128