Adds support for Chrome Sync to bookmark widget

  Bug: 3167815
  This change adds support to the bookmark widget for Chrome Sync
  bookmarks.

Change-Id: I7517e639216040f93e105014ae1ef116ac8e0e06
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 37b8eef..03f0557 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -584,11 +584,14 @@
                 qb.setTables(TABLE_BOOKMARKS_JOIN_IMAGES);
                 String[] args;
                 String query;
+                if (TextUtils.isEmpty(sortOrder)) {
+                    sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER;
+                }
                 if (!useAccount) {
                     qb.setProjectionMap(BOOKMARKS_PROJECTION_MAP);
                     query = qb.buildQuery(projection,
                             Bookmarks.PARENT + "=? AND " + Bookmarks.IS_DELETED + "=0",
-                            null, null, null, DEFAULT_BOOKMARKS_SORT_ORDER, null);
+                            null, null, null, sortOrder, null);
 
                     args = new String[] { Long.toString(FIXED_ID_ROOT) };
                 } else {
@@ -611,7 +614,7 @@
 
                     query = qb.buildUnionQuery(
                             new String[] { bookmarksBarQuery, otherBookmarksQuery },
-                            DEFAULT_BOOKMARKS_SORT_ORDER, limit);
+                            sortOrder, limit);
 
                     args = new String[] {
                             accountType, accountName, accountType, accountName,
diff --git a/src/com/android/browser/widget/BookmarkListWidgetService.java b/src/com/android/browser/widget/BookmarkListWidgetService.java
index f0dd9cb..893d3f5 100644
--- a/src/com/android/browser/widget/BookmarkListWidgetService.java
+++ b/src/com/android/browser/widget/BookmarkListWidgetService.java
@@ -16,12 +16,14 @@
 
 package com.android.browser.widget;
 
+import com.android.browser.BrowserBookmarksPage;
 import com.android.browser.R;
-import com.android.browser.provider.BrowserProvider2;
 
 import android.appwidget.AppWidgetManager;
+import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.graphics.Bitmap;
@@ -32,6 +34,7 @@
 import android.os.Binder;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.preference.PreferenceManager;
 import android.provider.BrowserContract;
 import android.provider.BrowserContract.Bookmarks;
 import android.text.TextUtils;
@@ -43,6 +46,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Stack;
 
 public class BookmarkListWidgetService extends RemoteViewsService {
 
@@ -60,11 +64,12 @@
             BrowserContract.Bookmarks.URL,
             BrowserContract.Bookmarks.FAVICON,
             BrowserContract.Bookmarks.IS_FOLDER,
-            BrowserContract.Bookmarks.PARENT};
+            BrowserContract.Bookmarks.PARENT,
+            BrowserContract.Bookmarks.POSITION};
 
     // Ordering merged with DEFAULT_BOOKMARK_SORT_ORDER from BrowserProvider2
     private static final String ORDER_BY_CLAUSE =
-        Bookmarks.IS_FOLDER + " DESC, position ASC, _id ASC";
+            Bookmarks.IS_FOLDER + " DESC, position ASC, _id ASC";
 
     private Map<Integer, BookmarkFactory> mFactories;
     private Handler mUiHandler;
@@ -99,7 +104,7 @@
             long folderId = intent.getLongExtra(Bookmarks._ID, -1);
             BookmarkFactory fac = mFactories.get(widgetId);
             if (fac != null && folderId >= 0) {
-                fac.setFolder(folderId);
+                fac.changeFolder(folderId);
                 AppWidgetManager.getInstance(this).notifyAppWidgetViewDataChanged(widgetId, R.id.bookmarks_list);
             }
         }
@@ -142,19 +147,43 @@
         }
     }
 
