package mil.nga.giat.mage.map; import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.preference.PreferenceManager; import com.j256.ormlite.dao.CloseableIterator; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.stmt.Where; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import mil.nga.giat.mage.R; import mil.nga.giat.mage.filter.FavoriteFilter; import mil.nga.giat.mage.filter.Filter; import mil.nga.giat.mage.filter.ImportantFilter; import mil.nga.giat.mage.map.marker.PointCollection; import mil.nga.giat.mage.sdk.Temporal; import mil.nga.giat.mage.sdk.datastore.DaoStore; import mil.nga.giat.mage.sdk.datastore.observation.Observation; import mil.nga.giat.mage.sdk.datastore.user.EventHelper; public class ObservationLoadTask extends AsyncTask<Void, Observation, Void> { private Context context; private Collection<Filter> filters = new ArrayList<>(); private PointCollection<Observation> observationCollection; private Long currentEventId; public ObservationLoadTask(Context context, PointCollection<Observation> observationCollection) { this.context = context.getApplicationContext(); this.observationCollection = observationCollection; this.currentEventId = EventHelper.getInstance(context).getCurrentEvent().getId(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); boolean important = preferences.getBoolean(context.getResources().getString(R.string.activeImportantFilterKey), false); if (important) { filters.add(new ImportantFilter(context)); } boolean favorites = preferences.getBoolean(context.getResources().getString(R.string.activeFavoritesFilterKey), false); if (favorites) { filters.add(new FavoriteFilter(context)); } } public void addFilter(Filter<Temporal> filter) { if (filter == null) return; filters.add(filter); } @Override protected Void doInBackground(Void... params ) { CloseableIterator<Observation> iterator = null; try { iterator = iterator(); while (iterator.hasNext()) { publishProgress(iterator.next()); } } catch (SQLException e) { e.printStackTrace(); } finally { if (iterator != null) { iterator.closeQuietly(); } } return null; } @Override protected void onProgressUpdate(Observation... observations) { observationCollection.add(observations[0]); } private CloseableIterator<Observation> iterator() throws SQLException { Dao<Observation, Long> dao = DaoStore.getInstance(context).getObservationDao(); QueryBuilder<Observation, Long> query = dao.queryBuilder(); Where<Observation, Long> where = query .orderBy("timestamp", false) .where() .ge("last_modified", observationCollection.getLatestDate()) .and() .eq("event_id", currentEventId); for (Filter filter : filters) { QueryBuilder<?, ?> filterQuery = filter.query(); if (filterQuery != null) { query.join(filterQuery); } filter.and(where); } return dao.iterator(query.prepare()); } }