Return POSITION_NONE in `destroyItem` for null

Phillip Davis created

Can't provoke the race, but my theory about
https://todo.sr.ht/~singpolyma/soprani.ca/599 is that it's caused by `o
== page1.get()` (or `page2.get()`) evaluating to `true` when
`page1.get() == null`, causing the item to stick around in the dataset,
e.g., during device rotation or some other situation where the view is
destroyed, and breaking ViewPager's internal bookkeeping

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java | 12 ++
1 file changed, 10 insertions(+), 2 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -2071,8 +2071,16 @@ public class Conversation extends AbstractEntity
         @Override
         public int getItemPosition(Object o) {
             if (mPager.get() != null) {
-                if (o == page1.get()) return PagerAdapter.POSITION_UNCHANGED;
-                if (o == page2.get()) return PagerAdapter.POSITION_UNCHANGED;
+                final var page1Deref = page1.get();
+                if (o == page1Deref) {
+                    if (page1Deref == null) return PagerAdapter.POSITION_NONE;
+                    else return PagerAdapter.POSITION_UNCHANGED;
+                }
+                final var page2Deref = page2.get();
+                if (o == page2Deref) {
+                    if (page2Deref == null) return PagerAdapter.POSITION_NONE;
+                    else return PagerAdapter.POSITION_UNCHANGED;
+                }
             }
 
             int pos = sessions == null ? -1 : sessions.indexOf(o);