package org.witness.informacam.models.media; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.NoSuchElementException; import org.witness.informacam.InformaCam; import org.witness.informacam.models.Model; import org.witness.informacam.utils.TimeUtility; import org.witness.informacam.utils.Constants.Models; import org.witness.informacam.utils.Constants.Models.IMedia.MimeType; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import android.util.Log; public class IMediaManifest extends Model { public List<IMedia> listMedia = new ArrayList<IMedia>(); public IMediaManifest() {} public boolean save() { synchronized (this) { return InformaCam.getInstance().saveState(this); } } public List<IMedia> getMediaList () { return listMedia; } public IMedia getMediaItem (int id) { return listMedia.get(id); } public int getMediaItemLocation (IMedia media) { return listMedia.indexOf(media); } public boolean removeMediaItem (IMedia mediaToRemove) { synchronized (this) { boolean res = listMedia.remove(mediaToRemove); save(); return res; } } public boolean addMediaItem (IMedia mediaToAdd) { synchronized (this) { boolean res = listMedia.add(mediaToAdd); save(); return res; } } @SuppressWarnings({ "unchecked", "rawtypes" }) public List getAllByType(final String mimeType) { Collection<IMedia> media_ = Collections2.filter(listMedia, new Predicate<IMedia>() { @Override public boolean apply(IMedia m) { return m.dcimEntry.mediaType.equals(mimeType); } }); return new ArrayList(media_); } public IMedia getById(final String mediaId) { Collection<IMedia> media_ = Collections2.filter(listMedia, new Predicate<IMedia>() { @Override public boolean apply(IMedia m) { return m._id.equals(mediaId); } }); try { return media_.iterator().next(); } catch(NullPointerException e) { return null; } catch(NoSuchElementException e) { return null; } } public List<IMedia> getByDay(long timestamp, String mimeType) { return getByDay(timestamp, mimeType, -1); } public List<IMedia> getByDay(long timestamp) { return getByDay(timestamp, null, -1); } public List<IMedia> getByDay(final long timestamp, final String mimeType, int limit) { @SuppressWarnings("unchecked") Collection<IMedia> media_ = Collections2.filter(mimeType == null ? listMedia : getAllByType(mimeType), new Predicate<IMedia>() { @Override public boolean apply(IMedia m) { if(m.dcimEntry.mediaType.equals(MimeType.LOG)) { return TimeUtility.matchesDay(timestamp, ((ILog) m).startTime); } else { return TimeUtility.matchesDay(timestamp, m.dcimEntry.timeCaptured); } } }); if(limit != -1) { return new ArrayList<IMedia>(media_).subList(0, Math.min(media_.size(), limit)); } return new ArrayList<IMedia>(media_); } public List<IMedia> sortBy(int order) { if(listMedia == null || listMedia.size() == 0) { Log.d(LOG, "NO IT IS NULL NOW"); return null; } List<IMedia> _listMedia = new ArrayList<IMedia>(); switch(order) { case Models.IMediaManifest.Sort.DATE_DESC: Comparator<IMedia> DateDesc = new Comparator<IMedia>() { @Override public int compare(IMedia m1, IMedia m2) { return m1.dcimEntry.timeCaptured > m2.dcimEntry.timeCaptured ? -1 : (m1==m2 ? 0 : 1); } }; Collections.sort(listMedia, DateDesc); return listMedia; case Models.IMediaManifest.Sort.DATE_ASC: Comparator<IMedia> DateAsc = new Comparator<IMedia>() { @Override public int compare(IMedia m1, IMedia m2) { return m1.dcimEntry.timeCaptured < m2.dcimEntry.timeCaptured ? -1 : (m1==m2 ? 0 : 1); } }; Collections.sort(listMedia, DateAsc); return listMedia; case Models.IMediaManifest.Sort.TYPE_PHOTO: for(IMedia m : listMedia) { if(m.dcimEntry.mediaType.equals(MimeType.IMAGE)) { _listMedia.add(m); } } break; case Models.IMediaManifest.Sort.TYPE_VIDEO: for(IMedia m : listMedia) { if(m.dcimEntry.mediaType.startsWith(MimeType.VIDEO_BASE)) { _listMedia.add(m); } } break; } return _listMedia; } public void setAllAsOld() { for(IMedia m : listMedia) { m.isNew = false; } //save(); } }