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 <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits