blob: 0e80295a2972161799a7f9658f9c513dd1d881ac (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
package github.daneren2005.dsub.util;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
import java.util.Queue;
import java.util.ArrayDeque;
import github.daneren2005.dsub.adapter.SectionAdapter;
import github.daneren2005.dsub.fragments.SubsonicFragment;
import github.daneren2005.dsub.service.DownloadFile;
import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.view.SongView;
import github.daneren2005.dsub.view.UpdateView;
public class DownloadFileItemHelperCallback extends ItemTouchHelper.SimpleCallback {
private static final String TAG = DownloadFileItemHelperCallback.class.getSimpleName();
private SubsonicFragment fragment;
private boolean mainList;
private BackgroundTask pendingTask = null;
private Queue pendingOperations = new ArrayDeque();
public DownloadFileItemHelperCallback(SubsonicFragment fragment, boolean mainList) {
super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
this.fragment = fragment;
this.mainList = mainList;
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder fromHolder, RecyclerView.ViewHolder toHolder) {
int from = fromHolder.getAdapterPosition();
int to = toHolder.getAdapterPosition();
getSectionAdapter().moveItem(from, to);
synchronized (pendingOperations) {
pendingOperations.add(new Pair<>(from, to));
updateDownloadService();
}
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
SongView songView = (SongView) ((UpdateView.UpdateViewHolder) viewHolder).getUpdateView();
DownloadFile downloadFile = songView.getDownloadFile();
getSectionAdapter().removeItem(downloadFile);
synchronized (pendingOperations) {
pendingOperations.add(downloadFile);
updateDownloadService();
}
}
public DownloadService getDownloadService() {
return fragment.getDownloadService();
}
public SectionAdapter getSectionAdapter() {
return fragment.getCurrentAdapter();
}
private void updateDownloadService() {
if(pendingTask == null) {
final DownloadService downloadService = getDownloadService();
if(downloadService == null) {
return;
}
pendingTask = new SilentBackgroundTask<Void>(downloadService) {
@Override
protected Void doInBackground() throws Throwable {
boolean running = true;
while(running) {
Object nextOperation = null;
synchronized (pendingOperations) {
if(!pendingOperations.isEmpty()) {
nextOperation = pendingOperations.remove();
}
}
if(nextOperation != null) {
if(nextOperation instanceof Pair) {
Pair<Integer, Integer> swap = (Pair) nextOperation;
downloadService.swap(mainList, swap.getFirst(), swap.getSecond());
} else if(nextOperation instanceof DownloadFile) {
DownloadFile downloadFile = (DownloadFile) nextOperation;
if(mainList) {
downloadService.remove(downloadFile);
} else {
downloadService.removeBackground(downloadFile);
}
}
} else {
running = false;
}
}
synchronized (pendingOperations) {
pendingTask = null;
// Start a task if this is non-empty. Means someone added while we were running operations
if(!pendingOperations.isEmpty()) {
updateDownloadService();
}
}
return null;
}
};
pendingTask.execute();
}
}
}
|