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