blob: c030915101b35351e8ee67d5e550af9542811b05 [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 =
372 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder);
373 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;
475 }
476
Nicolas Catania095292f2010-03-15 09:00:14 -0700477 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500478 public void onReceivedIcon(String url, Bitmap icon) {
479 // A new favicon has been loaded, so let anything attached to the adapter know about it
480 // so new icons will be loaded.
481 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700482 }
483
Jeff Hamilton84029622010-08-05 14:29:28 -0500484 @Override
John Reck608baa72010-11-24 10:32:28 -0800485 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500486 // It is possible that the view has been canceled when we get to
487 // this point as back has a higher priority
488 if (mCanceled) {
489 android.util.Log.e(LOGTAG, "item clicked when dismissing");
490 return;
491 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500492
John Reck608baa72010-11-24 10:32:28 -0800493 Cursor cursor = mAdapter.getItem(position);
494 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
495 if (mCallbacks != null &&
496 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100497 return;
498 }
499
John Reck608baa72010-11-24 10:32:28 -0800500 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700501 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500502 Uri uri = ContentUris.withAppendedId(
503 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700504 if (mCrumbs != null) {
505 // update crumbs
506 mCrumbs.pushView(title, uri);
507 }
John Reck89f73c12010-12-01 10:10:14 -0800508 loadFolder(uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400509 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800510 }
511
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500512 @Override
513 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
514 Adapter adapter = parent.getAdapter();
515 String accountType = "com.google";
516 String accountName = adapter.getItem(position).toString();
517
Jeff Hamilton70c77692010-09-21 19:11:24 -0500518 Bundle args = null;
519 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
520 accountType = DEFAULT_ACCOUNT;
521 accountName = DEFAULT_ACCOUNT;
522 } else {
523 args = new Bundle();
524 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
525 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
526 }
527
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500528 // Remember the selection for later
529 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
530 .putString(PREF_ACCOUNT_TYPE, accountType)
531 .putString(PREF_ACCOUNT_NAME, accountName)
532 .apply();
533
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500534 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
535 }
536
537 @Override
538 public void onNothingSelected(AdapterView<?> parent) {
539 // Do nothing
540 }
541
John Reck608baa72010-11-24 10:32:28 -0800542 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500543 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700544 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500545 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
546 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800547 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800548 }
549
The Android Open Source Project0c908882009-03-03 19:32:16 -0800550 private void loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800551 if (mCallbacks != null) {
552 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
553 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800554 }
555
The Android Open Source Project0c908882009-03-03 19:32:16 -0800556 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800557 if (mCallbacks != null) {
558 mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
559 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800560 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700561
The Android Open Source Project0c908882009-03-03 19:32:16 -0800562 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500563 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800564 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500565 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700566 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500567 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700568 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500569 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
570 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
571 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700572 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500573 BitmapFactory.decodeByteArray(data, 0, data.length));
574 }
John Reckc8490812010-11-22 14:15:36 -0800575 item.putLong(BrowserContract.Bookmarks._ID,
576 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400577 item.putLong(BrowserContract.Bookmarks.PARENT,
578 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800579 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
580 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
581 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
582 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500583 }
584
585 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800586 // Put up a dialog asking if the user really wants to
587 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800588 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500589 Context context = getActivity();
Jeff Hamilton1a805652010-09-07 12:36:30 -0700590 final ContentResolver resolver = context.getContentResolver();
591 final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
592 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
593
Jeff Hamilton64144e42010-08-18 16:31:59 -0500594 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800595 .setTitle(R.string.delete_bookmark)
596 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton1a805652010-09-07 12:36:30 -0700597 .setMessage(context.getString(R.string.delete_bookmark_warning,
598 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700599 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800600 new DialogInterface.OnClickListener() {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500601 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800602 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700603 resolver.delete(uri, null, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800604 }
605 })
606 .setNegativeButton(R.string.cancel, null)
607 .show();
608 }
609
Jeff Hamilton84029622010-08-05 14:29:28 -0500610 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800611 return getUrl(mAdapter.getItem(position));
612 }
613
614 /* package */ static String getUrl(Cursor c) {
615 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800616 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700617
The Android Open Source Project0c908882009-03-03 19:32:16 -0800618 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500619 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
620 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700621 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800622 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700623
John Reck8af90642010-11-23 10:27:29 -0800624 void selectView(int view) {
625 if (view == mCurrentView) {
626 return;
627 }
628 mCurrentView = view;
John Reck89f73c12010-12-01 10:10:14 -0800629 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
630 mSelectBookmarkView.setText(R.string.bookmark_list_view);
631 } else {
632 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
633 }
John Reck8af90642010-11-23 10:27:29 -0800634 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
635 Editor edit = prefs.edit();
636 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
637 edit.apply();
638 if (mEmptyView.getVisibility() == View.VISIBLE) {
639 return;
640 }
641 setupBookmarkView();
642 }
643
644 private void setupBookmarkView() {
645 mAdapter.selectView(mCurrentView);
646 switch (mCurrentView) {
647 case VIEW_THUMBNAILS:
648 mList.setAdapter(null);
649 mGrid.setAdapter(mAdapter);
650 mGrid.setVisibility(View.VISIBLE);
651 mList.setVisibility(View.GONE);
652 break;
653 case VIEW_LIST:
654 mGrid.setAdapter(null);
655 mList.setAdapter(mAdapter);
656 mGrid.setVisibility(View.GONE);
657 mList.setVisibility(View.VISIBLE);
658 break;
659 }
660 }
John Reck608baa72010-11-24 10:32:28 -0800661
John Reck608baa72010-11-24 10:32:28 -0800662 /**
663 * BreadCrumb controller callback
664 */
665 @Override
666 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800667 Uri uri = (Uri) data;
668 if (uri == null) {
669 // top level
670 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
671 }
672 loadFolder(uri);
673 }
674
675 /**
676 * @param uri
677 */
678 private void loadFolder(Uri uri) {
679 LoaderManager manager = getLoaderManager();
680 BookmarksLoader loader =
681 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
682 loader.setUri(uri);
683 loader.forceLoad();
684 if (mCallbacks != null) {
685 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
686 }
John Reck608baa72010-11-24 10:32:28 -0800687 }
688
689 @Override
690 public void onClick(View view) {
691 if (mSelectBookmarkView == view) {
John Reck89f73c12010-12-01 10:10:14 -0800692 selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
693 ? BrowserBookmarksPage.VIEW_THUMBNAILS
694 : BrowserBookmarksPage.VIEW_LIST);
John Reck608baa72010-11-24 10:32:28 -0800695 }
696 }
697
698 @Override
699 public boolean onMenuItemClick(MenuItem item) {
700 switch (item.getItemId()) {
701 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800702 selectView(BrowserBookmarksPage.VIEW_LIST);
703 return true;
704 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800705 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
706 return true;
707 }
708 return false;
709 }
710
711 public boolean onBackPressed() {
John Reckd4893b02010-12-07 17:38:34 -0800712 if (canGoBack()) {
John Reck608baa72010-11-24 10:32:28 -0800713 mCrumbs.popView();
714 return true;
715 }
716 return false;
717 }
718
John Reckd4893b02010-12-07 17:38:34 -0800719 private boolean canGoBack() {
720 Crumb c = mCrumbs.getTopCrumb();
721 return c != null && c.canGoBack;
722 }
723
John Reck608baa72010-11-24 10:32:28 -0800724 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
725 mCallbacks = callbackListener;
726 }
727
728 public void setEnableContextMenu(boolean enable) {
729 mEnableContextMenu = enable;
730 if (mGrid != null) {
731 if (mEnableContextMenu) {
732 registerForContextMenu(mGrid);
733 } else {
734 unregisterForContextMenu(mGrid);
735 mGrid.setLongClickable(false);
736 }
737 }
738 if (mList != null) {
739 if (mEnableContextMenu) {
740 registerForContextMenu(mList);
741 } else {
742 unregisterForContextMenu(mList);
743 mList.setLongClickable(false);
744 }
745 }
746 }
John Reckc8490812010-11-22 14:15:36 -0800747
748 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
749 Context mContext;
750 BookmarkItem mHeader;
751
752 public LookupBookmarkCount(Context context, BookmarkItem header) {
753 mContext = context;
754 mHeader = header;
755 }
756
757 @Override
758 protected Integer doInBackground(Long... params) {
759 if (params.length != 1) {
760 throw new IllegalArgumentException("Missing folder id!");
761 }
762 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
763 Cursor c = mContext.getContentResolver().query(uri,
764 null, BrowserContract.Bookmarks.PARENT + "=?",
765 new String[] {params[0].toString()}, null);
766 return c.getCount();
767 }
768
769 @Override
770 protected void onPostExecute(Integer result) {
771 if (result > 0) {
772 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
773 result));
774 } else if (result == 0) {
775 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
776 }
777 }
778 }
John Reck89f73c12010-12-01 10:10:14 -0800779
780 public void setBreadCrumbVisibility(int visibility) {
781 mCrumbVisibility = visibility;
782 if (mCrumbs != null) {
783 mCrumbs.setVisibility(mCrumbVisibility);
784 }
785 }
786
787 public void setBreadCrumbUseBackButton(boolean use) {
788 mCrumbBackButton = use;
789 if (mCrumbs != null) {
790 mCrumbs.setUseBackButton(mCrumbBackButton);
791 }
792 }
793
794 public void setBreadCrumbMaxVisible(int max) {
795 mCrumbMaxVisible = max;
796 if (mCrumbs != null) {
797 mCrumbs.setMaxVisible(mCrumbMaxVisible);
798 }
799 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800800}