jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/362226 )

Change subject: Bulk reading list actions, pt. 2: bulk add to list
......................................................................


Bulk reading list actions, pt. 2: bulk add to list

Bug: T160637
Change-Id: I6e4892a71dce5743937caca9771e48cc75e61be8
---
M app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
M 
app/src/main/java/org/wikipedia/readinglist/page/database/ReadingListPageDao.java
A 
app/src/test/java/org/wikipedia/readinglist/page/database/ReadingListPageDaoTest.java
5 files changed, 89 insertions(+), 9 deletions(-)

Approvals:
  Dbrant: Looks good to me, approved
  jenkins-bot: Verified



diff --git 
a/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java 
b/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
index 4648d90..c46e3c6 100644
--- a/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
+++ b/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
@@ -31,7 +31,9 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class AddToReadingListDialog extends ExtendedBottomSheetDialogFragment {
     public enum InvokeSource implements EnumCode {
@@ -229,8 +231,9 @@
     private void addAndDismiss(final ReadingList readingList, final 
List<PageTitle> titles) {
         if (titles.size() == 1) {
             addAndDismiss(readingList, titles.get(0));
+            return;
         }
-        /*final Map<String, ReadingListPage> pages = new HashMap<>();
+        final Map<String, ReadingListPage> pages = new HashMap<>();
         for (PageTitle title : titles) {
             ReadingListPage page = findOrCreatePage(readingList, title);
             pages.put(page.key(), page);
@@ -257,7 +260,7 @@
                     dismiss();
                 }
             }
-        });*/
+        });
     }
 
     private void showViewListSnackBar(@NonNull final ReadingList readingList, 
@NonNull String message) {
diff --git a/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
index c6f970e..b1999e7 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListData.java
@@ -149,6 +149,15 @@
         }, callback);
     }
 
+    public void titlesNotInListAsync(@NonNull final String listKey, @NonNull 
final List<String> keys,
+                                     @NonNull 
CallbackTask.Callback<List<String>> callback) {
+        CallbackTask.execute(new CallbackTask.Task<List<String>>() {
+            @Override public List<String> execute() throws Throwable {
+                return titlesNotInList(listKey, keys);
+            }
+        }, callback);
+    }
+
     public synchronized void saveListInfo(@NonNull ReadingList list) {
         listClient().persist(list);
     }
@@ -179,6 +188,24 @@
         }
     }
 
+
+    private synchronized List<String> titlesNotInList(@NonNull String listKey, 
@NonNull List<String> keys) {
+        Cursor cursor = ReadingListPageDao.instance().pages(keys);
+        List<String> result = new ArrayList<>();
+        try {
+            while (cursor.moveToNext()) {
+                ReadingListPage page = ReadingListPage.fromCursor(cursor);
+                if (!page.listKeys().contains(listKey)) {
+                    result.add(page.key());
+                }
+            }
+            return result;
+        } finally {
+            cursor.close();
+        }
+    }
+
+
     @Nullable
     private synchronized ReadingListPage findPageInAnyList(String key) {
         Cursor cursor = ReadingListPageDao.instance().page(key);
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
index 82e7d44..4140b7f 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
@@ -777,7 +777,7 @@
                     finishActionMode();
                     return true;
                 case R.id.menu_add_to_another_list:
-                    // addSelectedPagesToList();
+                    addSelectedPagesToList();
                     finishActionMode();
                     return true;
                 default:
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 d62de97..0ae8777 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
@@ -4,6 +4,7 @@
 import android.net.Uri;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
 
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.concurrency.CallbackTask;
@@ -21,6 +22,8 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.Random;
 
 public final class ReadingListPageDao extends BaseDao<ReadingListPageRow> {
@@ -35,9 +38,13 @@
     }
 
     @NonNull public Cursor page(@NonNull String key) {
+        return pages(Collections.singletonList(key));
+    }
+
+    @NonNull public Cursor pages(@NonNull List<String> keys) {
         Uri uri = ReadingListPageContract.PageWithDisk.URI;
-        String selection = Sql.SELECT_ROWS_WITH_KEY;
-        String[] selectionArgs = new String[] {key};
+        String selection = Sql.getSelectRowsWithKeysString(keys.size());
+        String[] selectionArgs = keys.toArray(new String[keys.size()]);
         String order = ReadingListPageContract.PageWithDisk.ORDER_ALPHABETICAL;
         return client().select(uri, selection, selectionArgs, order);
     }
@@ -182,12 +189,24 @@
         diskDao = new 
DiskRowDao<>(WikipediaApp.getInstance().getDatabaseClient(ReadingListPageDiskRow.class));
     }
 
