Dbrant has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/288338

Change subject: Improve logic for storing and updating offline pages.
......................................................................

Improve logic for storing and updating offline pages.

Previously, each page in a reading list would be marked as OUTDATED every
time it was upserted for any reason, which would cause unnecessary network
requests and disk writes.

This patch updates the logic to write the page to disk only once (when
it's added to a list), and then update the page only when the user visits
the page again while online.

Change-Id: I3d073a7788894e51e4f43f7a0cc64993beb85ae2
---
M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
M 
app/src/main/java/org/wikipedia/readinglist/page/database/ReadingListPageDao.java
5 files changed, 31 insertions(+), 24 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/38/288338/1

diff --git 
a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java 
b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
index ad6ed42..1ebad2f 100755
--- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -28,7 +28,9 @@
 import org.wikipedia.page.gallery.GalleryActivity;
 import org.wikipedia.readinglist.AddToReadingListDialog;
 import org.wikipedia.readinglist.ReadingList;
+import org.wikipedia.readinglist.page.ReadingListPage;
 import org.wikipedia.readinglist.page.database.ReadingListDaoProxy;
+import org.wikipedia.readinglist.page.database.ReadingListPageDao;
 import org.wikipedia.util.DimenUtil;
 import org.wikipedia.util.UriUtil;
 import org.wikipedia.views.ObservableWebView;
@@ -99,9 +101,14 @@
 
     public void updateBookmark() {
         
ReadingList.DAO.anyListContainsTitleAsync(ReadingListDaoProxy.key(getTitle()),
-                new CallbackTask.Callback<Boolean>() {
-            @Override public void success(@NonNull Boolean bookmarked) {
-                articleHeaderView.updateBookmark(bookmarked);
+                new CallbackTask.Callback<ReadingListPage>() {
+            @Override public void success(@Nullable ReadingListPage page) {
+                articleHeaderView.updateBookmark(page != null);
+                if (page != null && page.savedOrSaving()) {
+                    // TODO: mark the page outdated only if the revision ID 
from the server
+                    // is newer than the one on disk.
+                    ReadingListPageDao.instance().markOutdated(page);
+                }
             }
         });
     }
diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
index ceb8c45..bf58f95 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
@@ -3,6 +3,7 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.concurrency.CallbackTask;
@@ -62,6 +63,7 @@
         for (ReadingListPage page : list.getPages()) {
             page.addListKey(list.key());
             ReadingListPageDao.instance().upsert(page);
+            ReadingListPageDao.instance().markOutdated(page);
         }
     }
 
@@ -120,10 +122,10 @@
     }
 
     public void anyListContainsTitleAsync(@NonNull final String key,
-                                          @NonNull 
CallbackTask.Callback<Boolean> callback) {
-        CallbackTask.execute(new CallbackTask.Task<Boolean>() {
-            @Override public Boolean execute() {
-                return anyListContainsTitle(key);
+                                          @NonNull 
CallbackTask.Callback<ReadingListPage> callback) {
+        CallbackTask.execute(new CallbackTask.Task<ReadingListPage>() {
+            @Override public ReadingListPage execute() {
+                return findPageInAnyList(key);
             }
         }, callback);
     }
@@ -153,13 +155,18 @@
         }
     }
 
-    private synchronized boolean anyListContainsTitle(String key) {
+    @Nullable
+    private synchronized ReadingListPage findPageInAnyList(String key) {
         Cursor cursor = ReadingListPageDao.instance().page(key);
         try {
-            return cursor.getCount() != 0;
+            if (cursor.getCount() != 0) {
+                cursor.moveToFirst();
+                return ReadingListPage.fromCursor(cursor);
+            }
         } finally {
             cursor.close();
         }
+        return null;
     }
 
     private synchronized void saveListInfo(@NonNull ReadingList list, @NonNull 
ReadingListPage page) {
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
index 3cf9237..1db77e8 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
@@ -29,7 +29,6 @@
 
 import org.wikipedia.R;
 import org.wikipedia.readinglist.page.ReadingListPage;
-import org.wikipedia.readinglist.page.database.ReadingListPageDao;
 import org.wikipedia.util.DimenUtil;
 import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.ResourceUtil;
@@ -156,9 +155,6 @@
                         actionListener.onUpdate(readingList, newTitle, 
newDescription, saveOffline);
                     }
                     updateDetails();
-                    if (readingList != null) {
-                        
ReadingListPageDao.instance().upsertAll(readingList.getPages());
-                    }
                 }
 
                 @Override
@@ -168,9 +164,6 @@
                         public void run() {
                             if (actionListener != null) {
                                 actionListener.onDelete(readingList);
-                            }
-                            if (readingList != null) {
-                                
ReadingListPageDao.instance().upsertAll(readingList.getPages());
                             }
                         }
                     }).show();
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
index a4586d1..7184b28 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
@@ -20,6 +20,7 @@
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.readinglist.page.ReadingListPage;
 import org.wikipedia.readinglist.page.database.ReadingListDaoProxy;
