Merge "fixed bookmarks widget bug   http://b/issue?id=2942821   added check for null intent when service is started"
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index e144f99..f380711 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -706,13 +706,17 @@
                     url = smartUrlFilter(url);
                     final ContentResolver cr = mResolver;
                     final String newUrl = url;
-                    new AsyncTask<Void, Void, Void>() {
-                        @Override
-                        protected Void doInBackground(Void... unused) {
-                            Browser.updateVisitedHistory(cr, newUrl, false);
-                            return null;
-                        }
-                    }.execute();
+                    if (mTabControl == null
+                            || mTabControl.getCurrentWebView() == null
+                            || !mTabControl.getCurrentWebView().isPrivateBrowsingEnabled()) {
+                        new AsyncTask<Void, Void, Void>() {
+                            @Override
+                            protected Void doInBackground(Void... unused) {
+                                Browser.updateVisitedHistory(cr, newUrl, false);
+                                return null;
+                            }
+                        }.execute();
+                    }
                     String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&";
                     if (url.contains(searchSource)) {
                         String source = null;
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 973d0f7..5825525 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -51,8 +51,8 @@
     static final String TABLE_SEARCHES = "searches";
     static final String TABLE_SYNC_STATE = "syncstate";
 
-    static final String DEFAULT_HISTORY_SORT = History.DATE_LAST_VISITED + " DESC";
-    
+    static final String DEFAULT_SORT_HISTORY = History.DATE_LAST_VISITED + " DESC";
+
     static final int BOOKMARKS = 1000;
     static final int BOOKMARKS_ID = 1001;
     static final int BOOKMARKS_FOLDER = 1002;
@@ -77,9 +77,9 @@
     static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
 
     static final HashMap<String, String> BOOKMARKS_PROJECTION_MAP = new HashMap<String, String>();
-    static final HashMap<String, String> OTHER_BOOKMARKS_PROJECTION_MAP = new HashMap<String, String>();
+    static final HashMap<String, String> OTHER_BOOKMARKS_PROJECTION_MAP = 
+            new HashMap<String, String>();
     static final HashMap<String, String> HISTORY_PROJECTION_MAP = new HashMap<String, String>();
-    static final HashMap<String, String> SEARCHES_PROJECTION_MAP = new HashMap<String, String>();
     static final HashMap<String, String> SYNC_STATE_PROJECTION_MAP = new HashMap<String, String>();
 
     static {
@@ -493,7 +493,7 @@
             }
             case HISTORY: {
                 if (sortOrder == null) {
-                    sortOrder = DEFAULT_HISTORY_SORT;
+                    sortOrder = DEFAULT_SORT_HISTORY;
                 }
                 qb.setProjectionMap(HISTORY_PROJECTION_MAP);
                 qb.setTables(TABLE_HISTORY);
@@ -511,7 +511,7 @@
                         + (selection == null ? "" : " AND (" + selection + ")");
                 return mSyncHelper.query(db, projection, selectionWithId, selectionArgs, sortOrder);
             }
-            
+
             default: {
                 throw new UnsupportedOperationException("Unknown URL " + uri.toString());
             }
@@ -643,24 +643,15 @@
         final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         switch (match) {
             case BOOKMARKS_ID: {
-                // Mark the bookmark dirty if the caller isn't a sync adapter
-                if (!callerIsSyncAdapter) {
-                    values = new ContentValues(values);
-                    values.put(Bookmarks.DIRTY, 1);
-                }
                 selection = DatabaseUtils.concatenateWhere(selection,
                         TABLE_BOOKMARKS + "._id=?");
                 selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
                         new String[] { Long.toString(ContentUris.parseId(uri)) });
-                return db.update(TABLE_BOOKMARKS, values, selection, selectionArgs); 
+                // fall through
             }
-
             case BOOKMARKS: {
-                if (!callerIsSyncAdapter) {
-                    values = new ContentValues(values);
-                    values.put(Bookmarks.DIRTY, 1);
-                }
-                return updateBookmarksInTransaction(values, selection, selectionArgs);
+                return updateBookmarksInTransaction(values, selection, selectionArgs,
+                        callerIsSyncAdapter);
             }
 
             case HISTORY_ID: {
@@ -704,15 +695,25 @@
      * Does a query to find the matching bookmarks and updates each one with the provided values.
      */
     private int updateBookmarksInTransaction(ContentValues values, String selection,
-            String[] selectionArgs) {
+            String[] selectionArgs, boolean callerIsSyncAdapter) {
         int count = 0;
         final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        Cursor cursor = query(Bookmarks.CONTENT_URI, new String[] { Bookmarks._ID },
+        Cursor cursor = query(Bookmarks.CONTENT_URI,
+                new String[] { Bookmarks._ID, Bookmarks.VERSION },
                 selection, selectionArgs, null);
         try {
             String[] args = new String[1];
+            // Mark the bookmark dirty if the caller isn't a sync adapter
+            if (!callerIsSyncAdapter) {
+                values = new ContentValues(values);
+                values.put(Bookmarks.DIRTY, 1);
+            }
             while (cursor.moveToNext()) {
                 args[0] = cursor.getString(0);
+                if (!callerIsSyncAdapter) {
+                    // increase the local version for non-sync changes
+                    values.put(Bookmarks.VERSION, cursor.getLong(1) + 1);
+                }
                 count += db.update(TABLE_BOOKMARKS, values, "_id=?", args);
             }
         } finally {