-    private static class Sql {
-        private static final String SELECT_ROWS_WITH_KEY = ":keyCol == ?"
-            .replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName());
+    @VisibleForTesting static class Sql {
+        @VisibleForTesting static String getSelectRowsWithKeysString(int 
params) {
+            if (params < 0) {
+                throw new IllegalArgumentException();
+            }
+            if (params < 2) {
+                return ":keyCol == ?".replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName());
+            }
+            StringBuilder result = new StringBuilder(":keyCol IN (?");
+            for (int i = 2; i <= params; i++) {
+                result.append(",?");
+            }
+            result.append(")");
+            return result.toString().replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName());
+        }
 
         private static final String SELECT_ROWS_WITH_LIST_KEY = "',' || 
:listKeyCol || ',' like '%,' || ? || ',%'"
-             .replaceAll(":listKeyCol", 
ReadingListPageContract.Page.LIST_KEYS.qualifiedName());
+            .replaceAll(":listKeyCol", 
ReadingListPageContract.Page.LIST_KEYS.qualifiedName());
 
         private static String SELECT_ROWS_PENDING_DISK_TRANSACTION = 
":transactionIdCol == :noTransactionId"
             .replaceAll(":transactionIdCol", 
ReadingListPageContract.DiskWithPage.DISK_TRANSACTION_ID.qualifiedName())
diff --git 
a/app/src/test/java/org/wikipedia/readinglist/page/database/ReadingListPageDaoTest.java
 
b/app/src/test/java/org/wikipedia/readinglist/page/database/ReadingListPageDaoTest.java
new file mode 100644
index 0000000..630dbdf
--- /dev/null
+++ 
b/app/src/test/java/org/wikipedia/readinglist/page/database/ReadingListPageDaoTest.java
@@ -0,0 +1,31 @@
+package org.wikipedia.readinglist.page.database;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.wikipedia.database.contract.ReadingListPageContract;
+import org.wikipedia.test.TestRunner;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+// TODO: expand!
+@RunWith(TestRunner.class) public class ReadingListPageDaoTest {
+
+    @Test @SuppressWarnings("checkstyle:magicnumber") public void 
getSelectRowsWithKeysString() throws Throwable {
+        assertThat(ReadingListPageDao.Sql.getSelectRowsWithKeysString(0),
+                is(":keyCol == ?".replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName())));
+
+        assertThat(ReadingListPageDao.Sql.getSelectRowsWithKeysString(1),
+                is(":keyCol == ?".replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName())));
+
+        assertThat(ReadingListPageDao.Sql.getSelectRowsWithKeysString(2),
+                is(":keyCol IN (?,?)".replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName())));
+
+        assertThat(ReadingListPageDao.Sql.getSelectRowsWithKeysString(3),
+                is(":keyCol IN (?,?,?)".replaceAll(":keyCol", 
ReadingListPageContract.Page.KEY.qualifiedName())));
+    }
+
+    @Test(expected = IllegalArgumentException.class) public void 
testGetSelectRowsWithKeysStringIllegalArg() {
+        ReadingListPageDao.Sql.getSelectRowsWithKeysString(-1);
+    }
+}

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I6e4892a71dce5743937caca9771e48cc75e61be8
Gerrit-PatchSet: 6
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <mhollo...@wikimedia.org>
Gerrit-Reviewer: Dbrant <dbr...@wikimedia.org>
Gerrit-Reviewer: Niedzielski <sniedziel...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to