/* @(#)ElectricSleepProvider.java
*
*========================================================================
* Copyright 2011 by Zeo Inc. All Rights Reserved
*========================================================================
*
* Date: $Date$
* Author: Jon Willis
* Author: Brandon Edens <brandon.edens@myzeo.com>
* Version: $Revision$
*/
package com.androsz.electricsleepbeta.db;
import com.google.android.apps.iosched.util.SelectionBuilder;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import java.util.TimeZone;
/**
* Provider for electric sleep data.
*
* @author Jon Willis
* @author Brandon Edens
* @version $Revision$
*/
public class ElectricSleepProvider extends ContentProvider {
public static final String CONTENT_AUTHORITY = "com.androsz.electricsleepbeta.db.electric_sleep_provider";
public static final Uri BASE_CONTENT_URI = Uri.parse("content://"
+ CONTENT_AUTHORITY);
public interface TimestampColumns {
String CREATED_ON = "created_on";
String UPDATED_ON = "updated_on";
}
private static final int SLEEP_SESSIONS = 100;
private static final int SLEEP_SESSIONS_ID = 101;
private static final UriMatcher URI_MATCHER = buildUriMatcher();
private ElectricSleepDatabase mOpenHelper;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final SelectionBuilder builder = buildSimpleSelection(uri, "");
final int count = builder.where(selection, selectionArgs).delete(db);
notifyChange(uri);
return count;
}
private void notifyChange(Uri uri) {
getContext().getContentResolver().notifyChange(uri, null);
}
@Override
public String getType(Uri uri) {
final int match = URI_MATCHER.match(uri);
switch (match) {
case SLEEP_SESSIONS:
return SleepSession.CONTENT_TYPE;
case SLEEP_SESSIONS_ID:
return SleepSession.CONTENT_ITEM_TYPE;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
if (values == null) {
return null;
}
final long currentTimestamp = System.currentTimeMillis();
values.put(TimestampColumns.CREATED_ON, currentTimestamp);
values.put(TimestampColumns.UPDATED_ON, currentTimestamp);
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = URI_MATCHER.match(uri);
switch (match) {
case SLEEP_SESSIONS:
values.put(SleepSession.TIMEZONE, TimeZone.getDefault().getID());
final long id = db.insert(SleepSession.PATH, null, values);
if (id == -1) {
return null;
}
notifyChange(uri);
return ContentUris.withAppendedId(SleepSession.CONTENT_URI, id);
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@Override
public boolean onCreate() {
mOpenHelper = new ElectricSleepDatabase(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
final int match = URI_MATCHER.match(uri);
final SelectionBuilder builder = buildSimpleSelection(uri,
" as query_tmp");
switch (match) {
case SLEEP_SESSIONS:
case SLEEP_SESSIONS_ID:
if (projection == null) {
projection = SleepSession.PROJECTION;
}
if (sortOrder == null) {
sortOrder = SleepSession.DEFAULT_SORT_ORDER;
}
Cursor c = builder.where(selection, selectionArgs).query(db,
projection, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
final long updateTimestamp = System.currentTimeMillis();
values.put(TimestampColumns.UPDATED_ON, updateTimestamp);
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final SelectionBuilder builder = buildSimpleSelection(uri, "");
final int count = builder.where(selection, selectionArgs).update(db,
values);
final int match = URI_MATCHER.match(uri);
switch (match) {
case SLEEP_SESSIONS:
case SLEEP_SESSIONS_ID:
notifyChange(uri);
}
return count;
}
private SelectionBuilder buildSimpleSelection(Uri uri, String as) {
final SelectionBuilder builder = new SelectionBuilder();
final int match = URI_MATCHER.match(uri);
String table = null;
switch (match) {
case SLEEP_SESSIONS:
return builder.table(SleepSession.PATH);
case SLEEP_SESSIONS_ID:
return builder.table(SleepSession.PATH).where(
SleepSession._ID + "=?",
Long.toString(ContentUris.parseId(uri)));
}
throw new UnsupportedOperationException("Unkown uri: " + uri);
}
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = CONTENT_AUTHORITY;
matcher.addURI(authority, SleepSession.PATH, SLEEP_SESSIONS);
matcher.addURI(authority, SleepSession.PATH + "/#", SLEEP_SESSIONS_ID);
return matcher;
}
}