Brion VIBBER has uploaded a new change for review.

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

Change subject: Data migration for old saved pages -> bookmarks
......................................................................

Data migration for old saved pages -> bookmarks

This is done once on first launch, synchronously.
Should still be pretty fast since it's only saving the page title entries,
not fetching any of their data.

Change-Id: I4063447c9f29e4267cf547de040ddcf871dd7816
---
M wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
A wikipedia/src/main/java/org/wikipedia/migration/ArticleImporter.java
A wikipedia/src/main/java/org/wikipedia/migration/DataMigrator.java
3 files changed, 143 insertions(+), 0 deletions(-)


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

diff --git a/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java 
b/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
index 54bf450..102a3b7 100644
--- a/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
+++ b/wikipedia/src/main/java/org/wikipedia/WikipediaApp.java
@@ -7,10 +7,12 @@
 import android.net.*;
 import android.os.*;
 import android.preference.*;
+import android.util.Log;
 import android.webkit.*;
 import com.squareup.otto.*;
 import org.acra.*;
 import org.acra.annotation.*;
+import org.json.JSONObject;
 import org.mediawiki.api.json.*;
 import org.wikipedia.analytics.*;
 import org.wikipedia.data.*;
@@ -18,6 +20,8 @@
 import org.wikipedia.editing.summaries.*;
 import org.wikipedia.history.*;
 import org.wikipedia.login.*;
+import org.wikipedia.migration.ArticleImporter;
+import org.wikipedia.migration.DataMigrator;
 import org.wikipedia.networking.*;
 import org.wikipedia.pageimages.*;
 import org.wikipedia.bookmarks.*;
@@ -99,6 +103,24 @@
             throw new RuntimeException(e);
         }
 
+        try {
+            DataMigrator dataMigrator = new DataMigrator(this);
+            if (dataMigrator.hasData()) {
+                // whee
+                Log.d("Wikipedia", "Migrating old app data...");
+                ArticleImporter articleImporter = new ArticleImporter(this);
+                List<JSONObject> pages = dataMigrator.extractSavedPages();
+                Log.d("Wikipedia", "Importing " + pages.size() + " old saved 
pages as bookmarks...");
+                articleImporter.importArticles(pages);
+                Log.d("Wikipedia", "Deleting old saved pages table");
+                dataMigrator.removeOldData();
+                Log.d("Wikipedia", "Migration done.");
+            } else {
+                Log.d("Wikipedia", "No old app data to migrate");
+            }
+        } catch (Exception e) {
+            Log.d("Wikipedia", "Migration code fail: " + e);
+        }
     }
 
     public Bus getBus() {
diff --git 
a/wikipedia/src/main/java/org/wikipedia/migration/ArticleImporter.java 
b/wikipedia/src/main/java/org/wikipedia/migration/ArticleImporter.java
new file mode 100644
index 0000000..2434221
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/migration/ArticleImporter.java
@@ -0,0 +1,35 @@
+package org.wikipedia.migration;
+
+import org.json.JSONObject;
+import org.wikipedia.PageTitle;
+import org.wikipedia.Site;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.bookmarks.Bookmark;
+import org.wikipedia.bookmarks.BookmarkPersister;
+
+import android.content.Context;
+import java.util.List;
+
+public class ArticleImporter {
+    private final WikipediaApp app;
+
+    public ArticleImporter(Context context) {
+        app = (WikipediaApp) context.getApplicationContext();
+    }
+
+    public void importArticles(List<JSONObject> articles) {
+        //
+        BookmarkPersister persister = (BookmarkPersister) 
app.getPersister(Bookmark.class);
+
+        for (JSONObject item : articles) {
+            PageTitle title = titleForItem(item);
+            Bookmark bookmark = new Bookmark(title);
+            persister.upsert(bookmark);
+        }
+    }
+
+    private PageTitle titleForItem(JSONObject item) {
+        Site site = new Site(item.optString("lang") + ".wikipedia.org");
+        return new PageTitle(null, item.optString("title"), site);
+    }
+}
diff --git a/wikipedia/src/main/java/org/wikipedia/migration/DataMigrator.java 
b/wikipedia/src/main/java/org/wikipedia/migration/DataMigrator.java
new file mode 100644
index 0000000..6d5a72b
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/migration/DataMigrator.java
@@ -0,0 +1,86 @@
+package org.wikipedia.migration;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.util.Log;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DataMigrator {
+    Context context;
+
+    public DataMigrator(Context context) {
+        super();
+        this.context = context;
+    }
+
+    /**
+     * @return Are databases from the old app present?
+     */
+    public boolean hasData() {
+        String path = localDocumentPath("savedPagesDB.db");
+        File file = new File(path);
+        return file.exists();
+    }
+
+    /**
+     * Extract the high-level list of saved pages from old app, without their 
actual saved data.
+     *
+     * @return list of JSONObject dictionaries containing 'title' and 'lang' 
pairs
+     */
+    public List<JSONObject> extractSavedPages() {
+        ArrayList<JSONObject> arr = new ArrayList<JSONObject>();
+
+        for (String jsonString : fetchRawSavedPages()) {
+            try {
+                JSONObject dict = new JSONObject(jsonString);
+                arr.add(dict);
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+        }
+        return arr;
+    }
+
+    public void removeOldData() {
+        String path = localDocumentPath("savedPagesDB.db");
+        File file = new File(path);
+        file.delete();
+    }
+
+    // Private methods
+
+    private String localDocumentPath(String local) {
+        File basedir = context.getDir("database", Context.MODE_PRIVATE);
+        String basePath = basedir.getAbsolutePath();
+
+        return basePath + ":" + local;
+    }
+
+    private List<String> fetchRawSavedPages() {
+        SQLiteDatabase savedPagesDB = 
SQLiteDatabase.openDatabase(localDocumentPath("savedPagesDB.db"), null, 
SQLiteDatabase.OPEN_READONLY);
+        Cursor cursor = savedPagesDB.query(
+                "savedPagesDB", /* table */
+                new String[] {"value"}, /* columns */
+                "1", /* selection */
+                null, /* selectArgs */
+                null, /* groupBy */
+                null, /* having */
+                null, /* orderBy */
+                null  /* limit */
+        );
+
+        ArrayList<String> arr = new ArrayList<String>();
+        while (cursor.moveToNext()) {
+            arr.add(cursor.getString(0));
+        }
+        cursor.close();
+
+        return arr;
+    }
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4063447c9f29e4267cf547de040ddcf871dd7816
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Brion VIBBER <br...@wikimedia.org>

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

Reply via email to