Sharvaniharan has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/403756 )

Change subject: Split large reading lists
......................................................................

Split large reading lists

- Split existing lists > 1000 on version update
- Split lists when articles are added, if they exceed 1000 counts
- Show UI feedback before splitting

Bug: T180229
Change-Id: I898ed21d884cce0474cee706b762b3e4d23267c4
---
A app/src/main/java/org/wikipedia/events/SplitLargeListsEvent.java
M app/src/main/java/org/wikipedia/main/MainActivity.java
M app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/strings.xml
5 files changed, 79 insertions(+), 0 deletions(-)


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

diff --git a/app/src/main/java/org/wikipedia/events/SplitLargeListsEvent.java 
b/app/src/main/java/org/wikipedia/events/SplitLargeListsEvent.java
new file mode 100644
index 0000000..f779056
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/events/SplitLargeListsEvent.java
@@ -0,0 +1,4 @@
+package org.wikipedia.events;
+
+public class SplitLargeListsEvent {
+}
diff --git a/app/src/main/java/org/wikipedia/main/MainActivity.java 
b/app/src/main/java/org/wikipedia/main/MainActivity.java
index 2454a32..6ed0e4a 100644
--- a/app/src/main/java/org/wikipedia/main/MainActivity.java
+++ b/app/src/main/java/org/wikipedia/main/MainActivity.java
@@ -1,16 +1,22 @@
 package org.wikipedia.main;
 
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v7.app.AlertDialog;
 import android.support.v7.view.ActionMode;
 import android.view.View;
 
+import com.squareup.otto.Subscribe;
+
 import org.wikipedia.R;
+import org.wikipedia.WikipediaApp;
 import org.wikipedia.activity.SingleFragmentToolbarActivity;
 import org.wikipedia.appshortcuts.AppShortcuts;
+import org.wikipedia.events.SplitLargeListsEvent;
 import org.wikipedia.navtab.NavTab;
 import org.wikipedia.onboarding.InitialOnboardingActivity;
 import org.wikipedia.settings.Prefs;
@@ -23,6 +29,8 @@
         return new Intent(context, MainActivity.class);
     }
 
+    private EventBusMethods busMethods;
+
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -32,6 +40,14 @@
         if (Prefs.isInitialOnboardingEnabled() && savedInstanceState == null) {
             startActivity(InitialOnboardingActivity.newIntent(this));
         }
+        busMethods = new EventBusMethods();
+        registerBus();
+    }
+
+    @Override
+    public void onDestroy() {
+        unregisterBus();
+        super.onDestroy();
     }
 
     @Override protected MainFragment createFragment() {
@@ -117,4 +133,29 @@
         }
         finish();
     }
+
+    private void registerBus() {
+        WikipediaApp.getInstance().getBus().register(busMethods);
+    }
+
+    private void unregisterBus() {
+        if (WikipediaApp.getInstance().getBus() != null) {
+            WikipediaApp.getInstance().getBus().unregister(busMethods);
+        }
+    }
+
+    private class EventBusMethods {
+        @Subscribe
+        public void on(SplitLargeListsEvent event) {
+            showLargeListSplitMessage();
+        }
+    }
+
+    private void showLargeListSplitMessage() {
+        new AlertDialog.Builder(this)
+                .setMessage(R.string.split_reading_list_message)
+                .setPositiveButton(R.string.ok,
+                        (DialogInterface dialogInterface, int i) -> 
dialogInterface.dismiss())
+                .show();
+    }
 }
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
 
b/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
index 262a842..5a1eccb 100644
--- 
a/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
+++ 
b/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
@@ -14,6 +14,7 @@
 import org.wikipedia.database.contract.OldReadingListPageContract;
 import org.wikipedia.database.contract.ReadingListPageContract;
 import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.events.SplitLargeListsEvent;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.util.log.L;
 
