package de.andlabs.teleporter;
import java.io.File;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.UriMatcher;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
public class PlaceProvider extends ContentProvider implements OnSharedPreferenceChangeListener {
private static final int PLACES = 1;
private static final UriMatcher sUriMatcher;
private static final String TAG = "PlaceProvider";
private static DatabaseHelper db;
private static final String DATABASE_NAME = "myPlaces.db";
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE myplaces ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "name TEXT,"
+ "city TEXT,"
+ "address TEXT,"
+ "icon INTEGER,"
+ "tlp_id INTEGER"
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
}
private static final String SQL =
"SELECT _id, " +
"name AS "+SearchManager.SUGGEST_COLUMN_TEXT_1+", " +
"%1$s AS "+SearchManager.SUGGEST_COLUMN_TEXT_2+", " +
"icon AS "+SearchManager.SUGGEST_COLUMN_ICON_1+", " +
"'"+R.drawable.icon+"' AS "+SearchManager.SUGGEST_COLUMN_ICON_2+", " +
"name || ', ' || %1$s AS "+SearchManager.SUGGEST_COLUMN_QUERY+", "+
"'"+SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT+"' AS "+SearchManager.SUGGEST_COLUMN_SHORTCUT_ID+" "+
"FROM %2$s " +
"WHERE name LIKE '%%1$s%%%%' ";
private String sql;
@Override
public boolean onCreate() {
Log.d(TAG, "onCreate");
SharedPreferences autocompletion = getContext().getSharedPreferences("autocompletion", getContext().MODE_PRIVATE);
autocompletion.registerOnSharedPreferenceChangeListener(this);
onSharedPreferenceChanged(autocompletion, null);
return true;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences autocompletion, String key) {
Log.d(TAG, "onSharedPreferenceChanged");
// prepare database queries
if (db != null) db.close();
db = new DatabaseHelper(getContext());
StringBuilder builder = new StringBuilder();
String dir = Environment.getExternalStorageDirectory().getPath()+"/teleporter/";
builder.append(String.format(SQL, "city", "myplaces"));
for (String file : autocompletion.getAll().keySet()) {
if (autocompletion.getBoolean(file, false)) {
String path = dir+file;
if (!new File(path).exists()) {
Log.d(TAG, file+" doesn't exist");
continue;
}
String name = file.split("\\.")[0];
db.getWritableDatabase().execSQL("ATTACH DATABASE '"+path+"' AS '"+name.replace("-", "_")+"';");
builder.append("UNION ALL ");
builder.append(String.format(SQL, "'"+name.substring(name.indexOf("_")+1)+"'", name.replace("-", "_")+".places"));
Log.d(TAG, name);
}
}
builder.append(" LIMIT 42");
sql = builder.toString();
Log.d(TAG, sql);
}
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case PLACES:
return Place.CONTENT_TYPE;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
String query;
switch (sUriMatcher.match(uri)) {
case PLACES:
query = uri.getPathSegments().size() == 2 ? uri.getLastPathSegment():"";
cursor = db.getReadableDatabase().rawQuery(String.format(sql, query), null);
// "SELECT _id, " +
// "name AS "+SearchManager.SUGGEST_COLUMN_TEXT_1+", " +
// "'"+mCity+"' AS "+SearchManager.SUGGEST_COLUMN_TEXT_2+", " +
// "icon AS "+SearchManager.SUGGEST_COLUMN_ICON_1+", " +
// "'"+R.drawable.icon+"' AS "+SearchManager.SUGGEST_COLUMN_ICON_2+", " +
// "name ||', "+mCity+"' AS "+SearchManager.SUGGEST_COLUMN_QUERY+", "+
// "'"+SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT+"' AS "+SearchManager.SUGGEST_COLUMN_SHORTCUT_ID+" "+
// "FROM city.places " +
// (uri.getPathSegments().size() == 2 ? "WHERE name LIKE '"+uri.getLastPathSegment()+"%' " : "") +
// "LIMIT 42", null);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI("de.andlabs.teleporter", SearchManager.SUGGEST_URI_PATH_QUERY, PLACES);
sUriMatcher.addURI("de.andlabs.teleporter", SearchManager.SUGGEST_URI_PATH_QUERY+"/*", PLACES);
}
}