package org.npr.api;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.util.Log;
import org.npr.android.util.ArrayUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class IPhoneTimersConfProvider extends ContentProvider {
public static final Uri CONTENT_URL =
Uri.parse("content://org.npr.apr.IPhoneTimersConf");
private static final String CONTENT_TYPE =
"vnd.android.cursor.dir/vnd.npr.timers";
private static final String CONF_URL =
"http://www.npr.org/services/apps/iphone_timers.conf";
private static final String LOG_TAG = IPhoneTimersConfProvider.class.getName();
private static List<String[]> data;
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projections, String selection,
String[] selectionArgs, String sortOrder) {
if (selection != null && !selection.equals(Items.NAME + " = ?")) {
return null;
}
if (data == null) {
data = new ArrayList<String[]>();
if (!load()) {
return null;
}
}
MatrixCursor cursor = new MatrixCursor(Items.COLUMNS);
for (String[] row : data) {
if (selection == null) {
cursor.addRow(row);
} else if (row[6].equals(selectionArgs[0])) {
cursor.addRow(row);
}
}
return cursor;
}
@Override
public String getType(Uri uri) {
return CONTENT_TYPE;
}
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
throw new UnsupportedOperationException();
}
@Override
public int delete(Uri uri, String s, String[] strings) {
throw new UnsupportedOperationException();
}
@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
throw new UnsupportedOperationException();
}
/**
* Parses the CSV data and loads the data member table.
* <p/>
* TODO: Use a real CSV parser or even better a CSV database implementation.
* e.g. http://sourceforge.net/projects/javacsv/develop
* or import into SQLite in-memory?
*
* @return true on success; false if the stream is null or there is an
* exception (which is logged)
*/
private boolean load() {
try {
InputStream stream = HttpHelper.download(CONF_URL, getContext());
if (stream == null) {
return false;
}
BufferedReader reader = new BufferedReader(
new InputStreamReader(stream),
8192
);
String buffer;
while ((buffer = reader.readLine()) != null) {
String[] rowData = buffer.split(",");
if (rowData.length > 0) {
if (rowData.length < Items.COLUMNS.length) {
rowData = ArrayUtils.copyOf(rowData, Items.COLUMNS.length);
}
data.add(rowData);
}
}
reader.close();
stream.close();
} catch (IOException e) {
Log.e(LOG_TAG, "", e);
return false;
}
return true;
}
public static class Items implements BaseColumns {
public static final String NAME = "name";
public static final String TIMER_LENGTH = "timer_length";
public static final String[] COLUMNS = {NAME, TIMER_LENGTH};
// This class cannot be instantiated
private Items() {
}
}
}