Merge "fix quickcontrols" into honeycomb
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 02d9199..40bc16e 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -645,9 +645,9 @@
     }
 
     private void setStatusBarVisibility(boolean visible) {
-        int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
-        mActivity.getWindow().setFlags(flag,
-                WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        WindowManager.LayoutParams params = mActivity.getWindow().getAttributes();
+        params.systemUiVisibility = visible ? View.STATUS_BAR_VISIBLE : View.STATUS_BAR_HIDDEN;
+        mActivity.getWindow().setAttributes(params);
     }
 
     // -------------------------------------------------------------------------
diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java
index e2f8941..7722392 100644
--- a/src/com/android/browser/BookmarksLoader.java
+++ b/src/com/android/browser/BookmarksLoader.java
@@ -21,7 +21,6 @@
 import android.net.Uri;
 import android.provider.BrowserContract.Bookmarks;
 import android.provider.BrowserContract.ChromeSyncColumns;
-import android.text.TextUtils;
 
 public class BookmarksLoader extends CursorLoader {
     public static final String ARG_ACCOUNT_TYPE = "acct_type";
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index fa7a5e2..f20583a 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -25,11 +25,11 @@
 import android.content.ClipboardManager;
 import android.content.ContentUris;
 import android.content.Context;
-import android.content.CursorLoader;
 import android.content.Intent;
 import android.content.Loader;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -40,9 +40,7 @@
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.provider.BrowserContract;
-import android.provider.BrowserContract.Accounts;
 import android.provider.BrowserContract.ChromeSyncColumns;
-import android.text.TextUtils;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
@@ -52,10 +50,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.WebIconDatabase.IconListener;
-import android.widget.Adapter;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemSelectedListener;
 import android.widget.GridView;
 import android.widget.ListView;
 import android.widget.PopupMenu.OnMenuItemClickListener;
@@ -74,12 +70,11 @@
  */
 public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
         LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
-        OnItemSelectedListener, BreadCrumbView.Controller, OnMenuItemClickListener {
+        BreadCrumbView.Controller, OnMenuItemClickListener, OnSharedPreferenceChangeListener {
 
     static final String LOGTAG = "browser";
 
     static final int LOADER_BOOKMARKS = 1;
-    static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
 
     static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
 
@@ -88,7 +83,6 @@
     public static final String PREF_ACCOUNT_TYPE = "acct_type";
     public static final String PREF_ACCOUNT_NAME = "acct_name";
 
-    static final String DEFAULT_ACCOUNT = "local";
     static final int VIEW_THUMBNAILS = 1;
     static final int VIEW_LIST = 2;
     static final String PREF_SELECTED_VIEW = "bookmarks_view";
@@ -124,13 +118,12 @@
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
         switch (id) {
             case LOADER_BOOKMARKS: {
-                String accountType = null;
-                String accountName = null;
-                if (args != null) {
-                    accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
-                    accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
-                }
-                BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
+                SharedPreferences prefs = PreferenceManager
+                        .getDefaultSharedPreferences(getActivity());
+                String accountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
+                String accountName = prefs.getString(PREF_ACCOUNT_NAME, null);
+                BookmarksLoader bl = new BookmarksLoader(getActivity(),
+                        accountType, accountName);
                 if (mCrumbs != null) {
                     Uri uri = (Uri) mCrumbs.getTopData();
                     if (uri != null) {
@@ -139,11 +132,6 @@
                 }
                 return bl;
             }
-            case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
-                return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
-                        new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
-                        null);
-            }
         }
         throw new UnsupportedOperationException("Unknown loader id " + id);
     }
@@ -166,77 +154,12 @@
                 mAdapter.changeCursor(cursor);
                 break;
             }
-
-            case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
-                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
-                        getActivity());
-                String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
-                String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
-                String accountType =
-                        TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
-                String accountName =
-                        TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
-
-                Bundle args = null;
-                if (cursor == null || !cursor.moveToFirst()) {
-                    // No accounts, set the prefs to the default
-                    accountType = DEFAULT_ACCOUNT;
-                    accountName = DEFAULT_ACCOUNT;
-                } else {
-                    int accountPosition = -1;
-
-                    if (!DEFAULT_ACCOUNT.equals(accountType) &&
-                            !DEFAULT_ACCOUNT.equals(accountName)) {
-                        // Check to see if the account in prefs still exists
-                        cursor.moveToFirst();
-                        do {
-                            if (accountType.equals(cursor.getString(0))
-                                    && accountName.equals(cursor.getString(1))) {
-                                accountPosition = cursor.getPosition();
-                                break;
-                            }
-                        } while (cursor.moveToNext());
-                    }
-
-                    if (accountPosition == -1) {
-                        if (!(DEFAULT_ACCOUNT.equals(accountType)
-                                && DEFAULT_ACCOUNT.equals(accountName))) {
-                            // No account is set in prefs and there is at least one,
-                            // so pick the first one as the default
-                            cursor.moveToFirst();
-                            accountType = cursor.getString(0);
-                            accountName = cursor.getString(1);
-                        }
-                    }
-
-                    args = new Bundle();
-                    args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
-                    args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
-                }
-
-                // The stored account name wasn't found, update the stored account with a valid one
-                if (!accountType.equals(storedAccountType)
-                        || !accountName.equals(storedAccountName)) {
-                    prefs.edit()
-                            .putString(PREF_ACCOUNT_TYPE, accountType)
-                            .putString(PREF_ACCOUNT_NAME, accountName)
-                            .apply();
-                }
-                getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
-
-                break;
-            }
         }
     }
 
