package mil.nga.giat.mage.newsfeed;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.CursorAdapter;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.gson.JsonElement;
import com.j256.ormlite.android.AndroidDatabaseResults;
import com.j256.ormlite.stmt.PreparedQuery;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import mil.nga.giat.mage.R;
import mil.nga.giat.mage.map.marker.ObservationBitmapFactory;
import mil.nga.giat.mage.observation.AttachmentGallery;
import mil.nga.giat.mage.sdk.datastore.observation.Observation;
import mil.nga.giat.mage.sdk.datastore.observation.ObservationFavorite;
import mil.nga.giat.mage.sdk.datastore.observation.ObservationHelper;
import mil.nga.giat.mage.sdk.datastore.observation.ObservationProperty;
import mil.nga.giat.mage.sdk.datastore.user.User;
import mil.nga.giat.mage.sdk.datastore.user.UserHelper;
import mil.nga.giat.mage.sdk.exceptions.ObservationException;
import mil.nga.giat.mage.sdk.exceptions.UserException;
public class ObservationFeedCursorAdapter extends CursorAdapter {
public interface ObservationActionListener {
void onObservationDirections(Observation observation);
}
private static final String LOG_NAME = ObservationFeedCursorAdapter.class.getName();
private static final String TYPE_PROPERTY_KEY= "type";
private static final String SHORT_TIME_PATTERN = "h:mm a";
private static final String SHORT_DATE_PATTERN = "MMM d";
private LayoutInflater inflater = null;
private PreparedQuery<Observation> query;
private AttachmentGallery attachmentGallery;
private User currentUser;
private ObservationActionListener observationActionListener;
public ObservationFeedCursorAdapter(Activity activity, Cursor c, PreparedQuery<Observation> query, AttachmentGallery attachmentGallery) {
super(activity, c, false);
this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.query = query;
this.attachmentGallery = attachmentGallery;
}
public void setObservationShareListener(ObservationActionListener observationActionListener) {
this.observationActionListener = observationActionListener;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parentView) {
return inflater.inflate(R.layout.observation_list_item, parentView, false);
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void bindView(View v, Context context, Cursor cursor) {
try {
final Observation observation = query.mapRow(new AndroidDatabaseResults(cursor, null));
boolean isFlagged = observation.getImportant() != null && observation.getImportant().isImportant();
v.findViewById(R.id.flagged).setVisibility(isFlagged ? View.VISIBLE : View.GONE);
ImageView markerView = (ImageView) v.findViewById(R.id.observation_marker);
Bitmap marker = ObservationBitmapFactory.bitmap(context, observation);
if (marker != null) {
markerView.setImageBitmap(marker);
}
Map<String, ObservationProperty> properties = observation.getPropertiesMap();
ObservationProperty type = properties.get(TYPE_PROPERTY_KEY);
((TextView) v.findViewById(R.id.type)).setText(type.getValue().toString());
JsonElement variantField = observation.getEvent().getForm().get("variantField");
if (variantField != null && !variantField.isJsonNull()) {
TextView variantTextView = ((TextView) v.findViewById(R.id.variant));
ObservationProperty variant = properties.get(variantField.getAsString());
if (variant != null && variant.getValue() != null) {
variantTextView.setVisibility(View.VISIBLE);
variantTextView.setText(variant.getValue().toString());
} else {
v.findViewById(R.id.variant).setVisibility(View.GONE);
}
} else {
v.findViewById(R.id.variant).setVisibility(View.GONE);
}
Date timestamp = observation.getTimestamp();
String pattern = DateUtils.isToday(timestamp.getTime()) ? SHORT_TIME_PATTERN : SHORT_DATE_PATTERN;
DateFormat dateFormat = new SimpleDateFormat(pattern, Locale.getDefault());
((TextView) v.findViewById(R.id.time)).setText(dateFormat.format(timestamp));
String userDisplayName = "Unknown User";
try {
User user = UserHelper.getInstance(context).read(observation.getUserId());
if (user != null) {
userDisplayName = user.getDisplayName();
}
} catch (UserException e) {
Log.e(LOG_NAME, "Could not get user", e);
}
((TextView) v.findViewById(R.id.user)).setText(userDisplayName);
LinearLayout attachmentLayout = (LinearLayout) v.findViewById(R.id.image_gallery);
attachmentLayout.removeAllViews();
if (observation.getAttachments().size() == 0) {
attachmentLayout.setVisibility(View.GONE);
} else {
attachmentLayout.setVisibility(View.VISIBLE);
attachmentGallery.addAttachments(attachmentLayout, observation.getAttachments());
}
View favorite = v.findViewById(R.id.favorite);
favorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleFavorite(observation, v);
}
});
setFavoriteImage(observation.getFavorites(), favorite, isFavorite(observation));
v.findViewById(R.id.directions).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDirections(observation);
}
});
} catch (java.sql.SQLException e) {
Log.e(LOG_NAME, "Problem getting observation.", e);
}
}
private void setFavoriteImage(Collection<ObservationFavorite> favorites, View view, boolean isFavorite) {
ImageView favoriteIcon = (ImageView) view.findViewById(R.id.favoriteIcon);
if (isFavorite) {
favoriteIcon.setColorFilter(ContextCompat.getColor(mContext, R.color.observation_favorite_active));
} else {
favoriteIcon.setColorFilter(ContextCompat.getColor(mContext, R.color.observation_favorite_inactive));
}
TextView favoriteCount = (TextView) view.findViewById(R.id.favoriteCount);
favoriteCount.setVisibility(favorites.size() > 0 ? View.VISIBLE : View.GONE);
favoriteCount.setText(Integer.toString(favorites.size()));
}
private void toggleFavorite(Observation observation, View view) {
ObservationHelper observationHelper = ObservationHelper.getInstance(mContext);
boolean isFavorite = isFavorite(observation);
try {
if (isFavorite) {
observationHelper.unfavoriteObservation(observation, currentUser);
} else {
observationHelper.favoriteObservation(observation, currentUser);
}
setFavoriteImage(observation.getFavorites(), view, isFavorite);
} catch (ObservationException e) {
Log.e(LOG_NAME, "Could not unfavorite observation", e);
}
}
private boolean isFavorite(Observation observation) {
boolean isFavorite = false;
try {
currentUser = UserHelper.getInstance(mContext).readCurrentUser();
if (currentUser != null) {
ObservationFavorite favorite = observation.getFavoritesMap().get(currentUser.getRemoteId());
isFavorite = favorite != null && favorite.isFavorite();
}
} catch (UserException e) {
Log.e(LOG_NAME, "Could not get user", e);
}
return isFavorite;
}
private void getDirections(Observation observation) {
if (observationActionListener != null) {
observationActionListener.onObservationDirections(observation);
}
}
}