package by.istin.android.xcore.provider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.BaseColumns;
import by.istin.android.xcore.ContextHolder;
import by.istin.android.xcore.source.DataSourceRequest;
import by.istin.android.xcore.utils.StringUtil;
public class ModelContract {
private static final String PARAM_NOT_NOTIFY_CHANGES = "notNotifyChanges";
private static final String DATA_SOURCE_REQUEST_PARAM = "___dsr";
private static final String AUTHORITY_TEMPLATE = "%s.ModelContentProvider";
private static final String CONTENT_ID_TEMPLATE = "content://"
+ "%s" + "/%s/%d";
private static final String CONTENT_ALL_TEMPLATE = "content://"
+ "%s" + "/%s";
private static final String CONTENT_TYPE_TEMPLATE = "vnd.android.cursor.dir/%s";
private static final String SEGMENT_RAW_QUERY = "___srq";
private static final String SQL_PARAM = "___sql";
private static final String OBSERVER_URI_PARAM = "___ouri";
private static final String SQL_QUERY_TEMPLATE = SEGMENT_RAW_QUERY+ "?"+SQL_PARAM + "=%s&"+OBSERVER_URI_PARAM + "=%s";
private ModelContract() {
}
public static String getSqlParam(Uri uri) {
return uri.getQueryParameter(ModelContract.SQL_PARAM);
}
public static boolean isSqlUri(String className) {
return className.equals(ModelContract.SEGMENT_RAW_QUERY);
}
public static Uri getObserverUri(Uri uri) {
String encodedUri = uri.getQueryParameter(ModelContract.OBSERVER_URI_PARAM);
if (StringUtil.isEmpty(encodedUri)) {
return null;
}
return Uri.parse(StringUtil.decode(encodedUri));
}
public static String getDataSourceRequest(Uri uri) {
return uri.getQueryParameter(ModelContract.DATA_SOURCE_REQUEST_PARAM);
}
public static void dataSourceRequestToIntent(Intent intent, Bundle mBundle) {
intent.putExtra(ModelContract.DATA_SOURCE_REQUEST_PARAM, mBundle);
}
public static void dataSourceRequestToBundle(Bundle bundle, Bundle mBundle) {
bundle.putParcelable(ModelContract.DATA_SOURCE_REQUEST_PARAM, mBundle);
}
public static Bundle getDataSourceFromBundle(Bundle bundle) {
return bundle.getParcelable(ModelContract.DATA_SOURCE_REQUEST_PARAM);
}
public static Bundle getDataSourceFromIntent(Intent intent) {
return intent.getParcelableExtra(ModelContract.DATA_SOURCE_REQUEST_PARAM);
}
public static String getLimitParam(Uri uri) {
//TODO impelement default paging support
/*
String offsetParameter = uri.getQueryParameter("offset");
String sizeParameter = uri.getQueryParameter("size");
String limitParam = null;
if (!StringUtil.isEmpty(offsetParameter) && !StringUtil.isEmpty(sizeParameter)) {
limitParam = StringUtil.format("%s,%s",offsetParameter, sizeParameter);
}*/
return null;
}
public static final class ModelColumns implements BaseColumns {
private ModelColumns() {
}
}
public static DataSourceRequest getDataSourceRequestFromUri(Uri uri) {
String dataSourceRequest = ModelContract.getDataSourceRequest(uri);
if (!StringUtil.isEmpty(dataSourceRequest)) {
return DataSourceRequest.fromUri(Uri.parse("content://temp?"+StringUtil.decode(dataSourceRequest)));
}
return null;
}
public static String getAuthority(Context ctx) {
return StringUtil.format(AUTHORITY_TEMPLATE, ctx.getPackageName());
}
public static Uri getUri(Class<?> clazz) {
return getUri(clazz.getCanonicalName());
}
public static Uri getUri(String modelName) {
return Uri.parse(StringUtil.format(CONTENT_ALL_TEMPLATE, getAuthority(ContextHolder.getInstance().getContext()), modelName));
}
public static Uri getUri(Class<?> clazz, Long id) {
return Uri.parse(StringUtil.format(CONTENT_ID_TEMPLATE, getAuthority(ContextHolder.getInstance().getContext()), clazz.getCanonicalName(), id));
}
public static String getContentType(Class<?> clazz) {
return StringUtil.format(CONTENT_TYPE_TEMPLATE, clazz.getCanonicalName());
}
public static String getContentType(String modelName) {
return StringUtil.format(CONTENT_TYPE_TEMPLATE, modelName);
}
public static Uri getUri(DataSourceRequest dataSourceRequest, Class<?> clazz) {
Uri uri = getUri(clazz);
return getUri(dataSourceRequest, uri);
}
public static Uri getUri(DataSourceRequest dataSourceRequest, Uri uri) {
String uriParams = dataSourceRequest.toUriParams();
String uriAsString = uri.toString();
if (uriAsString.contains("?")) {
uriAsString = uriAsString + "&";
} else {
uriAsString = uriAsString + "?";
}
return Uri.parse(uriAsString + DATA_SOURCE_REQUEST_PARAM + "="+ StringUtil.encode(uriParams));
}
public static Uri getSQLQueryUri(String sql, Uri refreshUri) {
String authority = getAuthority(ContextHolder.getInstance().getContext());
String refreshUriAsString = StringUtil.encode(refreshUri == null ? StringUtil.EMPTY : refreshUri.toString(), StringUtil.EMPTY);
String sqlParameter = StringUtil.format(SQL_QUERY_TEMPLATE, StringUtil.encode(sql), refreshUriAsString);
return Uri.parse(StringUtil.format(CONTENT_ALL_TEMPLATE, authority, sqlParameter));
}
public static class UriBuilder {
private final StringBuilder builder;
private boolean isParamAdded = false;
public UriBuilder(Uri uri) {
super();
String uriAsString = uri.toString();
this.isParamAdded = uriAsString.contains("?");
this.builder = new StringBuilder(uriAsString);
}
public UriBuilder(Class<?> clazz) {
this(getUri(clazz));
}
public UriBuilder notNotifyChanges() {
checkParams();
this.builder.append(PARAM_NOT_NOTIFY_CHANGES+"=true");
return this;
}
private void checkParams() {
if (isParamAdded) {
this.builder.append("&");
} else {
this.builder.append("?");
}
}
public Uri build() {
return Uri.parse(builder.toString());
}
}
public static boolean isNotify(Uri uri) {
String queryParameter = uri.getQueryParameter(ModelContract.PARAM_NOT_NOTIFY_CHANGES);
return StringUtil.isEmpty(queryParameter);
}
}