package de.westnordost.streetcomplete.data.changesets;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.inject.Inject;
import de.westnordost.streetcomplete.Prefs;
/** Keep track of changesets and the date of the last change that has been made to them */
public class OpenChangesetsDao
{
public static final int CLOSE_CHANGESETS_AFTER_INACTIVITY_OF = 1000*60*20; // 20min
private final SQLiteOpenHelper dbHelper;
private final SharedPreferences prefs;
private final SQLiteStatement replace;
@Inject
public OpenChangesetsDao(SQLiteOpenHelper dbHelper, SharedPreferences prefs)
{
this.dbHelper = dbHelper;
this.prefs = prefs;
SQLiteDatabase db = dbHelper.getWritableDatabase();
// params = questType, changesetId
replace = db.compileStatement(
"INSERT OR REPLACE INTO " + OpenChangesetsTable.NAME + " ("+
OpenChangesetsTable.Columns.QUEST_TYPE+","+
OpenChangesetsTable.Columns.CHANGESET_ID+
") values (?,?);");
}
public long getLastQuestSolvedTime()
{
return prefs.getLong(Prefs.LAST_SOLVED_QUEST_TIME, 0);
}
public void setLastQuestSolvedTimeToNow()
{
prefs.edit().putLong(Prefs.LAST_SOLVED_QUEST_TIME, System.currentTimeMillis()).apply();
}
public void replace(String questType, long changesetId)
{
synchronized (replace) // statements are not threadsafe
{
replace.bindString(1, questType);
replace.bindLong(2, changesetId);
replace.executeInsert();
replace.clearBindings();
}
}
public OpenChangesetInfo get(String questType)
{
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(OpenChangesetsTable.NAME, null,
OpenChangesetsTable.Columns.QUEST_TYPE + " = ?", new String[]{questType},
null,null,null,"1");
try
{
if(!cursor.moveToFirst()) return null; // nothing found for this quest type
return createFromCursor(cursor);
}
finally
{
cursor.close();
}
}
public Collection<OpenChangesetInfo> getAll()
{
SQLiteDatabase db = dbHelper.getReadableDatabase();
// https://youtu.be/B1BdQcJ2ZYY?t=85
Cursor cursor = db.query(OpenChangesetsTable.NAME, null, null, null, null, null, null, null);
List<OpenChangesetInfo> result = new ArrayList<>();
try
{
if(cursor.moveToFirst())
{
while(!cursor.isAfterLast())
{
result.add(createFromCursor(cursor));
cursor.moveToNext();
}
}
return result;
}
finally
{
cursor.close();
}
}
private OpenChangesetInfo createFromCursor(Cursor cursor)
{
int colQuestType = cursor.getColumnIndexOrThrow(OpenChangesetsTable.Columns.QUEST_TYPE);
int colChangesetId = cursor.getColumnIndexOrThrow(OpenChangesetsTable.Columns.CHANGESET_ID);
OpenChangesetInfo result = new OpenChangesetInfo();
result.questType = cursor.getString(colQuestType);
result.changesetId = cursor.getLong(colChangesetId);
return result;
}
public boolean delete(String questType)
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
return db.delete(OpenChangesetsTable.NAME,
OpenChangesetsTable.Columns.QUEST_TYPE + " = ?", new String[]{questType}) == 1;
}
}