1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko;
import org.mozilla.gecko.db.BrowserContract;
import org.mozilla.gecko.db.BrowserContract.Bookmarks;
import org.mozilla.gecko.db.LocalBrowserDB;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.os.RemoteException;
import android.provider.Browser;
import android.util.Log;
import java.util.ArrayList;
class AndroidImport implements Runnable {
static final private String LOGTAG = "AndroidImport";
private Context mContext;
private Runnable mOnDoneRunnable;
private ArrayList<ContentProviderOperation> mOperations;
private ContentResolver mCr;
private LocalBrowserDB mDB;
private boolean mImportBookmarks;
private boolean mImportHistory;
public AndroidImport(Context context, Runnable onDoneRunnable,
boolean doBookmarks, boolean doHistory) {
mContext = context;
mOnDoneRunnable = onDoneRunnable;
mOperations = new ArrayList<ContentProviderOperation>();
mCr = mContext.getContentResolver();
mDB = new LocalBrowserDB(GeckoProfile.get(context).getName());
mImportBookmarks = doBookmarks;
mImportHistory = doHistory;
}
public void mergeBookmarks() {
Cursor cursor = null;
try {
cursor = mCr.query(Browser.BOOKMARKS_URI,
null,
Browser.BookmarkColumns.BOOKMARK + " = 1",
null,
null);
if (cursor != null) {
final int faviconCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.FAVICON);
final int titleCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.TITLE);
final int urlCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.URL);
// http://code.google.com/p/android/issues/detail?id=17969
final int createCol = cursor.getColumnIndex(Browser.BookmarkColumns.CREATED);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
String url = cursor.getString(urlCol);
String title = cursor.getString(titleCol);
long created;
if (createCol >= 0) {
created = cursor.getLong(createCol);
} else {
created = System.currentTimeMillis();
}
// Need to set it to the current time so Sync picks it up.
long modified = System.currentTimeMillis();
byte[] data = cursor.getBlob(faviconCol);
mDB.updateBookmarkInBatch(mCr, mOperations,
url, title, null, -1,
created, modified,
BrowserContract.Bookmarks.DEFAULT_POSITION,
null, Bookmarks.TYPE_BOOKMARK);
if (data != null) {
mDB.updateFaviconInBatch(mCr, mOperations, url, null, null, data);
}
cursor.moveToNext();
}
}
} finally {
if (cursor != null)
cursor.close();
}
flushBatchOperations();
}
public void mergeHistory() {
Cursor cursor = null;
try {
cursor = mCr.query(Browser.BOOKMARKS_URI,
null,
Browser.BookmarkColumns.BOOKMARK + " = 0 AND " +
Browser.BookmarkColumns.VISITS + " > 0",
null,
null);
if (cursor != null) {
final int dateCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.DATE);
final int faviconCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.FAVICON);
final int titleCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.TITLE);
final int urlCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.URL);
final int visitsCol = cursor.getColumnIndexOrThrow(Browser.BookmarkColumns.VISITS);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
String url = cursor.getString(urlCol);
String title = cursor.getString(titleCol);
long date = cursor.getLong(dateCol);
int visits = cursor.getInt(visitsCol);
byte[] data = cursor.getBlob(faviconCol);
mDB.updateHistoryInBatch(mCr, mOperations, url, title, date, visits);
if (data != null) {
mDB.updateFaviconInBatch(mCr, mOperations, url, null, null, data);
}
cursor.moveToNext();
}
}
} finally {
if (cursor != null)
cursor.close();
}
flushBatchOperations();
}
protected void flushBatchOperations() {
Log.d(LOGTAG, "Flushing " + mOperations.size() + " DB operations");
try {
// We don't really care for the results, this is best-effort.
mCr.applyBatch(BrowserContract.AUTHORITY, mOperations);
} catch (RemoteException e) {
Log.e(LOGTAG, "Remote exception while updating db: ", e);
} catch (OperationApplicationException e) {
// Bug 716729 means this happens even in normal circumstances
Log.d(LOGTAG, "Error while applying database updates: ", e);
}
mOperations.clear();
}
@Override
public void run() {
if (mImportBookmarks) {
mergeBookmarks();
}
if (mImportHistory) {
mergeHistory();
}
mOnDoneRunnable.run();
}
}
|