+    @Override
     public void onLoaderReset(Loader<Cursor> loader) {
         onLoadFinished(loader, null);
-        switch (loader.getId()) {
-            case LOADER_BOOKMARKS: {
-                onLoadFinished(loader, null);
-                break;
-            }
-        }
     }
 
     long getFolderId() {
@@ -443,28 +366,15 @@
         if (mCallbacks != null) {
             mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
         }
-
         // Start the loaders
         LoaderManager lm = getLoaderManager();
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+        SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(getActivity());
+        prefs.registerOnSharedPreferenceChangeListener(this);
         mCurrentView =
             prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
         mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
-        String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
-        String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
-        if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
-            // There is an account set, load up that one
-            Bundle args = null;
-            if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
-                args = new Bundle();
-                args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
-                args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
-            }
-            lm.restartLoader(LOADER_BOOKMARKS, args, this);
-        } else {
-            // No account set, load the account list first
-            lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
-        }
+        lm.restartLoader(LOADER_BOOKMARKS, null, this);
 
         // Add our own listener in case there are favicons that have yet to be loaded.
         CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
@@ -475,6 +385,9 @@
     @Override
     public void onDestroyView() {
         super.onDestroyView();
+        SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(getActivity());
+        prefs.unregisterOnSharedPreferenceChangeListener(this);
         if (mHeaderContainer != null) {
             mHeaderContainer.removeView(mHeader);
         }
@@ -518,36 +431,6 @@
         }
     }
 
-    @Override
-    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        Adapter adapter = parent.getAdapter();
-        String accountType = "com.google";
-        String accountName = adapter.getItem(position).toString();
-
-        Bundle args = null;
-        if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
-            accountType = DEFAULT_ACCOUNT;
-            accountName = DEFAULT_ACCOUNT;
-        } else {
-            args = new Bundle();
-            args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
-            args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
-        }
-
-        // Remember the selection for later
-        PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
-                .putString(PREF_ACCOUNT_TYPE, accountType)
-                .putString(PREF_ACCOUNT_NAME, accountName)
-                .apply();
-
-        getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
-    }
-
-    @Override
-    public void onNothingSelected(AdapterView<?> parent) {
-        // Do nothing
-    }
-
     /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
         String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
         String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
@@ -842,4 +725,21 @@
             mCrumbs.setMaxVisible(mCrumbMaxVisible);
         }
     }
+
+    @Override
+    public void onSharedPreferenceChanged(
+            SharedPreferences sharedPreferences, String key) {
+        if (PREF_ACCOUNT_NAME.equals(key) || PREF_ACCOUNT_TYPE.equals(key)) {
+            mCrumbs.setController(null);
+            mCrumbs.clear();
+            LoaderManager lm = getLoaderManager();
+            lm.restartLoader(LOADER_BOOKMARKS, null, this);
+            mCrumbs.setController(this);
+            String name = getString(R.string.bookmarks);
+            mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+            if (mCallbacks != null) {
+                mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+            }
+        }
+    }
 }
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 6caacdc..ff06118 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -308,15 +308,15 @@
 
     @Override
     public void onDismiss() {
-        WebView top = mUiController.getCurrentTopWebView();
-        if (top != null) {
-            mUiController.getCurrentTopWebView().requestFocus();
+        Tab currentTab = mUi.getActiveTab();
+        if (currentTab != null && currentTab.getWebView() != null) {
+            currentTab.getWebView().requestFocus();
         }
         mUi.hideFakeTitleBar();
         setUrlMode(false);
         // if top != null current must be set
-        if ((top != null) && !mInVoiceMode) {
-            setDisplayTitle(mUiController.getCurrentWebView().getUrl());
+        if ((currentTab != null) && !mInVoiceMode) {
+            setDisplayTitle(currentTab.getUrl());
         }
     }
 
diff --git a/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java b/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java
index 51ba2ca..1c7856f 100644
--- a/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java
+++ b/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java
@@ -75,14 +75,16 @@
     private static final int BOOKMARK_INDEX_TOUCH_ICON = 5;
     private static final int BOOKMARK_INDEX_THUMBNAIL = 7;
 
-    private Map<Integer, BookmarkFactory> mFactories;
+    // The service will likely be destroyed at any time, so we need to keep references to the
+    // factories across services connections.
+    private static final Map<Integer, BookmarkFactory> mFactories =
+            new HashMap<Integer, BookmarkFactory>();
     private Handler mUiHandler;
     private BookmarksObserver mBookmarksObserver;
 
     @Override
     public void onCreate() {
         super.onCreate();
-        mFactories = new HashMap<Integer, BookmarkFactory>();
         mUiHandler = new Handler();
         mBookmarksObserver = new BookmarksObserver(mUiHandler);
         getContentResolver().registerContentObserver(
@@ -109,6 +111,12 @@
             BookmarkFactory fac = mFactories.get(widgetId);
             if (fac != null && folderId >= 0) {
                 fac.changeFolder(folderId);
+            } else {
+                // This a workaround to the issue when the Browser process crashes, after which
+                // mFactories is not populated (due to onBind() not being called).  Calling
+                // notifyDataSetChanged() will trigger a connection to be made.
+                AppWidgetManager.getInstance(getApplicationContext())
+                    .notifyAppWidgetViewDataChanged(widgetId, R.id.bookmarks_list);
             }
         }
         return START_STICKY;