Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4107)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java

Issue 2251343002: [Downloads] Animate the DateDividedAdapter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@DOWNLOADS_tests
Patch Set: Rebasing Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java
index 1a00a34083c99121a7d6a0da54d771ce3f5fd259..0b123b0c6a578500fd8486398741b4fa53fb5eff 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java
@@ -42,10 +42,16 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
* Interface that the {@link Adapter} uses to interact with the items it manages.
*/
public interface TimedItem {
+ /** @return The timestamp for this item. */
+ long getTimestamp();
+
/**
- * @return The timestamp of this item.
+ * Returns an ID that uniquely identifies this TimedItem and doesn't change.
+ * To avoid colliding with IDs generated for Date headers, at least one of the upper 32
+ * bits of the long should be set.
+ * @return ID that can uniquely identify the TimedItem.
*/
- long getStartTime();
+ long getStableId();
}
private static class DateViewHolder extends RecyclerView.ViewHolder {
@@ -93,7 +99,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
private boolean mIsSorted;
public ItemGroup(TimedItem item) {
- mDate = new Date(item.getStartTime());
+ mDate = new Date(item.getTimestamp());
mItems.add(item);
mIsSorted = true;
}
@@ -139,7 +145,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
public int compare(TimedItem lhs, TimedItem rhs) {
// More recent items are listed first. Ideally we'd use Long.compare, but that
// is an API level 19 call for some inexplicable reason.
- long timeDelta = lhs.getStartTime() - rhs.getStartTime();
+ long timeDelta = lhs.getTimestamp() - rhs.getTimestamp();
if (timeDelta > 0) {
return -1;
} else if (timeDelta == 0) {
@@ -192,7 +198,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
mSize = 0;
mItems.clear();
for (TimedItem timedItem : timedItems) {
- Date date = new Date(timedItem.getStartTime());
+ Date date = new Date(timedItem.getTimestamp());
boolean found = false;
for (ItemGroup item : mItems) {
if (item.isSameDay(date)) {
@@ -221,6 +227,14 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
notifyDataSetChanged();
}
+ @Override
+ public long getItemId(int position) {
+ if (!hasStableIds()) return RecyclerView.NO_ID;
+
+ Pair<Date, TimedItem> pair = getItemAt(position);
+ return pair.second == null ? getStableIdFromDate(pair.first) : pair.second.getStableId();
+ }
+
/**
* Gets the item at the given position. For date headers, {@link TimedItem} will be null; for
* normal items, {@link Date} will be null.
@@ -281,6 +295,21 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
}
/**
+ * Creates a long ID that identifies a particular day in history.
+ * @param date Date to process.
+ * @return Long that has the day of the year (1-365) in the lowest 16 bits and the year in the
+ * next 16 bits over.
+ */
+ private static long getStableIdFromDate(Date date) {
+ Pair<Calendar, Calendar> pair = getCachedCalendars();
+ Calendar calendar = pair.first;
+ calendar.setTime(date);
+ long dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+ long year = calendar.get(Calendar.YEAR);
+ return (year << 16) + dayOfYear;
+ }
+
+ /**
* Compares two {@link Date}s. Note if you already have two {@link Calendar} objects, use
* {@link #compareCalendar(Calendar, Calendar)} instead.
* @return 0 if date1 and date2 are in the same day; 1 if date1 is before date2; -1 otherwise.
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698