package org.wikipedia.database.contract;
import android.content.ContentResolver;
import android.net.Uri;
import org.wikipedia.BuildConfig;
import org.wikipedia.database.DbUtil;
import org.wikipedia.database.column.CodeEnumColumn;
import org.wikipedia.database.column.IdColumn;
import org.wikipedia.database.column.IntColumn;
import org.wikipedia.database.column.LongColumn;
import org.wikipedia.database.column.StrColumn;
import org.wikipedia.database.http.HttpColumns;
import org.wikipedia.database.http.HttpStatus;
import org.wikipedia.useroption.UserOption;
@SuppressWarnings("checkstyle:interfaceistype")
public interface UserOptionContract {
String AUTHORITY = BuildConfig.USER_OPTION_AUTHORITY;
Uri AUTHORITY_BASE = new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY)
.build();
String TABLE_OPTION = "useroption";
String TABLE_HTTP = "useroptionhttp";
interface OptionCol {
IdColumn ID = new IdColumn(TABLE_OPTION);
StrColumn KEY = new StrColumn(TABLE_OPTION, "key", "text not null unique");
StrColumn VAL = new StrColumn(TABLE_OPTION, "val", "text");
@Deprecated interface Legacy {
IntColumn HTTP_STATUS = new IntColumn(TABLE_OPTION, "syncStatus", "integer not null");
LongColumn HTTP_TIMESTAMP = new LongColumn(TABLE_OPTION, "syncTimestamp", "integer not null");
LongColumn HTTP_TRANSACTION_ID = new LongColumn(TABLE_OPTION, "syncTransactionId", "integer not null");
}
String[] SELECTION = DbUtil.qualifiedNames(KEY);
}
HttpColumns<UserOption> HTTP_COLS = new HttpColumns<>(TABLE_HTTP);
interface HttpCol {
IdColumn ID = HTTP_COLS.id();
StrColumn KEY = HTTP_COLS.key();
CodeEnumColumn<HttpStatus> STATUS = HTTP_COLS.status();
LongColumn TIMESTAMP = HTTP_COLS.timestamp();
LongColumn TRANSACTION_ID = HTTP_COLS.transactionId();
String[] SELECTION = HTTP_COLS.selection();
}
interface Option extends OptionCol {
String TABLES = TABLE_OPTION;
String PATH = "option";
Uri URI = Uri.withAppendedPath(AUTHORITY_BASE, PATH);
String[] PROJECTION = null;
}
interface Http extends HttpCol {
String TABLES = TABLE_HTTP;
// HACK: Http has no real dependency on Option. However, HttpWithOption is a composite of
// Option and Http and observers expect to be notified when _either_ change. Making
// this path hierarchical allows HttpWithOption to also be hierarchical but needlessly
// notifies Http clients when Option changes. More here:
// - http://chalup.github.io/blog/2014/09/14/contentprovider-series-uris/
// - https://gist.github.com/chalup/4201307da02b9cfe4f40
String PATH = Option.PATH + "/http";
Uri URI = Uri.withAppendedPath(AUTHORITY_BASE, PATH);
String[] PROJECTION = null;
}
interface HttpWithOption extends Option {
String TABLES = ":httpTbl left join :tbl on (:tbl.keyCol = :httpTbl.keyCol)"
.replaceAll(":tbl.keyCol", KEY.qualifiedName())
.replaceAll(":httpTbl.keyCol", HttpCol.KEY.qualifiedName())
.replaceAll(":httpTbl", TABLE_HTTP)
.replaceAll(":tbl", TABLE_OPTION);
String PATH = Http.PATH + "/with_http";
Uri URI = Uri.withAppendedPath(AUTHORITY_BASE, PATH);
StrColumn HTTP_KEY = HttpCol.KEY;
CodeEnumColumn<HttpStatus> HTTP_STATUS = HttpCol.STATUS;
LongColumn HTTP_TIMESTAMP = HttpCol.TIMESTAMP;
LongColumn HTTP_TRANSACTION_ID = HttpCol.TRANSACTION_ID;
String[] PROJECTION = DbUtil.qualifiedNames(ID, KEY, VAL, HTTP_KEY, HTTP_STATUS,
HTTP_TIMESTAMP, HTTP_TRANSACTION_ID);
}
}