/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera.data; import com.google.common.base.Preconditions; import java.util.Comparator; import java.util.Date; /** * Sort filmstrip items by newest first, then by most recently modified * then by title comparison. */ public class NewestFirstComparator implements Comparator { private final Date mNow; private static final int MILLIS_IN_DAY = 24 * 60 * 60 * 1000; /** * Construct a comparator that sorts items by newest first. We ignore future * creation dates using the supplied current date as a baseline. * * @param now present date to be used in comparisons to rule out dates in * the future. */ public NewestFirstComparator(Date now) { Preconditions.checkNotNull(now); // Buffer by 24 hours to protect against false positives due to intraday // time zone issues. mNow = new Date(now.getTime() + MILLIS_IN_DAY); } @Override public int compare(FilmstripItem d1, FilmstripItem d2) { FilmstripItemData d1Data = d1.getData(); FilmstripItemData d2Data = d2.getData(); // If creation date is in future, fall back to modified, b/19565464. Date d1PrimaryDate = isFuture(d1Data.getCreationDate()) ? d1Data.getLastModifiedDate() : d1Data.getCreationDate(); Date d2PrimaryDate = isFuture(d2Data.getCreationDate()) ? d2Data.getLastModifiedDate() : d2Data.getCreationDate(); int cmp = compareDate(d1PrimaryDate, d2PrimaryDate); if (cmp == 0) { cmp = compareDate(d1Data.getLastModifiedDate(), d2Data.getLastModifiedDate()); } if (cmp == 0) { cmp = d1Data.getTitle().compareTo(d2Data.getTitle()); } return cmp; } /** * Normal date comparison will sort these oldest first, * so invert the order by multiplying by -1. */ private int compareDate(Date v1, Date v2) { return v1.compareTo(v2) * -1; } /** * Is the Date in the future from a base date. If the date is in the future * (larger) than the base date provided, return true. * * @param date The date to check whether it is in the future * @param base The date to use as a baseline 'present' * @return true if date is in the future from base */ private boolean isFuture(Date date) { return mNow.compareTo(date) < 0; } }