Bug 1319254 - Pre: implement stable IDs for AS RecyclerView r?sebastian draft
authorAndrzej Hunt <ahunt@mozilla.com>
Mon, 12 Dec 2016 14:25:03 -0800
changeset 448766 05100cca473f4681d6d53e7388bd49b0f5af24cc
parent 448765 7da967d8dcf857e8db5d8f330e085a4c2556d507
child 448767 336c5760cc8c57aaacc372531af5885bc316b58a
child 448794 b3246aa7bbe4e2e12d7e8fe702848fac485d4020
push id38430
push userahunt@mozilla.com
push dateMon, 12 Dec 2016 23:19:02 +0000
reviewerssebastian
bugs1319254
milestone53.0a1
Bug 1319254 - Pre: implement stable IDs for AS RecyclerView r?sebastian MozReview-Commit-ID: KfAswxOU8Nw
mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
@@ -27,16 +27,20 @@ public class StreamRecyclerAdapter exten
 
     private HomePager.OnUrlOpenListener onUrlOpenListener;
     private HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener;
 
     private int tiles;
     private int tilesWidth;
     private int tilesHeight;
 
+    public StreamRecyclerAdapter() {
+        setHasStableIds(true);
+    }
+
     void setOnUrlOpenListeners(HomePager.OnUrlOpenListener onUrlOpenListener, HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
         this.onUrlOpenListener = onUrlOpenListener;
         this.onUrlOpenInBackgroundListener = onUrlOpenInBackgroundListener;
     }
 
     public void setTileSize(int tiles, int tilesWidth, int tilesHeight) {
         this.tilesWidth = tilesWidth;
         this.tilesHeight = tilesHeight;
@@ -133,9 +137,50 @@ public class StreamRecyclerAdapter exten
         notifyDataSetChanged();
     }
 
     public void swapTopSitesCursor(Cursor cursor) {
         this.topSitesCursor = cursor;
 
         notifyItemChanged(0);
     }
+
+    @Override
+    public long getItemId(int position) {
+        final int type = getItemViewType(position);
+
+        // To avoid having clashing IDs, we:
+        // - use history ID's as is
+        // - use hardcoded negative ID's for fixed panels
+        // - multiply bookmark ID's by -1 to not clash with history, and add an offset to not
+        //   clash with the fixed panels above
+        final int offset = -10;
+
+        // RecyclerView.NO_ID is -1, so start our hard-coded IDs at -2.
+        switch (type) {
+            case TopPanel.LAYOUT_ID:
+                return -2;
+            case HighlightsTitle.LAYOUT_ID:
+                return -3;
+            case HighlightItem.LAYOUT_ID:
+                final int cursorPosition = translatePositionToCursor(position);
+                highlightsCursor.moveToPosition(cursorPosition);
+
+                final long historyID = highlightsCursor.getLong(highlightsCursor.getColumnIndexOrThrow(BrowserContract.Combined.HISTORY_ID));
+                final boolean isHistory = -1 != historyID;
+
+                if (isHistory) {
+                    return historyID;
+                }
+
+                final long bookmarkID = highlightsCursor.getLong(highlightsCursor.getColumnIndexOrThrow(BrowserContract.Combined.BOOKMARK_ID));
+                final boolean isBookmark = -1 != bookmarkID;
+
+                if (isBookmark) {
+                    return -1 * bookmarkID + offset;
+                }
+
+                throw new IllegalArgumentException("Unhandled highlight type in getItemId - has no history or bookmark ID");
+            default:
+                throw new IllegalArgumentException("StreamItem with LAYOUT_ID=" + type + " not handled in getItemId()");
+        }
+    }
 }