@@ -23,6 +24,8 @@
 
 public class ReadingListPageTable extends DatabaseTable<ReadingListPage> {
     private static final int DB_VER_INTRODUCED = 18;
+    private static final int MAX_ARTICLE_LIMIT = 1000;
+    private boolean userLargeListsMessageShown = false;
 
     public ReadingListPageTable() {
         super(ReadingListPageContract.TABLE, ReadingListPageContract.URI);
@@ -190,6 +193,13 @@
                         }
                     }
                 }
+
+                for (ReadingList list : lists) {
+                    if (list.pages().size() > MAX_ARTICLE_LIMIT) {
+                        spiltLargeList(db, list, lists);
+                    }
+                }
+
                 for (ReadingList list : lists) {
                     ReadingListDbHelper.instance().addPagesToList(db, list, 
list.pages());
                 }
@@ -208,4 +218,24 @@
     @NonNull private static String getListKey(@NonNull String title) {
         return Base64.encodeToString(title.getBytes(), Base64.NO_WRAP);
     }
+
+    private void spiltLargeList(SQLiteDatabase db, ReadingList readingList, 
List<ReadingList> lists) {
+        if (!userLargeListsMessageShown) {
+            WikipediaApp.getInstance().getBus().post(new 
SplitLargeListsEvent());
+            userLargeListsMessageShown = true;
+        }
+        int index = readingList.title().split("_").length == 1 ? 1 : 
Integer.valueOf(readingList.title().split("_")[1]) + 1;
+        List<ReadingListPage> toBeAddedList = new ArrayList<>();
+        if (readingList.pages().size() <= MAX_ARTICLE_LIMIT) {
+            return;
+        }
+        for (int j = MAX_ARTICLE_LIMIT; j < readingList.pages().size(); j++) {
+            toBeAddedList.add(readingList.pages().get(j));
+        }
+        readingList.pages().removeAll(toBeAddedList);
+        ReadingList newList = ReadingListDbHelper.instance().createList(db, 
String.format(WikipediaApp.getInstance().getString(R.string.split_list_name), 
readingList.title().split("_")[0], index), readingList.description());
+        newList.pages().addAll(toBeAddedList);
+        lists.add(newList);
+        spiltLargeList(db, newList, lists);
+    }
 }
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index 5b5c33a..dfdb9a5 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -367,6 +367,8 @@
   <string name="no_user_lists_title">Suggestion string for users to Organize 
articles into lists</string>
   <string name="no_user_lists_msg">Text explaining the advantages of creating 
reading lists, to users</string>
   <string name="reading_list_saved_list_rename">\"%1$s\" _[string indicating 
that the list was created by user]</string>
+  <string name="split_list_name">Name string for the newly created lists from 
the original large list that will be split. \"%1$s\" is the name of the 
original list followed by _ and \"%2$d\" being the postfix number</string>
+  <string name="split_reading_list_message">Message shown to users with large 
reading lists, informing them that this update will enforce an upper limit of 
1000 articles per list and hence will be splitting already existing lists that 
contain more than 1000 articles</string>
   <plurals name="reading_list_article_offline_message">
     <item quantity="one">Message shown when a single reading list article is 
made available for offline use.</item>
     <item quantity="other">Message shown when more than one reading list 
article is made available for offline use.</item>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 7f87d6c..8e5c3a4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -392,6 +392,8 @@
     <string name="no_user_lists_title">Organize articles into lists</string>
     <string name="no_user_lists_msg">Create lists for places to travel to, 
favorite topics, and much more</string>
     <string name="reading_list_saved_list_rename">%1$s (user created)</string>
+    <string name="split_list_name">%1$s_%2$d</string>
+    <string name="split_reading_list_message">There is a limit of 1000 
articles per synced reading list. Existing lists with more than this limit have 
been split into multiple lists.</string>
     <plurals name="reading_list_article_offline_message">
         <item quantity="one">This article will now be available offline.</item>
         <item quantity="other">These articles will now be available 
offline.</item>

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

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

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

Reply via email to