blob: 3fc270e7d47a6d381ebe9df4d056be9875b6e541 [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
Dianne Hackborn39772c82010-12-16 00:43:54 -0800234 public void onLoaderReset(Loader<Cursor> loader) {
235 onLoadFinished(loader, null);
236 switch (loader.getId()) {
237 case LOADER_BOOKMARKS: {
238 onLoadFinished(loader, null);
239 break;
240 }
241 }
242 }
243
Michael Kolb370a4f32010-10-06 10:45:32 -0700244 long getFolderId() {
245 LoaderManager manager = getLoaderManager();
246 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800247 (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700248
249 Uri uri = loader.getUri();
250 if (uri != null) {
251 try {
252 return ContentUris.parseId(uri);
253 } catch (NumberFormatException nfx) {
254 return -1;
255 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500256 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700257 return -1;
258 }
259
The Android Open Source Project0c908882009-03-03 19:32:16 -0800260 @Override
261 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500262 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800263 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700264 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800265 if (mCanceled) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400266 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800267 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700268 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800269 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
270 // If we have no menu info, we can't tell which item was selected.
271 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400272 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800273 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700274
The Android Open Source Project0c908882009-03-03 19:32:16 -0800275 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800276 case R.id.open_context_menu_id:
277 loadUrl(i.position);
278 break;
279 case R.id.edit_context_menu_id:
280 editBookmark(i.position);
281 break;
282 case R.id.shortcut_context_menu_id:
John Reck608baa72010-11-24 10:32:28 -0800283 Cursor c = mAdapter.getItem(i.position);
284 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800285 break;
286 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500287 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800288 break;
289 case R.id.new_window_context_menu_id:
290 openInNewWindow(i.position);
291 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500292 case R.id.share_link_context_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800293 Cursor cursor = mAdapter.getItem(i.position);
Michael Kolb8233fac2010-10-26 16:08:53 -0700294 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500295 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
296 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
297 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
298 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800299 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500300 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800301 case R.id.copy_url_context_menu_id:
302 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400303 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500304 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500305 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
306 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400307 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500308 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400309 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500310 case R.id.save_to_bookmarks_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800311 Cursor cursor = mAdapter.getItem(i.position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500312 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
313 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400314 // If the site is bookmarked, the item becomes remove from
315 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500316 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400317 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500318 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800319 default:
320 return super.onContextItemSelected(item);
321 }
322 return true;
323 }
324
John Reck608baa72010-11-24 10:32:28 -0800325 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500326 byte[] data = cursor.getBlob(columnIndex);
327 if (data == null) {
328 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800329 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500330 return BitmapFactory.decodeByteArray(data, 0, data.length);
331 }
332
John Reckc8490812010-11-22 14:15:36 -0800333 private MenuItem.OnMenuItemClickListener mContextItemClickListener =
334 new MenuItem.OnMenuItemClickListener() {
335 @Override
336 public boolean onMenuItemClick(MenuItem item) {
337 return onContextItemSelected(item);
338 }
339 };
340
Jeff Hamilton84029622010-08-05 14:29:28 -0500341 @Override
342 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
343 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800344 Cursor cursor = mAdapter.getItem(info.position);
John Reck1cebb442010-12-10 12:02:16 -0800345 if (!canEdit(cursor)) {
346 return;
347 }
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400348 boolean isFolder
349 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700350
Jeff Hamilton64144e42010-08-18 16:31:59 -0500351 final Activity activity = getActivity();
352 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500353 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800354 if (isFolder) {
355 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
356 } else {
357 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
358 if (mDisableNewWindow) {
359 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
360 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500361 }
John Reckc8490812010-11-22 14:15:36 -0800362 BookmarkItem header = new BookmarkItem(activity);
363 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800364 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500365
John Reckc8490812010-11-22 14:15:36 -0800366 int count = menu.size();
367 for (int i = 0; i < count; i++) {
368 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500369 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500370 }
371
John Reck1cebb442010-12-10 12:02:16 -0800372 boolean canEdit(Cursor c) {
373 String unique = c.getString(BookmarksLoader.COLUMN_INDEX_SERVER_UNIQUE);
374 return !ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS.equals(unique);
375 }
376
John Reckc8490812010-11-22 14:15:36 -0800377 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500378 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800379 if (isFolder) {
380 item.setUrl(null);
381 Bitmap bitmap =
John Reck439c9a52010-12-14 10:04:39 -0800382 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder_bookmark_widget_holo_dark);
John Reckc8490812010-11-22 14:15:36 -0800383 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800384 new LookupBookmarkCount(getActivity(), item)
385 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800386 } else {
387 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
388 item.setUrl(url);
389 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
390 if (bitmap == null) {
391 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
392 }
393 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500394 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500395 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800396
397 /**
398 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700399 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800400 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500401 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800402 super.onCreate(icicle);
403
Jeff Hamilton64144e42010-08-18 16:31:59 -0500404 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400405 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500406 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400407
Jeff Hamilton64144e42010-08-18 16:31:59 -0500408 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500409 public View onCreateView(LayoutInflater inflater, ViewGroup container,
410 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500411 Context context = getActivity();
412
Jeff Hamilton64144e42010-08-18 16:31:59 -0500413 View root = inflater.inflate(R.layout.bookmarks, container, false);
414 mEmptyView = root.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400415
Jeff Hamilton64144e42010-08-18 16:31:59 -0500416 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500417 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700418 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck8af90642010-11-23 10:27:29 -0800419 mList = (ListView) root.findViewById(R.id.list);
420 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800421 setEnableContextMenu(mEnableContextMenu);
422
423 // Prep the header
424 ViewGroup hc = mHeaderContainer;
425 if (hc == null) {
426 hc = (ViewGroup) root.findViewById(R.id.header_container);
427 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800428 }
John Reckf2057c22010-12-03 18:11:50 -0800429 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false);
430 hc.addView(mHeader);
John Reck608baa72010-11-24 10:32:28 -0800431 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
432 mCrumbs.setController(this);
John Reck89f73c12010-12-01 10:10:14 -0800433 mCrumbs.setUseBackButton(mCrumbBackButton);
434 mCrumbs.setMaxVisible(mCrumbMaxVisible);
435 mCrumbs.setVisibility(mCrumbVisibility);
436 String name = getString(R.string.bookmarks);
437 mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
438 if (mCallbacks != null) {
439 mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
440 }
John Reck608baa72010-11-24 10:32:28 -0800441 mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
442 mSelectBookmarkView.setOnClickListener(this);
Jeff Hamilton84029622010-08-05 14:29:28 -0500443
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500444 // Start the loaders
445 LoaderManager lm = getLoaderManager();
446 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800447 mCurrentView =
448 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
John Reck608baa72010-11-24 10:32:28 -0800449 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
John Reck608baa72010-11-24 10:32:28 -0800450 mSelectBookmarkView.setText(R.string.bookmark_list_view);
John Reck89f73c12010-12-01 10:10:14 -0800451 } else {
452 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
John Reck608baa72010-11-24 10:32:28 -0800453 }
John Reck8af90642010-11-23 10:27:29 -0800454 mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500455 String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
456 String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500457 if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
458 // There is an account set, load up that one
459 Bundle args = null;
460 if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
461 args = new Bundle();
462 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
463 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
464 }
Jeff Hamilton70c77692010-09-21 19:11:24 -0500465 lm.restartLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500466 } else {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500467 // No account set, load the account list first
Jeff Hamilton70c77692010-09-21 19:11:24 -0500468 lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500469 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500470
471 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700472 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800473
Jeff Hamilton64144e42010-08-18 16:31:59 -0500474 return root;
475 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700476
John Reck608baa72010-11-24 10:32:28 -0800477 @Override
478 public void onDestroyView() {
479 super.onDestroyView();
480 if (mHeaderContainer != null) {
481 mHeaderContainer.removeView(mHeader);
482 }
483 mCrumbs.setController(null);
484 mCrumbs = null;
John Reck439c9a52010-12-14 10:04:39 -0800485 getLoaderManager().stopLoader(LOADER_BOOKMARKS);
John Reck608baa72010-11-24 10:32:28 -0800486 }
487
Nicolas Catania095292f2010-03-15 09:00:14 -0700488 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500489 public void onReceivedIcon(String url, Bitmap icon) {
490 // A new favicon has been loaded, so let anything attached to the adapter know about it
491 // so new icons will be loaded.
492 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700493 }
494
Jeff Hamilton84029622010-08-05 14:29:28 -0500495 @Override
John Reck608baa72010-11-24 10:32:28 -0800496 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500497 // It is possible that the view has been canceled when we get to
498 // this point as back has a higher priority
499 if (mCanceled) {
500 android.util.Log.e(LOGTAG, "item clicked when dismissing");
501 return;
502 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500503
John Reck608baa72010-11-24 10:32:28 -0800504 Cursor cursor = mAdapter.getItem(position);
505 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
506 if (mCallbacks != null &&
507 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100508 return;
509 }
510
John Reck608baa72010-11-24 10:32:28 -0800511 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700512 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500513 Uri uri = ContentUris.withAppendedId(
514 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700515 if (mCrumbs != null) {
516 // update crumbs
517 mCrumbs.pushView(title, uri);
518 }
John Reck89f73c12010-12-01 10:10:14 -0800519 loadFolder(uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400520 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800521 }
522
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500523 @Override
524 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
525 Adapter adapter = parent.getAdapter();
526 String accountType = "com.google";
527 String accountName = adapter.getItem(position).toString();
528
Jeff Hamilton70c77692010-09-21 19:11:24 -0500529 Bundle args = null;
530 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
531 accountType = DEFAULT_ACCOUNT;
532 accountName = DEFAULT_ACCOUNT;
533 } else {
534 args = new Bundle();
535 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
536 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
537 }
538
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500539 // Remember the selection for later
540 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
541 .putString(PREF_ACCOUNT_TYPE, accountType)
542 .putString(PREF_ACCOUNT_NAME, accountName)
543 .apply();
544
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500545 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
546 }
547
548 @Override
549 public void onNothingSelected(AdapterView<?> parent) {
550 // Do nothing
551 }
552
John Reck608baa72010-11-24 10:32:28 -0800553 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500554 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700555 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500556 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
557 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800558 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800559 }
560
The Android Open Source Project0c908882009-03-03 19:32:16 -0800561 private void loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800562 if (mCallbacks != null) {
563 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
564 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800565 }
566
The Android Open Source Project0c908882009-03-03 19:32:16 -0800567 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800568 if (mCallbacks != null) {
569 mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
570 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800571 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700572
The Android Open Source Project0c908882009-03-03 19:32:16 -0800573 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500574 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800575 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500576 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700577 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500578 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700579 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500580 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
581 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
582 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700583 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500584 BitmapFactory.decodeByteArray(data, 0, data.length));
585 }
John Reckc8490812010-11-22 14:15:36 -0800586 item.putLong(BrowserContract.Bookmarks._ID,
587 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400588 item.putLong(BrowserContract.Bookmarks.PARENT,
589 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800590 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
591 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
592 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
593 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500594 }
595
596 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800597 // Put up a dialog asking if the user really wants to
598 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800599 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500600 Context context = getActivity();
Jeff Hamilton1a805652010-09-07 12:36:30 -0700601 final ContentResolver resolver = context.getContentResolver();
602 final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
603 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
604
Jeff Hamilton64144e42010-08-18 16:31:59 -0500605 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800606 .setTitle(R.string.delete_bookmark)
607 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton1a805652010-09-07 12:36:30 -0700608 .setMessage(context.getString(R.string.delete_bookmark_warning,
609 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700610 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800611 new DialogInterface.OnClickListener() {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500612 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800613 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700614 resolver.delete(uri, null, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800615 }
616 })
617 .setNegativeButton(R.string.cancel, null)
618 .show();
619 }
620
Jeff Hamilton84029622010-08-05 14:29:28 -0500621 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800622 return getUrl(mAdapter.getItem(position));
623 }
624
625 /* package */ static String getUrl(Cursor c) {
626 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800627 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700628
The Android Open Source Project0c908882009-03-03 19:32:16 -0800629 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500630 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
631 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700632 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800633 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700634
John Reck8af90642010-11-23 10:27:29 -0800635 void selectView(int view) {
636 if (view == mCurrentView) {
637 return;
638 }
639 mCurrentView = view;
John Reck89f73c12010-12-01 10:10:14 -0800640 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
641 mSelectBookmarkView.setText(R.string.bookmark_list_view);
642 } else {
643 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
644 }
John Reck8af90642010-11-23 10:27:29 -0800645 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
646 Editor edit = prefs.edit();
647 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
648 edit.apply();
649 if (mEmptyView.getVisibility() == View.VISIBLE) {
650 return;
651 }
652 setupBookmarkView();
653 }
654
655 private void setupBookmarkView() {
656 mAdapter.selectView(mCurrentView);
657 switch (mCurrentView) {
658 case VIEW_THUMBNAILS:
659 mList.setAdapter(null);
660 mGrid.setAdapter(mAdapter);
661 mGrid.setVisibility(View.VISIBLE);
662 mList.setVisibility(View.GONE);
663 break;
664 case VIEW_LIST:
665 mGrid.setAdapter(null);
666 mList.setAdapter(mAdapter);
667 mGrid.setVisibility(View.GONE);
668 mList.setVisibility(View.VISIBLE);
669 break;
670 }
671 }
John Reck608baa72010-11-24 10:32:28 -0800672
John Reck608baa72010-11-24 10:32:28 -0800673 /**
674 * BreadCrumb controller callback
675 */
676 @Override
677 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800678 Uri uri = (Uri) data;
679 if (uri == null) {
680 // top level
681 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
682 }
683 loadFolder(uri);
684 }
685
686 /**
687 * @param uri
688 */
689 private void loadFolder(Uri uri) {
690 LoaderManager manager = getLoaderManager();
691 BookmarksLoader loader =
692 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
693 loader.setUri(uri);
694 loader.forceLoad();
695 if (mCallbacks != null) {
696 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
697 }
John Reck608baa72010-11-24 10:32:28 -0800698 }
699
700 @Override
701 public void onClick(View view) {
702 if (mSelectBookmarkView == view) {
John Reck89f73c12010-12-01 10:10:14 -0800703 selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
704 ? BrowserBookmarksPage.VIEW_THUMBNAILS
705 : BrowserBookmarksPage.VIEW_LIST);
John Reck608baa72010-11-24 10:32:28 -0800706 }
707 }
708
709 @Override
710 public boolean onMenuItemClick(MenuItem item) {
711 switch (item.getItemId()) {
712 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800713 selectView(BrowserBookmarksPage.VIEW_LIST);
714 return true;
715 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800716 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
717 return true;
718 }
719 return false;
720 }
721
722 public boolean onBackPressed() {
John Reckd4893b02010-12-07 17:38:34 -0800723 if (canGoBack()) {
John Reck608baa72010-11-24 10:32:28 -0800724 mCrumbs.popView();
725 return true;
726 }
727 return false;
728 }
729
John Reckd4893b02010-12-07 17:38:34 -0800730 private boolean canGoBack() {
731 Crumb c = mCrumbs.getTopCrumb();
732 return c != null && c.canGoBack;
733 }
734
John Reck608baa72010-11-24 10:32:28 -0800735 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
736 mCallbacks = callbackListener;
737 }
738
739 public void setEnableContextMenu(boolean enable) {
740 mEnableContextMenu = enable;
741 if (mGrid != null) {
742 if (mEnableContextMenu) {
743 registerForContextMenu(mGrid);
744 } else {
745 unregisterForContextMenu(mGrid);
746 mGrid.setLongClickable(false);
747 }
748 }
749 if (mList != null) {
750 if (mEnableContextMenu) {
751 registerForContextMenu(mList);
752 } else {
753 unregisterForContextMenu(mList);
754 mList.setLongClickable(false);
755 }
756 }
757 }
John Reckc8490812010-11-22 14:15:36 -0800758
759 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
760 Context mContext;
761 BookmarkItem mHeader;
762
763 public LookupBookmarkCount(Context context, BookmarkItem header) {
764 mContext = context;
765 mHeader = header;
766 }
767
768 @Override
769 protected Integer doInBackground(Long... params) {
770 if (params.length != 1) {
771 throw new IllegalArgumentException("Missing folder id!");
772 }
773 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
774 Cursor c = mContext.getContentResolver().query(uri,
775 null, BrowserContract.Bookmarks.PARENT + "=?",
776 new String[] {params[0].toString()}, null);
777 return c.getCount();
778 }
779
780 @Override
781 protected void onPostExecute(Integer result) {
782 if (result > 0) {
783 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
784 result));
785 } else if (result == 0) {
786 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
787 }
788 }
789 }
John Reck89f73c12010-12-01 10:10:14 -0800790
791 public void setBreadCrumbVisibility(int visibility) {
792 mCrumbVisibility = visibility;
793 if (mCrumbs != null) {
794 mCrumbs.setVisibility(mCrumbVisibility);
795 }
796 }
797
798 public void setBreadCrumbUseBackButton(boolean use) {
799 mCrumbBackButton = use;
800 if (mCrumbs != null) {
801 mCrumbs.setUseBackButton(mCrumbBackButton);
802 }
803 }
804
805 public void setBreadCrumbMaxVisible(int max) {
806 mCrumbMaxVisible = max;
807 if (mCrumbs != null) {
808 mCrumbs.setMaxVisible(mCrumbMaxVisible);
809 }
810 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800811}