4 * Authors: Nathaniel McCallum <npmccallum@redhat.com>
6 * Copyright (C) 2013 Nathaniel McCallum, Red Hat
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
21 package org.fedorahosted.freeotp.adapters;
23 import java.util.WeakHashMap;
25 import android.content.ClipData;
26 import android.view.DragEvent;
27 import android.view.View;
28 import android.view.View.DragShadowBuilder;
29 import android.view.ViewParent;
31 public abstract class ReorderableBaseAdapter extends BaseAdapter {
32 private final WeakHashMap<View, Integer> mPositions = new WeakHashMap<View, Integer>();
33 private class Reference<T> {
34 public Reference(T t) { reference = t; }
39 public void notifyDataSetChanged() {
41 super.notifyDataSetChanged();
45 public void notifyDataSetInvalidated() {
47 super.notifyDataSetInvalidated();
51 protected void bindView(View view, int position) {
52 mPositions.put(view, position);
56 protected void processView(View view, int type) {
57 view.setOnDragListener(new View.OnDragListener() {
59 public boolean onDrag(View dstView, DragEvent event) {
60 Reference<View> ref = (Reference<View>) event.getLocalState();
61 final View srcView = ref.reference;
63 switch (event.getAction()) {
64 case DragEvent.ACTION_DRAG_ENTERED:
65 srcView.setVisibility(View.VISIBLE);
66 dstView.setVisibility(View.INVISIBLE);
68 Integer src = mPositions.get(srcView);
69 Integer dst = mPositions.get(dstView);
70 if (src != null && dst != null)
73 ref.reference = dstView;
76 case DragEvent.ACTION_DRAG_ENDED:
77 srcView.post(new Runnable() {
80 srcView.setVisibility(View.VISIBLE);
90 view.setOnLongClickListener(new View.OnLongClickListener() {
92 public boolean onLongClick(final View view) {
93 // Force a reset of any states
94 notifyDataSetChanged();
96 // Start the drag on the main loop to allow
97 // the above state reset to settle.
98 view.post(new Runnable() {
101 ClipData data = ClipData.newPlainText("", "");
102 DragShadowBuilder sb = new View.DragShadowBuilder(view);
103 view.startDrag(data, sb, new Reference<View>(view), 0);
112 protected int getPositionFromView(View view) {
114 Integer position = mPositions.get(view);
115 if (position != null)
118 ViewParent vp = view.getParent();
119 if (vp == null || !(vp instanceof View))
128 public abstract void move(int fromPosition, int toPosition);