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