+import org.wikipedia.readinglist.page.database.ReadingListPageDao;
 import org.wikipedia.util.FeedbackUtil;
 
 import java.util.ArrayList;
@@ -193,8 +194,7 @@
         @Override
         public void onClick(ReadingList readingList, ReadingListPage page) {
             PageTitle title = ReadingListDaoProxy.pageTitle(page);
-            HistoryEntry newEntry = new HistoryEntry(title,
-                    HistoryEntry.SOURCE_READING_LIST);
+            HistoryEntry newEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_READING_LIST);
             ((PageActivity) getActivity()).loadPage(title, newEntry);
 
             ReadingList.DAO.makeListMostRecent(readingList);
@@ -236,6 +236,7 @@
             @Override
             public void onClick(View v) {
                 ReadingList.DAO.addTitleToList(readingList, page);
+                ReadingListPageDao.instance().markOutdated(page);
                 listDetailView.updateDetails();
             }
         });
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/page/database/ReadingListPageDao.java
 
b/app/src/main/java/org/wikipedia/readinglist/page/database/ReadingListPageDao.java
index 161a85e..5a772e1 100644
--- 
a/app/src/main/java/org/wikipedia/readinglist/page/database/ReadingListPageDao.java
+++ 
b/app/src/main/java/org/wikipedia/readinglist/page/database/ReadingListPageDao.java
@@ -15,6 +15,7 @@
 import org.wikipedia.readinglist.page.ReadingListPage;
 import org.wikipedia.readinglist.page.ReadingListPageRow;
 import org.wikipedia.readinglist.page.database.disk.DiskRowDao;
+import org.wikipedia.readinglist.page.database.disk.DiskStatus;
 import org.wikipedia.readinglist.page.database.disk.ReadingListPageDiskRow;
 
 import java.util.ArrayList;
@@ -76,19 +77,17 @@
             delete(row);
         } else {
             httpDao.markUpserted(new ReadingListPageHttpRow(row));
-            if (row.savedOrSaving()) {
+            if (row.diskStatus() == DiskStatus.OUTDATED) {
                 diskDao.markOutdated(new ReadingListPageDiskRow(row));
-            } else {
+            } else if (row.diskStatus() == DiskStatus.ONLINE || 
row.diskStatus() == DiskStatus.UNSAVED) {
                 diskDao.markOnline(new ReadingListPageDiskRow(row));
             }
             super.upsert(row);
         }
     }
 
-    public synchronized void upsertAll(@NonNull Collection<ReadingListPage> 
rows) {
-        for (ReadingListPage row : rows) {
-            upsert(row);
-        }
+    public synchronized void markOutdated(@NonNull ReadingListPage row) {
+        diskDao.markOutdated(new ReadingListPageDiskRow(row));
     }
 
     @NonNull public synchronized Collection<ReadingListPageDiskRow> 
startDiskTransaction() {

-- 
To view, visit https://gerrit.wikimedia.org/r/288338
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3d073a7788894e51e4f43f7a0cc64993beb85ae2
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to