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