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

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

Issue 2670083002: [Download Home] Displaying offline page bundle per day (Closed)
Patch Set: Modified removeItem Created 3 years, 10 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
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 3c10048252ca4e2cc54549019eac13f6913cc7a2..b2ec1635a0396cad302c201b9d7986a1ffdfc24b 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
@@ -16,7 +16,6 @@ import android.view.ViewGroup;
import android.widget.TextView;
import org.chromium.chrome.R;
-import org.chromium.chrome.browser.widget.DateDividedAdapter.ItemGroup;
import java.util.ArrayList;
import java.util.Calendar;
@@ -53,7 +52,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
private boolean mIsLastInGroup;
/** See {@link #mPosition}. */
- private final void setPosition(int position) {
+ public final void setPosition(int position) {
mPosition = position;
}
@@ -152,9 +151,9 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
/**
* A bucket of items with the same date.
*/
- protected static class ItemGroup {
- private final Date mDate;
- private final List<TimedItem> mItems = new ArrayList<>();
+ public static class ItemGroup {
+ protected final Date mDate;
+ protected final List<TimedItem> mItems = new ArrayList<>();
/** Index of the header, relative to the full list. Must be set only once.*/
private int mIndex;
@@ -183,15 +182,26 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
mIndex = index;
sortIfNeeded();
+ setPositionForItems(index + 1);
+ markFirstAndLastItem();
+ }
+
+ protected void setPositionForItems(int startIndex) {
+ int index = startIndex;
for (int i = 0; i < mItems.size(); i++) {
- index += 1;
TimedItem item = mItems.get(i);
item.setPosition(index);
- item.setIsFirstInGroup(i == 0);
- item.setIsLastInGroup(i == mItems.size() - 1);
+ index += 1;
}
}
+ protected void markFirstAndLastItem() {
+ TimedItem first = mItems.get(0);
+ TimedItem last = mItems.get(mItems.size() - 1);
+ first.setIsFirstInGroup(true);
+ last.setIsLastInGroup(true);
+ }
+
/** Unsets the position of all TimedItems in this group. */
public void resetPosition() {
mIndex = TimedItem.INVALID_POSITION;
@@ -212,7 +222,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
if (mIsListHeader || mIsListFooter) return 1;
// Plus 1 to account for the date header.
- return mItems.size() + 1;
+ return mItems.isEmpty() ? 0 : mItems.size() + 1;
}
public TimedItem getItemAt(int index) {
@@ -220,6 +230,10 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
if (index == 0 || mIsListHeader || mIsListFooter) return null;
sortIfNeeded();
+ return getItemAtInternal(index);
+ }
+
+ protected TimedItem getItemAtInternal(int index) {
return mItems.get(index - 1);
}
@@ -227,26 +241,44 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
* Rather than sorting the list each time a new item is added, the list is sorted when
* something requires a correct ordering of the items.
*/
- private void sortIfNeeded() {
+ protected void sortIfNeeded() {
if (mIsSorted) return;
mIsSorted = true;
Collections.sort(mItems, new Comparator<TimedItem>() {
@Override
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.getTimestamp() - rhs.getTimestamp();
- if (timeDelta > 0) {
- return -1;
- } else if (timeDelta == 0) {
- return 0;
- } else {
- return 1;
- }
+ return compareItem(lhs, rhs);
}
});
}
+
+ protected int compareItem(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.getTimestamp() - rhs.getTimestamp();
+ if (timeDelta > 0) {
+ return -1;
+ } else if (timeDelta == 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+
+ public int getItemViewType(int position) {
+ return position == 0 ? TYPE_DATE : TYPE_NORMAL;
+ }
+
+ /**
+ * Returns the number of rows that should be removed when the given item is deleted.
+ * e.g. When the last item is deleted, the date header should also be removed.
+ * @param item The item to be removed.
+ * @return The number of rows to be removed.
+ */
+ public int getNumberOfRowsToBeRemovedForItem(TimedItem item) {
Theresa 2017/02/13 19:15:00 Instead of introducing this method, can ItemGroup#
+ return mItems.size() == 1 ? 2 : 1;
+ }
}
// Cached async tasks to get the two Calendar objects, which are used when comparing dates.
@@ -257,6 +289,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
public static final int TYPE_HEADER = -1;
public static final int TYPE_DATE = 0;
public static final int TYPE_NORMAL = 1;
+ public static final int TYPE_SUBSECTION_HEADER = 2;
private int mSize;
private boolean mHasListHeader;
@@ -282,6 +315,14 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
protected abstract ViewHolder createViewHolder(ViewGroup parent);
/**
+ * Creates a {@link ViewHolder} for a subsection in the given view parent.
+ * @see #onCreateViewHolder(ViewGroup, int)
+ */
+ protected ViewHolder createSubsectionHeader(ViewGroup parent) {
+ return null;
+ }
+
+ /**
* Creates a {@link BasicViewHolder} in the given view parent for the header.
* @see #onCreateViewHolder(ViewGroup, int)
*/
@@ -330,28 +371,31 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
if (group.isSameDay(date)) {
found = true;
group.addItem(timedItem);
- mSize++;
break;
}
}
if (!found) {
// Create a new ItemGroup with the date for the new item. This increases the
// size by two because we add new views for the date and the item itself.
- ItemGroup newGroup = new ItemGroup(timedItem.getTimestamp());
+ ItemGroup newGroup = createGroup(timedItem.getTimestamp());
newGroup.addItem(timedItem);
mGroups.add(newGroup);
- mSize += 2;
}
}
+ computeItemCount();
setGroupPositions();
notifyDataSetChanged();
}
+ protected ItemGroup createGroup(long timestamp) {
+ return new ItemGroup(timestamp);
+ }
+
/**
* Tells each group where they start in the list.
*/
- private void setGroupPositions() {
+ protected void setGroupPositions() {
int startIndex = 0;
for (ItemGroup group : mGroups) {
group.resetPosition();
@@ -461,15 +505,14 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
return TYPE_HEADER;
} else if (pair.second == TYPE_FOOTER) {
return TYPE_FOOTER;
- } else if (pair.second == 0) {
- return TYPE_DATE;
} else {
- return TYPE_NORMAL;
+ ItemGroup group = pair.first;
+ return group.getItemViewType(pair.second);
}
}
@Override
- public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_DATE) {
return createDateViewHolder(parent);
} else if (viewType == TYPE_NORMAL) {
@@ -478,13 +521,15 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
return createHeader(parent);
} else if (viewType == TYPE_FOOTER) {
return createFooter(parent);
+ } else if (viewType == TYPE_SUBSECTION_HEADER) {
+ return createSubsectionHeader(parent);
}
assert false;
return null;
}
@Override
- public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Pair<Date, TimedItem> pair = getItemAt(position);
if (holder instanceof DateViewHolder) {
((DateViewHolder) holder).setDate(pair.first);
@@ -530,19 +575,26 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
*/
protected void removeItem(TimedItem item) {
ItemGroup group = getGroupAt(item.getPosition()).first;
+ int numRowsToRemove = group.getNumberOfRowsToBeRemovedForItem(item);
group.removeItem(item);
- mSize--;
- // Remove the group if only the date header is left.
- if (group.size() == 1) {
+ // Remove the group if it is empty.
+ if (group.size() == 0) {
mGroups.remove(group);
- mSize--;
}
+ mSize -= numRowsToRemove;
setGroupPositions();
notifyDataSetChanged();
}
+ protected void computeItemCount() {
+ mSize = 0;
+ for (ItemGroup group : mGroups) {
+ mSize += group.size();
+ }
+ }
+
/**
* Creates a long ID that identifies a particular day in history.
* @param date Date to process.
@@ -563,7 +615,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder
* {@link #compareCalendar(Calendar, Calendar)} instead.
* @return 0 if date1 and date2 are in the same day; 1 if date1 is before date2; -1 otherwise.
*/
- private static int compareDate(Date date1, Date date2) {
+ protected static int compareDate(Date date1, Date date2) {
Pair<Calendar, Calendar> pair = getCachedCalendars();
Calendar cal1 = pair.first, cal2 = pair.second;
cal1.setTime(date1);

Powered by Google App Engine
This is Rietveld 408576698