use of com.ichi2.libanki.Deck in project AnkiChinaAndroid by ankichinateam.
the class Syncer method getDecks.
/**
* Decks ********************************************************************
*/
private JSONArray getDecks() {
JSONArray result = new JSONArray();
if (mCol.getServer()) {
JSONArray decks = new JSONArray();
for (Deck g : mCol.getDecks().all()) {
if (g.getInt("usn") >= mMinUsn) {
decks.put(g);
}
}
JSONArray dconfs = new JSONArray();
for (DeckConfig g : mCol.getDecks().allConf()) {
if (g.getInt("usn") >= mMinUsn) {
dconfs.put(g);
}
}
result.put(decks);
result.put(dconfs);
} else {
JSONArray decks = new JSONArray();
for (Deck g : mCol.getDecks().all()) {
if (g.getInt("usn") == -1) {
g.put("usn", mMaxUsn);
decks.put(g);
}
}
JSONArray dconfs = new JSONArray();
for (DeckConfig g : mCol.getDecks().allConf()) {
if (g.getInt("usn") == -1) {
g.put("usn", mMaxUsn);
dconfs.put(g);
}
}
mCol.getDecks().save();
result.put(decks);
result.put(dconfs);
}
return result;
}
use of com.ichi2.libanki.Deck in project AnkiChinaAndroid by ankichinateam.
the class AnkiChinaSyncer method saveLatestData.
/**
* 同步结束后将数据写入synclog
*/
@SuppressLint("DefaultLocale")
private void saveLatestData() {
mCol = CollectionHelper.getInstance().getColSafe(AnkiDroidApp.getInstance());
CollectionHelper.getInstance().lockCollection();
mCol.getDb().getDatabase().beginTransaction();
try {
mCol.getDb().execute("delete from synclog");
} catch (Exception e) {
// mCol=CollectionHelper.getInstance().getColSafe(AnkiDroidApp.getInstance());
// mCol.getDb().execute("drop table synclog");
// mCol.getDb().execute("create table if not exists synclog (" + " id integer not null,"
// + " type integer not null," + " mod integer not null" + ")");
e.printStackTrace();
}
List<Deck> newDecks = mCol.getDecks().all();
StringBuilder values = new StringBuilder();
for (Deck item : newDecks) {
if (values.length() != 0) {
values.append(",");
}
values.append("(").append(item.getLong("id")).append(",").append(SYNC_LOG_TYPE_DECKS).append(",").append(item.getLong("mod")).append(")");
}
// db.execute(String.format("insert into synclog values %s",sbDeck.toString()));
List<Model> newModels = mCol.getModels().all();
// StringBuilder sbModel=new StringBuilder();
for (Model item : newModels) {
if (values.length() != 0) {
values.append(",");
}
values.append("(").append(item.getLong("id")).append(",").append(SYNC_LOG_TYPE_MODELS).append(",").append(item.getLong("mod")).append(")");
}
// db.execute(String.format("insert into synclog values %s",sbModel.toString()));
List<DeckConfig> newDConf = mCol.getDecks().allConf();
// StringBuilder sbDConf=new StringBuilder();
for (DeckConfig item : newDConf) {
if (values.length() != 0) {
values.append(",");
}
values.append("(").append(item.getLong("id")).append(",").append(SYNC_LOG_TYPE_DCONF).append(",").append(item.getLong("mod")).append(")");
}
String sql = String.format("insert into synclog values %s", values.toString());
Timber.i("sync to local synclog:%s", sql);
mCol.getDb().execute(sql);
// List<Card> newDConf = mCol.getDecks().allConf();
// for(DeckConfig item:newDConf){
// if(values.length()!=0)values.append(",");
// values.append("(").append(item.getLong("id")).append(",").append(SYNC_LOG_TYPE_DCONF).append(",").append(item.getLong("mod")).append(")");
// }
mCol.getDb().execute(String.format("insert into synclog select cards.id,%d,cards.mod from cards", SYNC_LOG_TYPE_CARD));
mCol.getDb().execute(String.format("insert into synclog select notes.id,%d,notes.mod from notes", SYNC_LOG_TYPE_NOTE));
mCol.getDb().execute(String.format("insert into synclog select revlog.id,%d,revlog.id from revlog", SYNC_LOG_TYPE_REVLOG));
mCol.getDb().getDatabase().setTransactionSuccessful();
mCol.getDb().getDatabase().endTransaction();
// mCol.fixIntegrity(new CollectionTask.ProgressCallback(null, AnkiDroidApp.getAppResources()));
CollectionHelper.getInstance().unlockCollection();
// db.execute(String.format("insert into synclog select revlog.id,%d,revlog.mod from revlog", SYNC_LOG_TYPE_REVLOG));
}
use of com.ichi2.libanki.Deck in project AnkiChinaAndroid by ankichinateam.
the class AnkiChinaSyncer method getChangedColJson.
private <T extends JSONObject> JSONObject getChangedColJson(int type, List<T> newModels) {
List<T> changedModel = new ArrayList<>();
boolean deleted;
Cursor cur = null;
Map<Long, Long> oldModel = new HashMap<>();
JSONObject modelsJson = new JSONObject();
try {
cur = CollectionHelper.getInstance().getColSafe(AnkiDroidApp.getInstance()).getDb().getDatabase().query("SELECT id,mod FROM synclog WHERE type = " + type, null);
while (cur.moveToNext()) {
oldModel.put(cur.getLong(0), cur.getLong(1));
}
} finally {
if (cur != null && !cur.isClosed()) {
cur.close();
}
}
if (oldModel.isEmpty()) {
changedModel.addAll(newModels);
} else {
StringBuilder deletedModelSb = new StringBuilder();
for (Map.Entry<Long, Long> entry : oldModel.entrySet()) {
// System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
deleted = true;
for (T model : newModels) {
if (!changedModel.contains(model) && (oldModel.get(model.getLong("id")) == null || oldModel.get(model.getLong("id")) < model.getLong("mod"))) {
// 新增或修改过的deck
changedModel.add(model);
} else if (model.getLong("id") == entry.getKey()) {
// 未被删除的deck
deleted = false;
}
}
if (deleted) {
if (deletedModelSb.length() != 0) {
deletedModelSb.append(",");
}
deletedModelSb.append(entry.getKey());
}
}
if (deletedModelSb.length() > 0) {
modelsJson.put("delete", new JSONArray(deletedModelSb.toString().split(",")));
// modelsJson.put("delete", strArray2jsonArray(deletedModelSb.toString().split(",")));
}
}
JSONArray changedModelJson = new JSONArray();
for (T item : changedModel) {
changedModelJson.put(item);
}
modelsJson.put("replace", changedModelJson);
return modelsJson;
}
use of com.ichi2.libanki.Deck in project AnkiChinaAndroid by ankichinateam.
the class CustomStudyDialogTest method learnAheadCardsRegressionTest.
@Test
public void learnAheadCardsRegressionTest() {
// #6289 - Regression Test
CustomStudyDialog args = CustomStudyDialog.newInstance(CustomStudyDialog.CUSTOM_STUDY_AHEAD, 1);
FragmentScenario<CustomStudyDialogForTesting> scenario = getDialogScenario(args);
scenario.moveToState(Lifecycle.State.STARTED);
scenario.onFragment(f -> {
MaterialDialog dialog = (MaterialDialog) f.getDialog();
assertThat(dialog, notNullValue());
dialog.getActionButton(DialogAction.POSITIVE).callOnClick();
});
Deck customStudy = getCol().getDecks().current();
assertThat("Custom Study should be dynamic", customStudy.getInt("dyn") == 1);
assertThat("could not find deck: Custom study session", customStudy, notNullValue());
customStudy.remove("id");
customStudy.remove("mod");
customStudy.remove("name");
String expected = "{\"newToday\":[0,0],\"revToday\":[0,0],\"lrnToday\":[0,0],\"timeToday\":[0,0],\"collapsed\":false,\"dyn\":1,\"desc\":\"\",\"usn\":-1,\"delays\":null,\"separate\":true,\"terms\":[[\"deck:\\\"Default\\\" prop:due<=1\",99999,6]],\"resched\":true,\"return\":true}";
assertThat(customStudy.toString(), is(expected));
}
use of com.ichi2.libanki.Deck in project AnkiChinaAndroid by ankichinateam.
the class AbstractSchedTest method ensureUndoCorrectCounts.
@Test
public void ensureUndoCorrectCounts() {
Collection col = getCol();
AbstractSched sched = col.getSched();
Deck deck = col.getDecks().get(1);
DeckConfig dconf = col.getDecks().getConf(1);
dconf.getJSONObject("new").put("perDay", 10);
JSONArray newCount = deck.getJSONArray("newToday");
for (int i = 0; i < 20; i++) {
Note note = col.newNote();
note.setField(0, "a");
col.addNote(note);
}
col.reset();
assertThat(col.cardCount(), is(20));
assertThat(sched.newCount(), is(10));
Card card = sched.getCard();
assertThat(sched.newCount(), is(9));
assertThat(sched.counts(card)[0], is(10));
sched.answerCard(card, sched.getGoodNewButton());
sched.getCard();
nonTaskUndo(col);
card.load();
assertThat(sched.newCount(), is(9));
assertThat(sched.counts(card)[0], is(10));
}
Aggregations