author | Ryan VanderMeulen <ryanvm@gmail.com> |
Wed, 13 Feb 2013 22:25:38 -0500 | |
changeset 121836 | b9c5b66bb94f99a2776ad83161747049eb9c0887 |
parent 121835 | 9d8f5013110edb45060b8d1e3a9f5a2f5c89def1 |
child 121837 | f27d5d9ebef259390405869bd7a53cae8a2841ad |
push id | 22953 |
push user | ryanvm@gmail.com |
push date | Thu, 14 Feb 2013 03:47:06 +0000 |
treeherder | mozilla-inbound@b9c5b66bb94f [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 836450 |
milestone | 21.0a1 |
backs out | 4f22708024f9a9409d6e9233b055679f402533e4 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
mobile/android/base/Distribution.java | file | annotate | diff | comparison | revisions | |
mobile/android/base/db/BrowserProvider.java.in | file | annotate | diff | comparison | revisions |
--- a/mobile/android/base/Distribution.java +++ b/mobile/android/base/Distribution.java @@ -23,19 +23,19 @@ import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public final class Distribution { private static final String LOGTAG = "GeckoDistribution"; - public static final int STATE_UNKNOWN = 0; - public static final int STATE_NONE = 1; - public static final int STATE_SET = 2; + private static final int STATE_UNKNOWN = 0; + private static final int STATE_NONE = 1; + private static final int STATE_SET = 2; /** * Initializes distribution if it hasn't already been initalized. */ public static void init(final Activity activity) { // Read/write preferences and files on the background thread. GeckoBackgroundThread.getHandler().post(new Runnable() { public void run() {
--- a/mobile/android/base/db/BrowserProvider.java.in +++ b/mobile/android/base/db/BrowserProvider.java.in @@ -1,41 +1,31 @@ /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; 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/. */ #filter substitution package @ANDROID_PACKAGE_NAME@.db; -import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.lang.Class; import java.lang.reflect.Field; -import java.lang.StringBuilder; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Iterator; -import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.regex.Pattern; import java.util.regex.Matcher; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.mozilla.gecko.Distribution; -import org.mozilla.gecko.GeckoApp; + import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.GeckoProfile; import org.mozilla.gecko.R; import org.mozilla.gecko.db.BrowserContract.Bookmarks; import org.mozilla.gecko.db.BrowserContract.Combined; import org.mozilla.gecko.db.BrowserContract.CommonColumns; import org.mozilla.gecko.db.BrowserContract.Control; import org.mozilla.gecko.db.BrowserContract.Favicons; @@ -43,52 +33,45 @@ import org.mozilla.gecko.db.BrowserContr import org.mozilla.gecko.db.BrowserContract.History; import org.mozilla.gecko.db.BrowserContract.Schema; import org.mozilla.gecko.db.BrowserContract.SyncColumns; import org.mozilla.gecko.db.BrowserContract.Thumbnails; import org.mozilla.gecko.db.BrowserContract.URLColumns; import org.mozilla.gecko.db.BrowserContract; import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.db.DBUtils; -import org.mozilla.gecko.gfx.BitmapUtils; import org.mozilla.gecko.ProfileMigrator; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.util.GeckoBackgroundThread; import org.mozilla.gecko.util.GeckoJarReader; -import android.app.Activity; import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.ContentProviderResult; import android.content.ContentProviderOperation; +import android.content.OperationApplicationException; import android.content.Context; -import android.content.OperationApplicationException; -import android.content.SharedPreferences; import android.content.UriMatcher; import android.database.Cursor; import android.database.DatabaseUtils; import android.database.MatrixCursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.graphics.BitmapFactory; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Build; import android.text.TextUtils; import android.util.Log; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - public class BrowserProvider extends ContentProvider { private static final String LOGTAG = "GeckoBrowserProvider"; private Context mContext; static final String DATABASE_NAME = "browser.db"; static final int DATABASE_VERSION = 14; @@ -985,236 +968,129 @@ public class BrowserProvider extends Con createHistoryWithFaviconsView(db); createCombinedViewOn13(db); createOrUpdateSpecialFolder(db, Bookmarks.PLACES_FOLDER_GUID, R.string.bookmarks_folder_places, 0); createOrUpdateAllSpecialFolders(db); - // Create distribution bookmarks before our own default bookmarks - int pos = createDistributionBookmarks(db); - createDefaultBookmarks(db, pos); - } - - private JSONArray inputStreamToJSONArray(InputStream inputStream) throws IOException, JSONException { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - StringBuilder stringBuilder = new StringBuilder(); - String s; - while ((s = reader.readLine()) != null) { - stringBuilder.append(s); - } - return new JSONArray(stringBuilder.toString()); - } - - private JSONArray getDistributionBookmarks() { - SharedPreferences settings = mContext.getSharedPreferences(GeckoApp.PREFS_NAME, Activity.MODE_PRIVATE); - String keyName = mContext.getPackageName() + ".distribution_state"; - int state = settings.getInt(keyName, Distribution.STATE_UNKNOWN); - if (state == Distribution.STATE_NONE) { - return null; - } - - ZipFile zip = null; - InputStream inputStream = null; - try { - if (state == Distribution.STATE_UNKNOWN) { - // If the distribution hasn't been set, get bookmarks.json out of the APK - File applicationPackage = new File(mContext.getPackageResourcePath()); - zip = new ZipFile(applicationPackage); - ZipEntry zipEntry = zip.getEntry("distribution/bookmarks.json"); - if (zipEntry == null) { - return null; - } - inputStream = zip.getInputStream(zipEntry); - } else { - // Otherwise, get bookmarks.json out of the data directory - File dataDir = new File(mContext.getApplicationInfo().dataDir); - File file = new File(dataDir, "distribution/bookmarks.json"); - inputStream = new FileInputStream(file); - } - return inputStreamToJSONArray(inputStream); - } catch (IOException e) { - Log.e(LOGTAG, "Error getting distribution bookmarks", e); - } catch (JSONException e) { - Log.e(LOGTAG, "Error parsing bookmarks.json", e); - } finally { - try { - if (zip != null) { - zip.close(); - } - if (inputStream != null) { - inputStream.close(); - } - } catch (IOException e) { - Log.e(LOGTAG, "Error closing distribution streams", e); - } - } - return null; + createDefaultBookmarks(db, "^bookmarkdefaults_title_"); } - private String getLocalizedProperty(JSONObject bookmark, String property, Locale locale) throws JSONException { - // Try the full locale - String fullLocale = property + "." + locale.toString(); - if (bookmark.has(fullLocale)) { - return bookmark.getString(fullLocale); - } - // Try without a variant - if (!TextUtils.isEmpty(locale.getVariant())) { - String noVariant = fullLocale.substring(0, fullLocale.lastIndexOf("_")); - if (bookmark.has(noVariant)) { - return bookmark.getString(noVariant); - } - } - // Try just the language - String lang = property + "." + locale.getLanguage(); - if (bookmark.has(lang)) { - return bookmark.getString(lang); - } - // Default to the non-localized property name - return bookmark.getString(property); - } - - // Returns the number of bookmarks inserted in the db - private int createDistributionBookmarks(SQLiteDatabase db) { - JSONArray bookmarks = getDistributionBookmarks(); - if (bookmarks == null) { - return 0; - } - - Locale locale = Locale.getDefault(); + private void createDefaultBookmarks(SQLiteDatabase db, String pattern) { + Class<?> stringsClass = R.string.class; + + Field[] fields = stringsClass.getFields(); + Pattern p = Pattern.compile(pattern); + + ContentValues bookmarksValues = new ContentValues(); + bookmarksValues.put(Bookmarks.PARENT, guidToID(db, Bookmarks.MOBILE_FOLDER_GUID)); + long now = System.currentTimeMillis(); + bookmarksValues.put(Bookmarks.DATE_CREATED, now); + bookmarksValues.put(Bookmarks.DATE_MODIFIED, now); + int pos = 0; - for (int i = 0; i < bookmarks.length(); i++) { - try { - JSONObject bookmark = bookmarks.getJSONObject(i); - - String title = getLocalizedProperty(bookmark, "title", locale); - String url = getLocalizedProperty(bookmark, "url", locale); - - // Look for an optional icon data URI - Bitmap icon = null; - if (bookmark.has("icon")) { - String iconData = bookmark.getString("icon"); - icon = BitmapUtils.getBitmapFromDataURI(iconData); - } - - createBookmark(db, title, url, pos, icon); - pos++; - } catch (JSONException e) { - Log.e(LOGTAG, "Error creating distribution bookmark", e); - } - } - return pos; - } - - // Inserts default bookmarks, starting at a specified position - private void createDefaultBookmarks(SQLiteDatabase db, int pos) { - Class<?> stringsClass = R.string.class; - Field[] fields = stringsClass.getFields(); - Pattern p = Pattern.compile("^bookmarkdefaults_title_"); - for (int i = 0; i < fields.length; i++) { String name = fields[i].getName(); Matcher m = p.matcher(name); - if (!m.find()) { + if (!m.find()) continue; - } + try { int titleid = fields[i].getInt(null); String title = mContext.getString(titleid); Field urlField = stringsClass.getField(name.replace("_title_", "_url_")); int urlId = urlField.getInt(null); String url = mContext.getString(urlId); - Bitmap icon = getDefaultFaviconFromPath(name); - if (icon == null) { - icon = getDefaultFaviconFromDrawable(name); - } - createBookmark(db, title, url, pos, icon); + bookmarksValues.put(Bookmarks.TITLE, title); + bookmarksValues.put(Bookmarks.URL, url); + bookmarksValues.put(Bookmarks.GUID, Utils.generateGuid()); + bookmarksValues.put(Bookmarks.POSITION, pos); + db.insertOrThrow(TABLE_BOOKMARKS, Bookmarks.TITLE, bookmarksValues); + + setDefaultFavicon(db, name, url); pos++; } catch (java.lang.IllegalAccessException ex) { Log.e(LOGTAG, "Can't create bookmark " + name, ex); } catch (java.lang.NoSuchFieldException ex) { Log.e(LOGTAG, "Can't create bookmark " + name, ex); } } } - private void createBookmark(SQLiteDatabase db, String title, String url, int pos, Bitmap icon) { - ContentValues bookmarkValues = new ContentValues(); - bookmarkValues.put(Bookmarks.PARENT, guidToID(db, Bookmarks.MOBILE_FOLDER_GUID)); - - long now = System.currentTimeMillis(); - bookmarkValues.put(Bookmarks.DATE_CREATED, now); - bookmarkValues.put(Bookmarks.DATE_MODIFIED, now); - - bookmarkValues.put(Bookmarks.TITLE, title); - bookmarkValues.put(Bookmarks.URL, url); - bookmarkValues.put(Bookmarks.GUID, Utils.generateGuid()); - bookmarkValues.put(Bookmarks.POSITION, pos); - db.insertOrThrow(TABLE_BOOKMARKS, Bookmarks.TITLE, bookmarkValues); - - // Return early if there's no icon to set - if (icon == null) { - return; + private void setDefaultFavicon(SQLiteDatabase db, String name, String url) { + ByteArrayOutputStream stream = getDefaultFaviconFromPath(db, name, url); + if (stream == null) { + stream = getDefaultFaviconFromDrawable(db, name, url); } - - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - icon.compress(Bitmap.CompressFormat.PNG, 100, stream); - - ContentValues iconValues = new ContentValues(); - iconValues.put(Favicons.DATA, stream.toByteArray()); - iconValues.put(Favicons.PAGE_URL, url); - insertFavicon(db, iconValues); + if (stream != null) { + ContentValues values = new ContentValues(); + values.put(Favicons.DATA, stream.toByteArray()); + values.put(Favicons.PAGE_URL, url); + insertFavicon(db, values); + } } - private Bitmap getDefaultFaviconFromPath(String name) { + private ByteArrayOutputStream getDefaultFaviconFromPath(SQLiteDatabase db, String name, String url) { + ByteArrayOutputStream stream = null; Class<?> stringClass = R.string.class; try { // Look for a drawable with the id R.drawable.bookmarkdefaults_favicon_* Field faviconField = stringClass.getField(name.replace("_title_", "_favicon_")); - if (faviconField == null) { - return null; - } + if (faviconField == null) + return null; int faviconId = faviconField.getInt(null); String path = mContext.getString(faviconId); String apkPath = mContext.getPackageResourcePath(); File apkFile = new File(apkPath); BitmapDrawable bitmapDrawable = GeckoJarReader.getBitmapDrawable(mContext.getResources(), "jar:jar:" + apkFile.toURI() + "!/omni.ja!/" + path); if (bitmapDrawable == null) { - return null; + return null; } - return bitmapDrawable.getBitmap(); + Bitmap bitmap = bitmapDrawable.getBitmap(); + if (bitmap == null) { + return null; + } + stream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); } catch (java.lang.IllegalAccessException ex) { Log.e(LOGTAG, "[Path] Can't create favicon " + name, ex); } catch (java.lang.NoSuchFieldException ex) { - Log.e(LOGTAG, "[Path] Can't create favicon " + name, ex); + // if there is no such field, create the bookmark without a favicon + Log.d(LOGTAG, "[Path] Can't create favicon " + name); } - return null; + return stream; } - private Bitmap getDefaultFaviconFromDrawable(String name) { + private ByteArrayOutputStream getDefaultFaviconFromDrawable(SQLiteDatabase db, String name, String url) { Class<?> drawablesClass = R.drawable.class; + ByteArrayOutputStream stream = null; try { // Look for a drawable with the id R.drawable.bookmarkdefaults_favicon_* Field faviconField = drawablesClass.getField(name.replace("_title_", "_favicon_")); - if (faviconField == null) { - return null; - } + if (faviconField == null) + return null; + int faviconId = faviconField.getInt(null); - return BitmapFactory.decodeResource(mContext.getResources(), faviconId); + Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), faviconId); + stream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); } catch (java.lang.IllegalAccessException ex) { Log.e(LOGTAG, "[Drawable] Can't create favicon " + name, ex); } catch (java.lang.NoSuchFieldException ex) { - Log.e(LOGTAG, "[Drawable] Can't create favicon " + name, ex); + // if there is no such field, create the bookmark without a favicon + Log.d(LOGTAG, "[Drawable] Can't create favicon " + name); } - return null; + + return stream; } private void createOrUpdateAllSpecialFolders(SQLiteDatabase db) { createOrUpdateSpecialFolder(db, Bookmarks.MOBILE_FOLDER_GUID, R.string.bookmarks_folder_mobile, 0); createOrUpdateSpecialFolder(db, Bookmarks.TOOLBAR_FOLDER_GUID, R.string.bookmarks_folder_toolbar, 1); createOrUpdateSpecialFolder(db, Bookmarks.MENU_FOLDER_GUID,