/*
* Copyright (c) 2015 Jonas Kalderstam.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nononsenseapps.notepad.data.model.sql;
import java.util.Calendar;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import com.nononsenseapps.notepad.data.local.sql.LegacyDBHelper;
import com.nononsenseapps.notepad.data.local.sql.MyContentProvider;
public class TaskList extends DAO {
// SQL convention says Table name should be "singular"
public static final String TABLE_NAME = "tasklist";
public static final Uri URI = Uri.withAppendedPath(
Uri.parse(MyContentProvider.SCHEME + MyContentProvider.AUTHORITY),
TABLE_NAME);
public static final String VIEWCOUNT_NAME = "lists_with_count";
public static final Uri URI_WITH_COUNT = Uri.withAppendedPath(URI,
VIEWCOUNT_NAME);
public static Uri getUri(final long id) {
return Uri.withAppendedPath(URI, Long.toString(id));
}
public static final String CONTENT_TYPE = "vnd.android.cursor.item/vnd.nononsenseapps.list";
public static final int BASEURICODE = 101;
public static final int BASEITEMCODE = 102;
public static final int VIEWCOUNTCODE = 103;
// Legacy support, these also need to use legacy projections
public static final int LEGACYBASEURICODE = 111;
public static final int LEGACYBASEITEMCODE = 112;
public static final int LEGACYVISIBLEURICODE = 113;
public static final int LEGACYVISIBLEITEMCODE = 114;
/**
* TaskList URIs start at 101, up to 199
*/
public static void addMatcherUris(UriMatcher sURIMatcher) {
sURIMatcher
.addURI(MyContentProvider.AUTHORITY, TABLE_NAME, BASEURICODE);
sURIMatcher.addURI(MyContentProvider.AUTHORITY, TABLE_NAME + "/#",
BASEITEMCODE);
sURIMatcher.addURI(MyContentProvider.AUTHORITY, TABLE_NAME + "/"
+ VIEWCOUNT_NAME, VIEWCOUNTCODE);
// Legacy URIs
sURIMatcher.addURI(MyContentProvider.AUTHORITY,
LegacyDBHelper.NotePad.Lists.LISTS, LEGACYBASEURICODE);
sURIMatcher.addURI(MyContentProvider.AUTHORITY,
LegacyDBHelper.NotePad.Lists.LISTS + "/#", LEGACYBASEITEMCODE);
sURIMatcher.addURI(MyContentProvider.AUTHORITY,
LegacyDBHelper.NotePad.Lists.VISIBLE_LISTS,
LEGACYVISIBLEURICODE);
sURIMatcher.addURI(MyContentProvider.AUTHORITY,
LegacyDBHelper.NotePad.Lists.VISIBLE_LISTS + "/#",
LEGACYVISIBLEITEMCODE);
}
public static class Columns implements BaseColumns {
private Columns() {
}
public static final String TITLE = "title";
public static final String UPDATED = "updated";
public static final String LISTTYPE = "tasktype";
public static final String SORTING = "sorting";
public static final String VIEW_COUNT = "count";
// public static final String GTASKACCOUNT = "gtaskaccount";
// public static final String GTASKID = "gtaskid";
//
// // Future proofing
// public static final String DROPBOXACCOUNT = "dropboxaccount";
// public static final String DROPBOXID = "dropboxid";
public static final String[] FIELDS = { _ID, TITLE, UPDATED, LISTTYPE,
SORTING };
// GTASKACCOUNT, GTASKID, DROPBOXACCOUNT, DROPBOXID };
public static final String[] SHALLOWFIELDS = { _ID, TITLE, UPDATED };
}
public static final String CREATE_TABLE = new StringBuilder("CREATE TABLE ")
.append(TABLE_NAME).append("(").append(Columns._ID)
.append(" INTEGER PRIMARY KEY,").append(Columns.TITLE)
.append(" TEXT NOT NULL DEFAULT '',").append(Columns.UPDATED)
.append(" INTEGER,").append(Columns.LISTTYPE)
.append(" TEXT DEFAULT NULL,").append(Columns.SORTING)
.append(" TEXT DEFAULT NULL").append(")").toString();
public static final String CREATE_COUNT_VIEW = new StringBuilder(
"CREATE TEMP VIEW IF NOT EXISTS ")
.append(VIEWCOUNT_NAME)
.append(" AS SELECT ")
.append(arrayToCommaString(Columns.FIELDS))
.append(",")
.append(Columns.VIEW_COUNT)
.append(" FROM ")
.append(TABLE_NAME)
.append(" LEFT JOIN ")
// Select count statement
.append(" (SELECT COUNT(1) AS ").append(Columns.VIEW_COUNT)
.append(",").append(Task.Columns.DBLIST).append(" FROM ")
.append(Task.TABLE_NAME).append(" WHERE ")
.append(Task.Columns.COMPLETED).append(" IS NULL ")
.append(" GROUP BY ").append(Task.Columns.DBLIST).append(") ")
.append(" ON ").append(TABLE_NAME).append(".").append(Columns._ID)
.append(" = ").append(Task.Columns.DBLIST).append(";").toString();
public String title = "";
// milliseconds since 1970-01-01 UTC
public Long updated = null;
// Null, use global prefs
public String listtype = null;
public String sorting = null;
// Sync stuff
// public String gtaskaccount = null;
// public String gtaskid = null;
// public String dropboxaccount = null;
// public String dropboxid = null;
public TaskList() {
}
public TaskList(final Cursor c) {
this._id = c.getLong(0);
this.title = c.getString(1);
this.updated = c.getLong(2);
this.listtype = c.getString(3);
this.sorting = c.getString(4);
// sync stuff
// gtaskaccount = c.getString(3);
// gtaskid = c.getString(4);
// dropboxaccount = c.getString(5);
// dropboxid = c.getString(6);
}
public TaskList(final Uri uri, final ContentValues values) {
this(Long.parseLong(uri.getLastPathSegment()), values);
}
public TaskList(final long id, final ContentValues values) {
this(values);
this._id = id;
}
public TaskList(final JSONObject json) throws JSONException {
if (json.has(Columns.TITLE))
title = json.getString(Columns.TITLE);
if (json.has(Columns.UPDATED))
updated = json.getLong(Columns.UPDATED);
if (json.has(Columns.LISTTYPE))
listtype = json.getString(Columns.LISTTYPE);
if (json.has(Columns.SORTING))
sorting = json.getString(Columns.SORTING);
}
public TaskList(final ContentValues values) {
title = values.getAsString(Columns.TITLE);
updated = values.getAsLong(Columns.UPDATED);
listtype = values.getAsString(Columns.LISTTYPE);
sorting = values.getAsString(Columns.SORTING);
// gtaskaccount = values.getAsString(Columns.GTASKACCOUNT);
// gtaskid = values.getAsString(Columns.GTASKID);
// dropboxaccount = values.getAsString(Columns.DROPBOXACCOUNT);
// dropboxid = values.getAsString(Columns.DROPBOXID);
}
public ContentValues getContent() {
final ContentValues values = new ContentValues();
// Note that ID is NOT included here
values.put(Columns.TITLE, title);
values.put(Columns.UPDATED, updated);
values.put(Columns.LISTTYPE, listtype);
values.put(Columns.SORTING, sorting);
// values.put(Columns.GTASKACCOUNT, gtaskaccount);
// values.put(Columns.GTASKID, gtaskid);
// values.put(Columns.DROPBOXACCOUNT, dropboxaccount);
// values.put(Columns.DROPBOXID, dropboxid);
return values;
}
@Override
protected String getTableName() {
return TABLE_NAME;
}
@Override
public String getContentType() {
return CONTENT_TYPE;
}
@Override
public int save(final Context context) {
return save(context, Calendar.getInstance().getTimeInMillis());
}
public int save(final Context context, final long updateTime) {
int result = 0;
updated = updateTime;
if (_id < 1) {
final Uri uri = context.getContentResolver().insert(getBaseUri(),
getContent());
if (uri != null) {
_id = Long.parseLong(uri.getLastPathSegment());
result++;
}
} else {
result += context.getContentResolver().update(getUri(),
getContent(), null, null);
}
return result;
}
}