+    private static class Breadcrumb {
+        long mId;
+        String mTitle;
+        public Breadcrumb(long id, String title) {
+            mId = id;
+            mTitle = title;
+        }
+    }
+
     static class BookmarkFactory implements RemoteViewsService.RemoteViewsFactory {
         private List<RenderResult> mBookmarks;
         private Context mContext;
         private int mWidgetId;
-        private long mFolderId = BrowserProvider2.FIXED_ID_ROOT;
+        private String mAccountType;
+        private String mAccountName;
+        private Stack<Breadcrumb> mBreadcrumbs;
 
         public BookmarkFactory(Context context, int widgetId) {
+            mBreadcrumbs = new Stack<Breadcrumb>();
             mContext = context;
             mWidgetId = widgetId;
         }
 
-        void setFolder(long folderId) {
-            mFolderId = folderId;
+        void changeFolder(long folderId) {
+            if (mBookmarks == null) return;
+
+            if (!mBreadcrumbs.empty() && mBreadcrumbs.peek().mId == folderId) {
+                mBreadcrumbs.pop();
+                return;
+            }
+
+            for (RenderResult res : mBookmarks) {
+                if (res.mId == folderId) {
+                    mBreadcrumbs.push(new Breadcrumb(res.mId, res.mTitle));
+                    break;
+                }
+            }
         }
 
         @Override
@@ -181,13 +210,13 @@
             }
 
             RenderResult res = mBookmarks.get(position);
+            Breadcrumb folder = mBreadcrumbs.empty() ? null : mBreadcrumbs.peek();
 
             RemoteViews views = new RemoteViews(
                     mContext.getPackageName(), R.layout.bookmarklistwidget_item);
             Intent fillin;
             if (res.mIsFolder) {
                 long nfi = res.mId;
-                if (nfi == mFolderId) nfi = res.mParentId;
                 fillin = new Intent(ACTION_CHANGE_FOLDER, null,
                         mContext, BookmarkListWidgetService.class)
                         .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)
@@ -207,7 +236,7 @@
             views.setTextViewText(R.id.label, displayTitle);
             views.setDrawableParameters(R.id.list_item, true, 0, -1, null, -1);
             if (res.mIsFolder) {
-                if (res.mId == mFolderId) {
+                if (folder != null && res.mId == folder.mId) {
                     views.setDrawableParameters(R.id.list_item, true, 140, -1, null, -1);
                     views.setImageViewResource(R.id.thumb, R.drawable.ic_back_normal);
                 } else {
@@ -236,6 +265,9 @@
 
         @Override
         public void onCreate() {
+            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+            mAccountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+            mAccountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
             loadData();
         }
 
@@ -258,23 +290,34 @@
 
         void update() {
             recycleBitmaps();
-            String where;
+            String where = null;
+            Breadcrumb folder = mBreadcrumbs.empty() ? null : mBreadcrumbs.peek();
+            Uri uri;
             if (USE_FOLDERS) {
-                where = String.format("%s == %d", Bookmarks.PARENT, mFolderId);
-                if (mFolderId != BrowserProvider2.FIXED_ID_ROOT) {
-                    where = String.format("%s OR %s == %d", where,
-                        Bookmarks._ID, mFolderId);
+                uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
+                if (folder != null) {
+                    uri = ContentUris.withAppendedId(uri, folder.mId);
                 }
             } else {
+                uri = BrowserContract.Bookmarks.CONTENT_URI;
                 where = Bookmarks.IS_FOLDER + " == 0";
             }
+            if (!TextUtils.isEmpty(mAccountType) && !TextUtils.isEmpty(mAccountName)) {
+                uri = uri.buildUpon()
+                        .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, mAccountType)
+                        .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, mAccountName).build();
+            }
             Cursor c = null;
             try {
-                c = mContext.getContentResolver().query(
-                        BrowserContract.Bookmarks.CONTENT_URI, PROJECTION,
+                c = mContext.getContentResolver().query(uri, PROJECTION,
                         where, null, ORDER_BY_CLAUSE);
                 if (c != null) {
-                    mBookmarks = new ArrayList<RenderResult>(c.getCount());
+                    mBookmarks = new ArrayList<RenderResult>(c.getCount() + 1);
+                    if (folder != null) {
+                        RenderResult res = new RenderResult(folder.mId, folder.mTitle, null);
+                        res.mIsFolder = true;
+                        mBookmarks.add(res);
+                    }
                     while (c.moveToNext()) {
                         long id = c.getLong(0);
                         String title = c.getString(1);
@@ -289,13 +332,7 @@
                                     blob, 0, blob.length, options);
                         }
                         res.mIsFolder = c.getInt(4) != 0;
-                        res.mParentId = c.getLong(5);
-                        if (res.mId == mFolderId) {
-                            // Make sure this is first
-                            mBookmarks.add(0, res);
-                        } else {
-                            mBookmarks.add(res);
-                        }
+                        mBookmarks.add(res);
                     }
                 }
             } catch (IllegalStateException e) {
@@ -326,7 +363,6 @@
         final String mUrl;
         Bitmap mBitmap;
         boolean mIsFolder;
-        long mParentId;
         long mId;
 
         RenderResult(long id, String title, String url) {