blob: c39218c491ba8d469a1a4909296887ae0f66e24e [file] [log] [blame]
The Android Open Source Project0c908882009-03-03 19:32:16 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.browser;
18
John Reckd4893b02010-12-07 17:38:34 -080019import com.android.browser.BreadCrumbView.Crumb;
20
The Android Open Source Project0c908882009-03-03 19:32:16 -080021import android.app.Activity;
22import android.app.AlertDialog;
Jeff Hamilton64144e42010-08-18 16:31:59 -050023import android.app.Fragment;
Jeff Hamilton84029622010-08-05 14:29:28 -050024import android.app.LoaderManager;
Dianne Hackborneb07b172010-08-26 22:18:14 -070025import android.content.ClipData;
Michael Kolbbef7a752010-08-25 17:11:35 -070026import android.content.ClipboardManager;
Jeff Hamilton1a805652010-09-07 12:36:30 -070027import android.content.ContentResolver;
Jeff Hamilton84029622010-08-05 14:29:28 -050028import android.content.ContentUris;
Dianne Hackborn80f32622010-08-05 14:17:53 -070029import android.content.Context;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050030import android.content.CursorLoader;
The Android Open Source Project0c908882009-03-03 19:32:16 -080031import android.content.DialogInterface;
32import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050033import android.content.Loader;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050034import android.content.SharedPreferences;
John Reck8af90642010-11-23 10:27:29 -080035import android.content.SharedPreferences.Editor;
Jeff Hamilton84029622010-08-05 14:29:28 -050036import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080037import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050038import android.graphics.BitmapFactory;
39import android.net.Uri;
John Reckc8490812010-11-22 14:15:36 -080040import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080041import android.os.Bundle;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050042import android.preference.PreferenceManager;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050043import android.provider.BrowserContract;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050044import android.provider.BrowserContract.Accounts;
John Reck1cebb442010-12-10 12:02:16 -080045import android.provider.BrowserContract.ChromeSyncColumns;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050046import android.text.TextUtils;
The Android Open Source Project0c908882009-03-03 19:32:16 -080047import android.view.ContextMenu;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050048import android.view.ContextMenu.ContextMenuInfo;
Jeff Hamilton64144e42010-08-18 16:31:59 -050049import android.view.LayoutInflater;
The Android Open Source Project0c908882009-03-03 19:32:16 -080050import android.view.MenuInflater;
51import android.view.MenuItem;
52import android.view.View;
John Reck608baa72010-11-24 10:32:28 -080053import android.view.View.OnClickListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050054import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050055import android.webkit.WebIconDatabase.IconListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050056import android.widget.Adapter;
The Android Open Source Project0c908882009-03-03 19:32:16 -080057import android.widget.AdapterView;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050058import android.widget.AdapterView.OnItemClickListener;
59import android.widget.AdapterView.OnItemSelectedListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050060import android.widget.GridView;
John Reck8af90642010-11-23 10:27:29 -080061import android.widget.ListView;
John Reck608baa72010-11-24 10:32:28 -080062import android.widget.PopupMenu.OnMenuItemClickListener;
63import android.widget.TextView;
Jeff Hamilton84029622010-08-05 14:29:28 -050064import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080065
John Reck608baa72010-11-24 10:32:28 -080066interface BookmarksPageCallbacks {
67 // Return true if handled
68 boolean onBookmarkSelected(Cursor c, boolean isFolder);
69 // Return true if handled
70 boolean onOpenInNewWindow(Cursor c);
John Reck89f73c12010-12-01 10:10:14 -080071 void onFolderChanged(int level, Uri uri);
John Reck608baa72010-11-24 10:32:28 -080072}
73
The Android Open Source Project0c908882009-03-03 19:32:16 -080074/**
75 * View showing the user's bookmarks in the browser.
76 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050077public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
Michael Kolb370a4f32010-10-06 10:45:32 -070078 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
John Reck608baa72010-11-24 10:32:28 -080079 OnItemSelectedListener, BreadCrumbView.Controller, OnClickListener, OnMenuItemClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080080
Jeff Hamilton84029622010-08-05 14:29:28 -050081 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070082
Jeff Hamilton84029622010-08-05 14:29:28 -050083 static final int LOADER_BOOKMARKS = 1;
Jeff Hamiltona9bad832010-09-24 11:05:30 -050084 static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
Jeff Hamilton84029622010-08-05 14:29:28 -050085
Michael Kolb801ecb72010-08-25 12:57:38 -070086 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
87
Jeff Hamilton70c77692010-09-21 19:11:24 -050088 static final String ACCOUNT_NAME_UNSYNCED = "Unsynced";
Michael Kolbe421c242010-10-04 19:29:01 -070089
Jeff Hamilton7f6cf3e2010-09-17 17:22:21 -050090 public static final String PREF_ACCOUNT_TYPE = "acct_type";
91 public static final String PREF_ACCOUNT_NAME = "acct_name";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050092
93 static final String DEFAULT_ACCOUNT = "local";
John Reck8af90642010-11-23 10:27:29 -080094 static final int VIEW_THUMBNAILS = 1;
95 static final int VIEW_LIST = 2;
96 static final String PREF_SELECTED_VIEW = "bookmarks_view";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050097
John Reck608baa72010-11-24 10:32:28 -080098 BookmarksPageCallbacks mCallbacks;
Jeff Hamilton84029622010-08-05 14:29:28 -050099 GridView mGrid;
John Reck8af90642010-11-23 10:27:29 -0800100 ListView mList;
Jeff Hamilton84029622010-08-05 14:29:28 -0500101 BrowserBookmarksAdapter mAdapter;
102 boolean mDisableNewWindow;
Jeff Hamilton84029622010-08-05 14:29:28 -0500103 boolean mCanceled = false;
John Reck608baa72010-11-24 10:32:28 -0800104 boolean mEnableContextMenu = true;
105 boolean mShowRootFolder = false;
Jeff Hamilton84029622010-08-05 14:29:28 -0500106 View mEmptyView;
John Reck8af90642010-11-23 10:27:29 -0800107 int mCurrentView;
John Reck608baa72010-11-24 10:32:28 -0800108 View mHeader;
John Reck608baa72010-11-24 10:32:28 -0800109 ViewGroup mHeaderContainer;
Michael Kolb370a4f32010-10-06 10:45:32 -0700110 BreadCrumbView mCrumbs;
John Reck608baa72010-11-24 10:32:28 -0800111 TextView mSelectBookmarkView;
John Reck89f73c12010-12-01 10:10:14 -0800112 int mCrumbVisibility = View.VISIBLE;
113 int mCrumbMaxVisible = -1;
114 boolean mCrumbBackButton = false;
Michael Kolb370a4f32010-10-06 10:45:32 -0700115
John Reck608baa72010-11-24 10:32:28 -0800116 static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
117 Bundle args, ViewGroup headerContainer) {
Michael Kolbe421c242010-10-04 19:29:01 -0700118 BrowserBookmarksPage bbp = new BrowserBookmarksPage();
119 bbp.mCallbacks = cb;
John Reck608baa72010-11-24 10:32:28 -0800120 bbp.mHeaderContainer = headerContainer;
Michael Kolbe421c242010-10-04 19:29:01 -0700121 bbp.setArguments(args);
122 return bbp;
123 }
124
Jeff Hamilton84029622010-08-05 14:29:28 -0500125 @Override
126 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
127 switch (id) {
128 case LOADER_BOOKMARKS: {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700129 String accountType = null;
130 String accountName = null;
Jeff Hamilton84029622010-08-05 14:29:28 -0500131 if (args != null) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700132 accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
133 accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
Jeff Hamilton84029622010-08-05 14:29:28 -0500134 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700135 BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
136 if (mCrumbs != null) {
137 Uri uri = (Uri) mCrumbs.getTopData();
138 if (uri != null) {
139 bl.setUri(uri);
140 }
141 }
142 return bl;
Jeff Hamilton84029622010-08-05 14:29:28 -0500143 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500144 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
145 return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
146 new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
147 null);
148 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500149 }
150 throw new UnsupportedOperationException("Unknown loader id " + id);
151 }
152
153 @Override
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500154 public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
155 switch (loader.getId()) {
156 case LOADER_BOOKMARKS: {
157 // Set the visibility of the empty vs. content views
158 if (cursor == null || cursor.getCount() == 0) {
159 mEmptyView.setVisibility(View.VISIBLE);
160 mGrid.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800161 mList.setVisibility(View.GONE);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500162 } else {
163 mEmptyView.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800164 setupBookmarkView();
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500165 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500166
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500167 // Give the new data to the adapter
168 mAdapter.changeCursor(cursor);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500169 break;
170 }
171
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500172 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
173 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
174 getActivity());
175 String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
176 String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
177 String accountType =
178 TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
179 String accountName =
180 TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
181
182 Bundle args = null;
183 if (cursor == null || !cursor.moveToFirst()) {
184 // No accounts, set the prefs to the default
185 accountType = DEFAULT_ACCOUNT;
186 accountName = DEFAULT_ACCOUNT;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500187 } else {
188 int accountPosition = -1;
189
190 if (!DEFAULT_ACCOUNT.equals(accountType) &&
191 !DEFAULT_ACCOUNT.equals(accountName)) {
192 // Check to see if the account in prefs still exists
193 cursor.moveToFirst();
194 do {
195 if (accountType.equals(cursor.getString(0))
196 && accountName.equals(cursor.getString(1))) {
197 accountPosition = cursor.getPosition();
198 break;
199 }
200 } while (cursor.moveToNext());
201 }
202
203 if (accountPosition == -1) {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500204 if (!(DEFAULT_ACCOUNT.equals(accountType)
Jeff Hamilton70c77692010-09-21 19:11:24 -0500205 && DEFAULT_ACCOUNT.equals(accountName))) {
Jeff Hamilton70c77692010-09-21 19:11:24 -0500206 // No account is set in prefs and there is at least one,
207 // so pick the first one as the default
208 cursor.moveToFirst();
209 accountType = cursor.getString(0);
210 accountName = cursor.getString(1);
Jeff Hamilton70c77692010-09-21 19:11:24 -0500211 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500212 }
213
214 args = new Bundle();
215 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
216 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500217 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500218
219 // The stored account name wasn't found, update the stored account with a valid one
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500220 if (!accountType.equals(storedAccountType)
221 || !accountName.equals(storedAccountName)) {
222 prefs.edit()
223 .putString(PREF_ACCOUNT_TYPE, accountType)
224 .putString(PREF_ACCOUNT_NAME, accountName)
225 .apply();
226 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500227 getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500228
229 break;
230 }
231 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500232 }
233
Michael Kolb370a4f32010-10-06 10:45:32 -0700234 long getFolderId() {
235 LoaderManager manager = getLoaderManager();
236 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800237 (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700238
239 Uri uri = loader.getUri();
240 if (uri != null) {
241 try {
242 return ContentUris.parseId(uri);
243 } catch (NumberFormatException nfx) {
244 return -1;
245 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500246 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700247 return -1;
248 }
249
The Android Open Source Project0c908882009-03-03 19:32:16 -0800250 @Override
251 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500252 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800253 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700254 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800255 if (mCanceled) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400256 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800257 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700258 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800259 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
260 // If we have no menu info, we can't tell which item was selected.
261 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400262 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800263 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700264
The Android Open Source Project0c908882009-03-03 19:32:16 -0800265 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800266 case R.id.open_context_menu_id:
267 loadUrl(i.position);
268 break;
269 case R.id.edit_context_menu_id:
270 editBookmark(i.position);
271 break;
272 case R.id.shortcut_context_menu_id:
John Reck608baa72010-11-24 10:32:28 -0800273 Cursor c = mAdapter.getItem(i.position);
274 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800275 break;
276 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500277 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800278 break;
279 case R.id.new_window_context_menu_id:
280 openInNewWindow(i.position);
281 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500282 case R.id.share_link_context_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800283 Cursor cursor = mAdapter.getItem(i.position);
Michael Kolb8233fac2010-10-26 16:08:53 -0700284 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500285 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
286 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
287 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
288 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800289 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500290 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800291 case R.id.copy_url_context_menu_id:
292 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400293 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500294 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500295 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
296 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400297 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500298 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400299 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500300 case R.id.save_to_bookmarks_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800301 Cursor cursor = mAdapter.getItem(i.position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500302 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
303 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400304 // If the site is bookmarked, the item becomes remove from
305 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500306 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400307 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500308 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800309 default:
310 return super.onContextItemSelected(item);
311 }
312 return true;
313 }
314
John Reck608baa72010-11-24 10:32:28 -0800315 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500316 byte[] data = cursor.getBlob(columnIndex);
317 if (data == null) {
318 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800319 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500320 return BitmapFactory.decodeByteArray(data, 0, data.length);
321 }
322
John Reckc8490812010-11-22 14:15:36 -0800323 private MenuItem.OnMenuItemClickListener mContextItemClickListener =
324 new MenuItem.OnMenuItemClickListener() {
325 @Override
326 public boolean onMenuItemClick(MenuItem item) {
327 return onContextItemSelected(item);
328 }
329 };
330
Jeff Hamilton84029622010-08-05 14:29:28 -0500331 @Override
332 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
333 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800334 Cursor cursor = mAdapter.getItem(info.position);
John Reck1cebb442010-12-10 12:02:16 -0800335 if (!canEdit(cursor)) {
336 return;
337 }
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400338 boolean isFolder
339 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700340
Jeff Hamilton64144e42010-08-18 16:31:59 -0500341 final Activity activity = getActivity();
342 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500343 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800344 if (isFolder) {
345 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
346 } else {
347 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
348 if (mDisableNewWindow) {
349 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
350 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500351 }
John Reckc8490812010-11-22 14:15:36 -0800352 BookmarkItem header = new BookmarkItem(activity);
353 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800354 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500355
John Reckc8490812010-11-22 14:15:36 -0800356 int count = menu.size();
357 for (int i = 0; i < count; i++) {
358 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500359 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500360 }
361
John Reck1cebb442010-12-10 12:02:16 -0800362 boolean canEdit(Cursor c) {
363 String unique = c.getString(BookmarksLoader.COLUMN_INDEX_SERVER_UNIQUE);
364 return !ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS.equals(unique);
365 }
366
John Reckc8490812010-11-22 14:15:36 -0800367 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500368 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800369 if (isFolder) {
370 item.setUrl(null);
371 Bitmap bitmap =
John Reck439c9a52010-12-14 10:04:39 -0800372 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder_bookmark_widget_holo_dark);
John Reckc8490812010-11-22 14:15:36 -0800373 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800374 new LookupBookmarkCount(getActivity(), item)
375 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800376 } else {
377 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
378 item.setUrl(url);
379 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
380 if (bitmap == null) {
381 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
382 }
383 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500384 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500385 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800386
387 /**
388 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700389 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800390 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500391 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800392 super.onCreate(icicle);
393
Jeff Hamilton64144e42010-08-18 16:31:59 -0500394 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400395 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500396 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400397
Jeff Hamilton64144e42010-08-18 16:31:59 -0500398 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500399 public View onCreateView(LayoutInflater inflater, ViewGroup container,
400 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500401 Context context = getActivity();
402
Jeff Hamilton64144e42010-08-18 16:31:59 -0500403 View root = inflater.inflate(R.layout.bookmarks, container, false);
404 mEmptyView = root.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400405
Jeff Hamilton64144e42010-08-18 16:31:59 -0500406 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500407 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700408 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck8af90642010-11-23 10:27:29 -0800409 mList = (ListView) root.findViewById(R.id.list);
410 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800411 setEnableContextMenu(mEnableContextMenu);
412
413 // Prep the header
414 ViewGroup hc = mHeaderContainer;
415 if (hc == null) {
416 hc = (ViewGroup) root.findViewById(R.id.header_container);
417 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800418 }
John Reckf2057c22010-12-03 18:11:50 -0800419 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false);
420 hc.addView(mHeader);
John Reck608baa72010-11-24 10:32:28 -0800421 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
422 mCrumbs.setController(this);
John Reck89f73c12010-12-01 10:10:14 -0800423 mCrumbs.setUseBackButton(mCrumbBackButton);
424 mCrumbs.setMaxVisible(mCrumbMaxVisible);
425 mCrumbs.setVisibility(mCrumbVisibility);
426 String name = getString(R.string.bookmarks);
427 mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
428 if (mCallbacks != null) {
429 mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
430 }
John Reck608baa72010-11-24 10:32:28 -0800431 mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
432 mSelectBookmarkView.setOnClickListener(this);
Jeff Hamilton84029622010-08-05 14:29:28 -0500433
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500434 // Start the loaders
435 LoaderManager lm = getLoaderManager();
436 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800437 mCurrentView =
438 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
John Reck608baa72010-11-24 10:32:28 -0800439 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
John Reck608baa72010-11-24 10:32:28 -0800440 mSelectBookmarkView.setText(R.string.bookmark_list_view);
John Reck89f73c12010-12-01 10:10:14 -0800441 } else {
442 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
John Reck608baa72010-11-24 10:32:28 -0800443 }
John Reck8af90642010-11-23 10:27:29 -0800444 mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500445 String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
446 String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500447 if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
448 // There is an account set, load up that one
449 Bundle args = null;
450 if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
451 args = new Bundle();
452 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
453 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
454 }
Jeff Hamilton70c77692010-09-21 19:11:24 -0500455 lm.restartLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500456 } else {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500457 // No account set, load the account list first
Jeff Hamilton70c77692010-09-21 19:11:24 -0500458 lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500459 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500460
461 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700462 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800463
Jeff Hamilton64144e42010-08-18 16:31:59 -0500464 return root;
465 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700466
John Reck608baa72010-11-24 10:32:28 -0800467 @Override
468 public void onDestroyView() {
469 super.onDestroyView();
470 if (mHeaderContainer != null) {
471 mHeaderContainer.removeView(mHeader);
472 }
473 mCrumbs.setController(null);
474 mCrumbs = null;
John Reck439c9a52010-12-14 10:04:39 -0800475 getLoaderManager().stopLoader(LOADER_BOOKMARKS);
John Reck608baa72010-11-24 10:32:28 -0800476 }
477
Nicolas Catania095292f2010-03-15 09:00:14 -0700478 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500479 public void onReceivedIcon(String url, Bitmap icon) {
480 // A new favicon has been loaded, so let anything attached to the adapter know about it
481 // so new icons will be loaded.
482 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700483 }
484
Jeff Hamilton84029622010-08-05 14:29:28 -0500485 @Override
John Reck608baa72010-11-24 10:32:28 -0800486 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500487 // It is possible that the view has been canceled when we get to
488 // this point as back has a higher priority
489 if (mCanceled) {
490 android.util.Log.e(LOGTAG, "item clicked when dismissing");
491 return;
492 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500493
John Reck608baa72010-11-24 10:32:28 -0800494 Cursor cursor = mAdapter.getItem(position);
495 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
496 if (mCallbacks != null &&
497 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100498 return;
499 }
500
John Reck608baa72010-11-24 10:32:28 -0800501 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700502 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500503 Uri uri = ContentUris.withAppendedId(
504 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700505 if (mCrumbs != null) {
506 // update crumbs
507 mCrumbs.pushView(title, uri);
508 }
John Reck89f73c12010-12-01 10:10:14 -0800509 loadFolder(uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400510 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800511 }
512
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500513 @Override
514 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
515 Adapter adapter = parent.getAdapter();
516 String accountType = "com.google";
517 String accountName = adapter.getItem(position).toString();
518
Jeff Hamilton70c77692010-09-21 19:11:24 -0500519 Bundle args = null;
520 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
521 accountType = DEFAULT_ACCOUNT;
522 accountName = DEFAULT_ACCOUNT;
523 } else {
524 args = new Bundle();
525 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
526 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
527 }
528
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500529 // Remember the selection for later
530 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
531 .putString(PREF_ACCOUNT_TYPE, accountType)
532 .putString(PREF_ACCOUNT_NAME, accountName)
533 .apply();
534
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500535 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
536 }
537
538 @Override
539 public void onNothingSelected(AdapterView<?> parent) {
540 // Do nothing
541 }
542
John Reck608baa72010-11-24 10:32:28 -0800543 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500544 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700545 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500546 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
547 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800548 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800549 }
550
The Android Open Source Project0c908882009-03-03 19:32:16 -0800551 private void loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800552 if (mCallbacks != null) {
553 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
554 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800555 }
556
The Android Open Source Project0c908882009-03-03 19:32:16 -0800557 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800558 if (mCallbacks != null) {
559 mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
560 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800561 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700562
The Android Open Source Project0c908882009-03-03 19:32:16 -0800563 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500564 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800565 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500566 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700567 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500568 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700569 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500570 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
571 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
572 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700573 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500574 BitmapFactory.decodeByteArray(data, 0, data.length));
575 }
John Reckc8490812010-11-22 14:15:36 -0800576 item.putLong(BrowserContract.Bookmarks._ID,
577 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400578 item.putLong(BrowserContract.Bookmarks.PARENT,
579 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800580 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
581 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
582 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
583 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500584 }
585
586 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800587 // Put up a dialog asking if the user really wants to
588 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800589 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500590 Context context = getActivity();
Jeff Hamilton1a805652010-09-07 12:36:30 -0700591 final ContentResolver resolver = context.getContentResolver();
592 final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
593 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
594
Jeff Hamilton64144e42010-08-18 16:31:59 -0500595 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800596 .setTitle(R.string.delete_bookmark)
597 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton1a805652010-09-07 12:36:30 -0700598 .setMessage(context.getString(R.string.delete_bookmark_warning,
599 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700600 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800601 new DialogInterface.OnClickListener() {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500602 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800603 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700604 resolver.delete(uri, null, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800605 }
606 })
607 .setNegativeButton(R.string.cancel, null)
608 .show();
609 }
610
Jeff Hamilton84029622010-08-05 14:29:28 -0500611 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800612 return getUrl(mAdapter.getItem(position));
613 }
614
615 /* package */ static String getUrl(Cursor c) {
616 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800617 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700618
The Android Open Source Project0c908882009-03-03 19:32:16 -0800619 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500620 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
621 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700622 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800623 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700624
John Reck8af90642010-11-23 10:27:29 -0800625 void selectView(int view) {
626 if (view == mCurrentView) {
627 return;
628 }
629 mCurrentView = view;
John Reck89f73c12010-12-01 10:10:14 -0800630 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
631 mSelectBookmarkView.setText(R.string.bookmark_list_view);
632 } else {
633 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
634 }
John Reck8af90642010-11-23 10:27:29 -0800635 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
636 Editor edit = prefs.edit();
637 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
638 edit.apply();
639 if (mEmptyView.getVisibility() == View.VISIBLE) {
640 return;
641 }
642 setupBookmarkView();
643 }
644
645 private void setupBookmarkView() {
646 mAdapter.selectView(mCurrentView);
647 switch (mCurrentView) {
648 case VIEW_THUMBNAILS:
649 mList.setAdapter(null);
650 mGrid.setAdapter(mAdapter);
651 mGrid.setVisibility(View.VISIBLE);
652 mList.setVisibility(View.GONE);
653 break;
654 case VIEW_LIST:
655 mGrid.setAdapter(null);
656 mList.setAdapter(mAdapter);
657 mGrid.setVisibility(View.GONE);
658 mList.setVisibility(View.VISIBLE);
659 break;
660 }
661 }
John Reck608baa72010-11-24 10:32:28 -0800662
John Reck608baa72010-11-24 10:32:28 -0800663 /**
664 * BreadCrumb controller callback
665 */
666 @Override
667 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800668 Uri uri = (Uri) data;
669 if (uri == null) {
670 // top level
671 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
672 }
673 loadFolder(uri);
674 }
675
676 /**
677 * @param uri
678 */
679 private void loadFolder(Uri uri) {
680 LoaderManager manager = getLoaderManager();
681 BookmarksLoader loader =
682 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
683 loader.setUri(uri);
684 loader.forceLoad();
685 if (mCallbacks != null) {
686 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
687 }
John Reck608baa72010-11-24 10:32:28 -0800688 }
689
690 @Override
691 public void onClick(View view) {
692 if (mSelectBookmarkView == view) {
John Reck89f73c12010-12-01 10:10:14 -0800693 selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
694 ? BrowserBookmarksPage.VIEW_THUMBNAILS
695 : BrowserBookmarksPage.VIEW_LIST);
John Reck608baa72010-11-24 10:32:28 -0800696 }
697 }
698
699 @Override
700 public boolean onMenuItemClick(MenuItem item) {
701 switch (item.getItemId()) {
702 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800703 selectView(BrowserBookmarksPage.VIEW_LIST);
704 return true;
705 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800706 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
707 return true;
708 }
709 return false;
710 }
711
712 public boolean onBackPressed() {
John Reckd4893b02010-12-07 17:38:34 -0800713 if (canGoBack()) {
John Reck608baa72010-11-24 10:32:28 -0800714 mCrumbs.popView();
715 return true;
716 }
717 return false;
718 }
719
John Reckd4893b02010-12-07 17:38:34 -0800720 private boolean canGoBack() {
721 Crumb c = mCrumbs.getTopCrumb();
722 return c != null && c.canGoBack;
723 }
724
John Reck608baa72010-11-24 10:32:28 -0800725 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
726 mCallbacks = callbackListener;
727 }
728
729 public void setEnableContextMenu(boolean enable) {
730 mEnableContextMenu = enable;
731 if (mGrid != null) {
732 if (mEnableContextMenu) {
733 registerForContextMenu(mGrid);
734 } else {
735 unregisterForContextMenu(mGrid);
736 mGrid.setLongClickable(false);
737 }
738 }
739 if (mList != null) {
740 if (mEnableContextMenu) {
741 registerForContextMenu(mList);
742 } else {
743 unregisterForContextMenu(mList);
744 mList.setLongClickable(false);
745 }
746 }
747 }
John Reckc8490812010-11-22 14:15:36 -0800748
749 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
750 Context mContext;
751 BookmarkItem mHeader;
752
753 public LookupBookmarkCount(Context context, BookmarkItem header) {
754 mContext = context;
755 mHeader = header;
756 }
757
758 @Override
759 protected Integer doInBackground(Long... params) {
760 if (params.length != 1) {
761 throw new IllegalArgumentException("Missing folder id!");
762 }
763 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
764 Cursor c = mContext.getContentResolver().query(uri,
765 null, BrowserContract.Bookmarks.PARENT + "=?",
766 new String[] {params[0].toString()}, null);
767 return c.getCount();
768 }
769
770 @Override
771 protected void onPostExecute(Integer result) {
772 if (result > 0) {
773 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
774 result));
775 } else if (result == 0) {
776 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
777 }
778 }
779 }
John Reck89f73c12010-12-01 10:10:14 -0800780
781 public void setBreadCrumbVisibility(int visibility) {
782 mCrumbVisibility = visibility;
783 if (mCrumbs != null) {
784 mCrumbs.setVisibility(mCrumbVisibility);
785 }
786 }
787
788 public void setBreadCrumbUseBackButton(boolean use) {
789 mCrumbBackButton = use;
790 if (mCrumbs != null) {
791 mCrumbs.setUseBackButton(mCrumbBackButton);
792 }
793 }
794
795 public void setBreadCrumbMaxVisible(int max) {
796 mCrumbMaxVisible = max;
797 if (mCrumbs != null) {
798 mCrumbs.setMaxVisible(mCrumbMaxVisible);
799 }
800 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800801}