package org.wikipedia.readinglist.database;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import org.wikipedia.R;
import org.wikipedia.WikipediaApp;
import org.wikipedia.database.DatabaseTable;
import org.wikipedia.database.column.Column;
import org.wikipedia.database.contract.ReadingListContract;
import org.wikipedia.database.contract.SavedPageContract;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.page.PageTitle;
import org.wikipedia.readinglist.ReadingList;
import org.wikipedia.readinglist.page.ReadingListPage;
import org.wikipedia.readinglist.page.database.ReadingListDaoProxy;
import org.wikipedia.savedpages.SavedPage;
import java.util.ArrayList;
import java.util.List;
public class ReadingListTable extends DatabaseTable<ReadingListRow> {
private static final int DB_VER_INTRODUCED = 13;
private static final int DB_VER_SAVED_PAGES_MIGRATED = 14;
public ReadingListTable() {
super(ReadingListContract.TABLE, ReadingListContract.List.URI);
}
@Override public ReadingListRow fromCursor(@NonNull Cursor cursor) {
return ReadingListRow
.builder()
.key(ReadingListContract.List.KEY.val(cursor))
.title(ReadingListContract.List.TITLE.val(cursor))
.mtime(ReadingListContract.List.MTIME.val(cursor))
.atime(ReadingListContract.List.ATIME.val(cursor))
.description(ReadingListContract.List.DESCRIPTION.val(cursor))
.build();
}
@NonNull @Override public Column<?>[] getColumnsAdded(int version) {
switch (version) {
case DB_VER_INTRODUCED:
List<Column<?>> cols = new ArrayList<>();
cols.add(ReadingListContract.List.ID);
cols.add(ReadingListContract.List.KEY);
cols.add(ReadingListContract.List.TITLE);
cols.add(ReadingListContract.List.MTIME);
cols.add(ReadingListContract.List.ATIME);
cols.add(ReadingListContract.List.DESCRIPTION);
return cols.toArray(new Column<?>[cols.size()]);
default:
return super.getColumnsAdded(version);
}
}
@Override
public void upgradeSchema(@NonNull SQLiteDatabase db, int fromVersion, int toVersion) {
super.upgradeSchema(db, fromVersion, toVersion);
if (toVersion == DB_VER_SAVED_PAGES_MIGRATED) {
migrateSavedPages(db);
}
}
@Override protected ContentValues toContentValues(@NonNull ReadingListRow row) {
ContentValues contentValues = new ContentValues();
contentValues.put(ReadingListContract.List.KEY.getName(), row.key());
contentValues.put(ReadingListContract.List.TITLE.getName(), row.getTitle());
contentValues.put(ReadingListContract.List.MTIME.getName(), row.mtime());
contentValues.put(ReadingListContract.List.ATIME.getName(), row.atime());
contentValues.put(ReadingListContract.List.DESCRIPTION.getName(), row.getDescription());
return contentValues;
}
@Override protected String getPrimaryKeySelection(@NonNull ReadingListRow row,
@NonNull String[] selectionArgs) {
return super.getPrimaryKeySelection(row, ReadingListContract.List.SELECTION);
}
@Override protected String[] getUnfilteredPrimaryKeySelectionArgs(@NonNull ReadingListRow row) {
return new String[] {row.key()};
}
@Override protected int getDBVersionIntroducedAt() {
return DB_VER_INTRODUCED;
}
private void migrateSavedPages(@NonNull SQLiteDatabase db) {
Cursor cursor = SavedPage.DATABASE_TABLE.queryAll(db);
try {
if (cursor.getCount() == 0) {
return;
}
String readingListTitle = WikipediaApp.getInstance().getString(R.string.nav_item_saved_pages);
long now = System.currentTimeMillis();
final ReadingList list = ReadingList
.builder()
.key(ReadingListDaoProxy.listKey(readingListTitle))
.title(readingListTitle)
.mtime(now)
.atime(now)
.description(null)
.pages(new ArrayList<ReadingListPage>())
.build();
while (cursor.moveToNext()) {
String title = SavedPageContract.Col.TITLE.val(cursor);
String authority = SavedPageContract.Col.SITE.val(cursor);
String lang = SavedPageContract.Col.LANG.val(cursor);
String namespace = SavedPageContract.Col.NAMESPACE.val(cursor);
WikiSite wiki = new WikiSite(authority, lang);
PageTitle pageTitle = new PageTitle(namespace, title, null, null, wiki);
list.add(ReadingListDaoProxy.page(list, pageTitle));
}
WikipediaApp.getInstance().runOnMainThread(new Runnable() {
@Override
public void run() {
ReadingList.DAO.addList(list);
}
});
} finally {
cursor.close();
}
}
}