package net.osmand.plus.activities.search;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SearchHistoryHelper {
private static SearchHistoryHelper helper = new SearchHistoryHelper();
private static final int HISTORY_LIMIT = 10;
public static SearchHistoryHelper getInstance(){
return helper;
}
public static class HistoryEntry {
double lat;
double lon;
String name;
public HistoryEntry(double lat, double lon, String name){
this.lat = lat;
this.lon = lon;
this.name = name;
}
public String getName() {
return name;
}
public double getLat() {
return lat;
}
public double getLon() {
return lon;
}
}
private List<HistoryEntry> loadedEntries = null;
public List<HistoryEntry> getHistoryEntries(Context ctx) {
if(loadedEntries == null){
HistoryItemDBHelper helper = checkLoadedEntries(ctx);
helper.close();
}
return loadedEntries;
}
private HistoryItemDBHelper checkLoadedEntries(Context ctx){
HistoryItemDBHelper helper = new HistoryItemDBHelper(ctx);
if(loadedEntries == null){
loadedEntries = helper.getEntries();
}
return helper;
}
public void remove(HistoryEntry model, Context ctx) {
HistoryItemDBHelper helper = checkLoadedEntries(ctx);
if(helper.remove(model)){
loadedEntries.remove(model);
}
helper.close();
}
public void removeAll(Context ctx) {
HistoryItemDBHelper helper = checkLoadedEntries(ctx);
if(helper.removeAll()){
loadedEntries.clear();
}
helper.close();
}
public void selectEntry(HistoryEntry model, Context ctx) {
HistoryItemDBHelper helper = checkLoadedEntries(ctx);
int i = loadedEntries.indexOf(model);
updateModelAt(model, helper, i);
helper.close();
}
private void updateModelAt(HistoryEntry model, HistoryItemDBHelper helper, int i) {
if(i == -1){
if(helper.add(model)){
loadedEntries.add(0, model);
if(loadedEntries.size() > HISTORY_LIMIT){
if(helper.remove(loadedEntries.get(loadedEntries.size() - 1))){
loadedEntries.remove(loadedEntries.size() - 1);
}
}
}
} else {
if(helper.update(model)){
loadedEntries.remove(i);
loadedEntries.add(0, model);
}
}
}
public HistoryEntry addNewItemToHistory(double lat, double lon, String description, Context ctx){
HistoryItemDBHelper helper = checkLoadedEntries(ctx);
int i = 0;
HistoryEntry model = new HistoryEntry(lat, lon, description);
for(HistoryEntry e : loadedEntries){
if(description.equals(e.getName())){
break;
}
i++;
}
if(i == loadedEntries.size()){
i = -1;
}
if (i != 0) {
updateModelAt(model, helper, i);
}
helper.close();
return model;
}
private static class HistoryItemDBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "search_history"; //$NON-NLS-1$
private static final int DB_VERSION = 1;
private static final String HISTORY_TABLE_NAME = "history"; //$NON-NLS-1$
private static final String HISTORY_COL_NAME = "name"; //$NON-NLS-1$
private static final String HISTORY_COL_TIME = "time"; //$NON-NLS-1$
private static final String HISTORY_COL_TYPE = "type"; //$NON-NLS-1$
private static final String HISTORY_COL_LAT = "latitude"; //$NON-NLS-1$
private static final String HISTORY_COL_LON = "longitude"; //$NON-NLS-1$
private static final String HISTORY_TABLE_CREATE = "CREATE TABLE " + HISTORY_TABLE_NAME + " (" + //$NON-NLS-1$ //$NON-NLS-2$
HISTORY_COL_NAME + " TEXT, " + HISTORY_COL_TIME + " long, " + HISTORY_COL_TYPE + " TEXT, " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
HISTORY_COL_LAT + " double, " +HISTORY_COL_LON + " double);"; //$NON-NLS-1$ //$NON-NLS-2$
public HistoryItemDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(HISTORY_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public boolean remove(HistoryEntry e){
SQLiteDatabase db = getWritableDatabase();
if(db != null){
db.execSQL("DELETE FROM "+ HISTORY_TABLE_NAME+ " WHERE " + HISTORY_COL_NAME+ " = ?", new Object[]{e.getName()}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return true;
}
return false;
}
public boolean removeAll(){
SQLiteDatabase db = getWritableDatabase();
if(db != null){
db.execSQL("DELETE FROM "+ HISTORY_TABLE_NAME); //$NON-NLS-1$
return true;
}
return false;
}
public boolean update(HistoryEntry e){
SQLiteDatabase db = getWritableDatabase();
if(db != null){
db.execSQL("UPDATE "+ HISTORY_TABLE_NAME+ " SET time = ? WHERE " + HISTORY_COL_NAME+ " = ?", new Object[]{System.currentTimeMillis(), e.getName()}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return true;
}
return false;
}
public boolean add(HistoryEntry e){
SQLiteDatabase db = getWritableDatabase();
if(db != null){
db.execSQL("INSERT INTO "+ HISTORY_TABLE_NAME+ " VALUES (?, ?, ?, ?, ?)", new Object[]{e.getName(), System.currentTimeMillis(), null, e.getLat(), e.getLon()}); //$NON-NLS-1$ //$NON-NLS-2$
return true;
}
return false;
}
public List<HistoryEntry> getEntries(){
List<HistoryEntry> entries = new ArrayList<HistoryEntry>();
SQLiteDatabase db = getReadableDatabase();
if(db != null){
Cursor query = db.rawQuery("SELECT " + HISTORY_COL_NAME +", " + HISTORY_COL_LAT +"," + HISTORY_COL_LON +" FROM " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
HISTORY_TABLE_NAME + " ORDER BY " + HISTORY_COL_TIME + " DESC", null); //$NON-NLS-1$//$NON-NLS-2$
if(query.moveToFirst()){
do {
HistoryEntry e = new HistoryEntry(query.getDouble(1), query.getDouble(2), query.getString(0));
entries.add(e);
} while(query.moveToNext());
}
query.close();
}
return entries;
}
}
}