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
116
117
118
119
120
121
122
123
124
125
126
127
|
package it.niedermann.nextcloud.deck.remote.helpers.providers;
import android.annotation.SuppressLint;
import java.time.Instant;
import java.util.List;
import it.niedermann.nextcloud.deck.DeckLog;
import it.niedermann.nextcloud.deck.database.DataBaseAdapter;
import it.niedermann.nextcloud.deck.exceptions.HandledServerErrors;
import it.niedermann.nextcloud.deck.model.Board;
import it.niedermann.nextcloud.deck.model.Label;
import it.niedermann.nextcloud.deck.remote.adapters.ServerAdapter;
import it.niedermann.nextcloud.deck.remote.api.ResponseCallback;
public class LabelDataProvider extends AbstractSyncDataProvider<Label> {
private final List<Label> labels;
private final Board board;
public LabelDataProvider(AbstractSyncDataProvider<?> parent, Board board, List<Label> labels) {
super(parent);
this.board = board;
this.labels = labels;
if (this.labels != null && board != null) {
for (Label label : labels) {
label.setBoardId(board.getLocalId());
}
}
}
@Override
public void getAllFromServer(ServerAdapter serverAdapter, long accountId, ResponseCallback<List<Label>> responder, Instant lastSync) {
responder.onResponse(labels);
}
@Override
public Label getSingleFromDB(DataBaseAdapter dataBaseAdapter, long accountId, Label entity) {
return dataBaseAdapter.getLabelByRemoteIdDirectly(accountId, entity.getEntity().getId());
}
@Override
public long createInDB(DataBaseAdapter dataBaseAdapter, long accountId, Label entity) {
Label existing = dataBaseAdapter.getLabelByBoardIdAndTitleDirectly(entity.getBoardId(), entity.getTitle());
if (existing != null) {
entity.setLocalId(existing.getLocalId());
updateInDB(dataBaseAdapter, accountId, entity, false);
return entity.getLocalId();
} else {
return dataBaseAdapter.createLabelDirectly(accountId, entity);
}
}
@Override
public void updateInDB(DataBaseAdapter dataBaseAdapter, long accountId, Label entity, boolean setStatus) {
dataBaseAdapter.updateLabel(entity, setStatus);
}
private ResponseCallback<Label> getLabelUniqueHandler(DataBaseAdapter dataBaseAdapter, Label entitiy, ResponseCallback<Label> responder) {
return new ResponseCallback<>(responder.getAccount()) {
@Override
public void onResponse(Label response) {
responder.onResponse(response);
}
@SuppressLint("MissingSuperCall")
@Override
public void onError(Throwable throwable) {
if (HandledServerErrors.LABELS_TITLE_MUST_BE_UNIQUE == HandledServerErrors.fromThrowable(throwable)) {
DeckLog.log(throwable.getCause().getMessage() + ":", entitiy);
dataBaseAdapter.deleteLabelPhysically(entitiy);
responder.onResponse(entitiy);
} else {
responder.onError(throwable);
}
}
};
}
@Override
public void updateInDB(DataBaseAdapter dataBaseAdapter, long accountId, Label entity) {
updateInDB(dataBaseAdapter, accountId, entity, false);
}
@Override
public void createOnServer(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, long accountId, ResponseCallback<Label> responder, Label entity) {
entity.setBoardId(board.getId());
serverAdapter.createLabel(board.getId(), entity, getLabelUniqueHandler(dataBaseAdapter, entity, responder));
}
@Override
public void deleteInDB(DataBaseAdapter dataBaseAdapter, long accountId, Label label) {
dataBaseAdapter.deleteLabelPhysically(label);
}
@Override
public void deleteOnServer(ServerAdapter serverAdapter, long accountId, ResponseCallback<Void> callback, Label entity, DataBaseAdapter dataBaseAdapter) {
serverAdapter.deleteLabel(board.getId(), entity, callback);
}
@Override
public List<Label> getAllChangedFromDB(DataBaseAdapter dataBaseAdapter, long accountId, Instant lastSync) {
return labels;
}
@Override
public void updateOnServer(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, long accountId, ResponseCallback<Label> callback, Label entity) {
serverAdapter.updateLabel(board.getId(), entity, getLabelUniqueHandler(dataBaseAdapter, entity, callback));
}
@Override
public void handleDeletes(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, long accountId, List<Label> entitiesFromServer) {
List<Label> deletedLabels = findDelta(labels, dataBaseAdapter.getFullBoardByLocalIdDirectly(accountId, board.getLocalId()).getLabels());
for (Label deletedLabel : deletedLabels) {
if (deletedLabel.getId() != null) {
// preserve new, unsynced card.
dataBaseAdapter.deleteLabelPhysically(deletedLabel);
}
}
}
@Override
public Label applyUpdatesFromRemote(Label localEntity, Label remoteEntity, Long accountId) {
remoteEntity.setBoardId(board.getLocalId());
return remoteEntity;
}
}
|