blob: 2df056169ecbc4b914725709978bda9933cfbdf2 [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;
John Reckb3417f02011-01-14 11:01:05 -080036import android.content.res.Configuration;
37import android.content.res.Resources;
Jeff Hamilton84029622010-08-05 14:29:28 -050038import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080039import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050040import android.graphics.BitmapFactory;
41import android.net.Uri;
John Reckc8490812010-11-22 14:15:36 -080042import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080043import android.os.Bundle;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050044import android.preference.PreferenceManager;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050045import android.provider.BrowserContract;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050046import android.provider.BrowserContract.Accounts;
John Reck1cebb442010-12-10 12:02:16 -080047import android.provider.BrowserContract.ChromeSyncColumns;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050048import android.text.TextUtils;
The Android Open Source Project0c908882009-03-03 19:32:16 -080049import android.view.ContextMenu;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050050import android.view.ContextMenu.ContextMenuInfo;
Jeff Hamilton64144e42010-08-18 16:31:59 -050051import android.view.LayoutInflater;
John Reckb3417f02011-01-14 11:01:05 -080052import android.view.Menu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080053import android.view.MenuInflater;
54import android.view.MenuItem;
55import android.view.View;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050056import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050057import android.webkit.WebIconDatabase.IconListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050058import android.widget.Adapter;
The Android Open Source Project0c908882009-03-03 19:32:16 -080059import android.widget.AdapterView;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050060import android.widget.AdapterView.OnItemClickListener;
61import android.widget.AdapterView.OnItemSelectedListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050062import android.widget.GridView;
John Reck8af90642010-11-23 10:27:29 -080063import android.widget.ListView;
John Reck608baa72010-11-24 10:32:28 -080064import android.widget.PopupMenu.OnMenuItemClickListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050065import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080066
John Reck608baa72010-11-24 10:32:28 -080067interface BookmarksPageCallbacks {
68 // Return true if handled
69 boolean onBookmarkSelected(Cursor c, boolean isFolder);
70 // Return true if handled
71 boolean onOpenInNewWindow(Cursor c);
John Reck89f73c12010-12-01 10:10:14 -080072 void onFolderChanged(int level, Uri uri);
John Reck608baa72010-11-24 10:32:28 -080073}
74
The Android Open Source Project0c908882009-03-03 19:32:16 -080075/**
76 * View showing the user's bookmarks in the browser.
77 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050078public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
Michael Kolb370a4f32010-10-06 10:45:32 -070079 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
John Reckb3417f02011-01-14 11:01:05 -080080 OnItemSelectedListener, BreadCrumbView.Controller, OnMenuItemClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080081
Jeff Hamilton84029622010-08-05 14:29:28 -050082 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070083
Jeff Hamilton84029622010-08-05 14:29:28 -050084 static final int LOADER_BOOKMARKS = 1;
Jeff Hamiltona9bad832010-09-24 11:05:30 -050085 static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
Jeff Hamilton84029622010-08-05 14:29:28 -050086
Michael Kolb801ecb72010-08-25 12:57:38 -070087 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
88
Jeff Hamilton70c77692010-09-21 19:11:24 -050089 static final String ACCOUNT_NAME_UNSYNCED = "Unsynced";
Michael Kolbe421c242010-10-04 19:29:01 -070090
Jeff Hamilton7f6cf3e2010-09-17 17:22:21 -050091 public static final String PREF_ACCOUNT_TYPE = "acct_type";
92 public static final String PREF_ACCOUNT_NAME = "acct_name";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050093
94 static final String DEFAULT_ACCOUNT = "local";
John Reck8af90642010-11-23 10:27:29 -080095 static final int VIEW_THUMBNAILS = 1;
96 static final int VIEW_LIST = 2;
97 static final String PREF_SELECTED_VIEW = "bookmarks_view";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050098
John Reck608baa72010-11-24 10:32:28 -080099 BookmarksPageCallbacks mCallbacks;
Jeff Hamilton84029622010-08-05 14:29:28 -0500100 GridView mGrid;
John Reck8af90642010-11-23 10:27:29 -0800101 ListView mList;
Jeff Hamilton84029622010-08-05 14:29:28 -0500102 BrowserBookmarksAdapter mAdapter;
103 boolean mDisableNewWindow;
Jeff Hamilton84029622010-08-05 14:29:28 -0500104 boolean mCanceled = false;
John Reck608baa72010-11-24 10:32:28 -0800105 boolean mEnableContextMenu = true;
106 boolean mShowRootFolder = false;
Jeff Hamilton84029622010-08-05 14:29:28 -0500107 View mEmptyView;
John Reck8af90642010-11-23 10:27:29 -0800108 int mCurrentView;
John Reck608baa72010-11-24 10:32:28 -0800109 View mHeader;
John Reck608baa72010-11-24 10:32:28 -0800110 ViewGroup mHeaderContainer;
Michael Kolb370a4f32010-10-06 10:45:32 -0700111 BreadCrumbView mCrumbs;
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
John Reckb3417f02011-01-14 11:01:05 -0800342 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
343 inflater.inflate(R.menu.bookmark, menu);
344 }
345
346 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500347 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
348 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800349 Cursor cursor = mAdapter.getItem(info.position);
John Reck1cebb442010-12-10 12:02:16 -0800350 if (!canEdit(cursor)) {
351 return;
352 }
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400353 boolean isFolder
354 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700355
Jeff Hamilton64144e42010-08-18 16:31:59 -0500356 final Activity activity = getActivity();
357 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500358 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800359 if (isFolder) {
360 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
361 } else {
362 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
363 if (mDisableNewWindow) {
364 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
365 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500366 }
John Reckc8490812010-11-22 14:15:36 -0800367 BookmarkItem header = new BookmarkItem(activity);
368 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800369 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500370
John Reckc8490812010-11-22 14:15:36 -0800371 int count = menu.size();
372 for (int i = 0; i < count; i++) {
373 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500374 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500375 }
376
John Reck1cebb442010-12-10 12:02:16 -0800377 boolean canEdit(Cursor c) {
378 String unique = c.getString(BookmarksLoader.COLUMN_INDEX_SERVER_UNIQUE);
379 return !ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS.equals(unique);
380 }
381
John Reckc8490812010-11-22 14:15:36 -0800382 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500383 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800384 if (isFolder) {
385 item.setUrl(null);
386 Bitmap bitmap =
John Reck439c9a52010-12-14 10:04:39 -0800387 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder_bookmark_widget_holo_dark);
John Reckc8490812010-11-22 14:15:36 -0800388 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800389 new LookupBookmarkCount(getActivity(), item)
390 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800391 } else {
392 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
393 item.setUrl(url);
394 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
395 if (bitmap == null) {
396 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
397 }
398 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500399 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500400 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800401
402 /**
403 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700404 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800405 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500406 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800407 super.onCreate(icicle);
408
John Reckb3417f02011-01-14 11:01:05 -0800409 setHasOptionsMenu(true);
410
Jeff Hamilton64144e42010-08-18 16:31:59 -0500411 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400412 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500413 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400414
Jeff Hamilton64144e42010-08-18 16:31:59 -0500415 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500416 public View onCreateView(LayoutInflater inflater, ViewGroup container,
417 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500418 Context context = getActivity();
419
Jeff Hamilton64144e42010-08-18 16:31:59 -0500420 View root = inflater.inflate(R.layout.bookmarks, container, false);
421 mEmptyView = root.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400422
Jeff Hamilton64144e42010-08-18 16:31:59 -0500423 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500424 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700425 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck8af90642010-11-23 10:27:29 -0800426 mList = (ListView) root.findViewById(R.id.list);
427 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800428 setEnableContextMenu(mEnableContextMenu);
429
430 // Prep the header
431 ViewGroup hc = mHeaderContainer;
432 if (hc == null) {
433 hc = (ViewGroup) root.findViewById(R.id.header_container);
434 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800435 }
John Reckf2057c22010-12-03 18:11:50 -0800436 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false);
437 hc.addView(mHeader);
John Reck608baa72010-11-24 10:32:28 -0800438 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
439 mCrumbs.setController(this);
John Reck89f73c12010-12-01 10:10:14 -0800440 mCrumbs.setUseBackButton(mCrumbBackButton);
441 mCrumbs.setMaxVisible(mCrumbMaxVisible);
442 mCrumbs.setVisibility(mCrumbVisibility);
443 String name = getString(R.string.bookmarks);
444 mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
445 if (mCallbacks != null) {
446 mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
447 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500448
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500449 // Start the loaders
450 LoaderManager lm = getLoaderManager();
451 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800452 mCurrentView =
453 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
454 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;
Dianne Hackborn71e76c72010-12-20 11:44:09 -0800485 getLoaderManager().destroyLoader(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) {
John Reck1b3c66e2011-01-11 13:20:32 -0800569 Cursor c = mAdapter.getItem(position);
570 boolean isFolder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1;
571 if (isFolder) {
572 long id = c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
573 new OpenAllInTabsTask(id).execute();
574 } else {
575 mCallbacks.onOpenInNewWindow(c);
576 }
John Reck608baa72010-11-24 10:32:28 -0800577 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800578 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700579
John Reck1b3c66e2011-01-11 13:20:32 -0800580 class OpenAllInTabsTask extends AsyncTask<Void, Void, Cursor> {
581 long mFolderId;
582 public OpenAllInTabsTask(long id) {
583 mFolderId = id;
584 }
585
586 @Override
587 protected Cursor doInBackground(Void... params) {
588 Context c = getActivity();
589 if (c == null) return null;
590 return c.getContentResolver().query(BookmarkUtils.getBookmarksUri(c),
591 BookmarksLoader.PROJECTION, BrowserContract.Bookmarks.PARENT + "=?",
592 new String[] { Long.toString(mFolderId) }, null);
593 }
594
595 @Override
596 protected void onPostExecute(Cursor result) {
597 if (mCallbacks != null) {
598 while (result.moveToNext()) {
599 mCallbacks.onOpenInNewWindow(result);
600 }
601 }
602 }
603
604 }
605
The Android Open Source Project0c908882009-03-03 19:32:16 -0800606 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500607 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800608 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500609 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700610 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500611 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700612 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500613 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
614 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
615 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700616 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500617 BitmapFactory.decodeByteArray(data, 0, data.length));
618 }
John Reckc8490812010-11-22 14:15:36 -0800619 item.putLong(BrowserContract.Bookmarks._ID,
620 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400621 item.putLong(BrowserContract.Bookmarks.PARENT,
622 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800623 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
624 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
625 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
626 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500627 }
628
629 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800630 // Put up a dialog asking if the user really wants to
631 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800632 Cursor cursor = mAdapter.getItem(position);
Leon Scroggins75630672011-01-13 17:56:15 -0500633 long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID);
634 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500635 Context context = getActivity();
Leon Scroggins75630672011-01-13 17:56:15 -0500636 BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800637 }
638
Jeff Hamilton84029622010-08-05 14:29:28 -0500639 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800640 return getUrl(mAdapter.getItem(position));
641 }
642
643 /* package */ static String getUrl(Cursor c) {
644 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800645 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700646
The Android Open Source Project0c908882009-03-03 19:32:16 -0800647 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500648 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
649 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700650 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800651 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700652
John Reckb3417f02011-01-14 11:01:05 -0800653 @Override
654 public boolean onOptionsItemSelected(MenuItem item) {
655 switch (item.getItemId()) {
656 case R.id.thumbnail_view:
657 selectView(VIEW_THUMBNAILS);
658 return true;
659 case R.id.list_view:
660 selectView(VIEW_LIST);
661 return true;
662 }
663 return super.onOptionsItemSelected(item);
664 }
665
666 @Override
667 public void onConfigurationChanged(Configuration newConfig) {
668 super.onConfigurationChanged(newConfig);
669 Resources res = getActivity().getResources();
670 int horizontalSpacing = (int) res.getDimension(R.dimen.combo_horizontalSpacing);
671 mGrid.setHorizontalSpacing(horizontalSpacing);
672 }
673
674 @Override
675 public void onPrepareOptionsMenu(Menu menu) {
676 super.onPrepareOptionsMenu(menu);
677 menu.findItem(R.id.list_view).setVisible(mCurrentView != VIEW_LIST);
678 menu.findItem(R.id.thumbnail_view).setVisible(mCurrentView != VIEW_THUMBNAILS);
679 }
680
John Reck8af90642010-11-23 10:27:29 -0800681 void selectView(int view) {
682 if (view == mCurrentView) {
683 return;
684 }
685 mCurrentView = view;
686 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
687 Editor edit = prefs.edit();
688 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
689 edit.apply();
690 if (mEmptyView.getVisibility() == View.VISIBLE) {
691 return;
692 }
693 setupBookmarkView();
694 }
695
696 private void setupBookmarkView() {
697 mAdapter.selectView(mCurrentView);
698 switch (mCurrentView) {
699 case VIEW_THUMBNAILS:
700 mList.setAdapter(null);
701 mGrid.setAdapter(mAdapter);
702 mGrid.setVisibility(View.VISIBLE);
703 mList.setVisibility(View.GONE);
704 break;
705 case VIEW_LIST:
706 mGrid.setAdapter(null);
707 mList.setAdapter(mAdapter);
708 mGrid.setVisibility(View.GONE);
709 mList.setVisibility(View.VISIBLE);
710 break;
711 }
712 }
John Reck608baa72010-11-24 10:32:28 -0800713
John Reck608baa72010-11-24 10:32:28 -0800714 /**
715 * BreadCrumb controller callback
716 */
717 @Override
718 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800719 Uri uri = (Uri) data;
720 if (uri == null) {
721 // top level
722 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
723 }
724 loadFolder(uri);
725 }
726
727 /**
728 * @param uri
729 */
730 private void loadFolder(Uri uri) {
731 LoaderManager manager = getLoaderManager();
732 BookmarksLoader loader =
733 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
734 loader.setUri(uri);
735 loader.forceLoad();
736 if (mCallbacks != null) {
737 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
738 }
John Reck608baa72010-11-24 10:32:28 -0800739 }
740
741 @Override
John Reck608baa72010-11-24 10:32:28 -0800742 public boolean onMenuItemClick(MenuItem item) {
743 switch (item.getItemId()) {
744 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800745 selectView(BrowserBookmarksPage.VIEW_LIST);
746 return true;
747 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800748 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
749 return true;
750 }
751 return false;
752 }
753
754 public boolean onBackPressed() {
John Reckd4893b02010-12-07 17:38:34 -0800755 if (canGoBack()) {
John Reck608baa72010-11-24 10:32:28 -0800756 mCrumbs.popView();
757 return true;
758 }
759 return false;
760 }
761
John Reckd4893b02010-12-07 17:38:34 -0800762 private boolean canGoBack() {
763 Crumb c = mCrumbs.getTopCrumb();
764 return c != null && c.canGoBack;
765 }
766
John Reck608baa72010-11-24 10:32:28 -0800767 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
768 mCallbacks = callbackListener;
769 }
770
771 public void setEnableContextMenu(boolean enable) {
772 mEnableContextMenu = enable;
773 if (mGrid != null) {
774 if (mEnableContextMenu) {
775 registerForContextMenu(mGrid);
776 } else {
777 unregisterForContextMenu(mGrid);
778 mGrid.setLongClickable(false);
779 }
780 }
781 if (mList != null) {
782 if (mEnableContextMenu) {
783 registerForContextMenu(mList);
784 } else {
785 unregisterForContextMenu(mList);
786 mList.setLongClickable(false);
787 }
788 }
789 }
John Reckc8490812010-11-22 14:15:36 -0800790
791 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
792 Context mContext;
793 BookmarkItem mHeader;
794
795 public LookupBookmarkCount(Context context, BookmarkItem header) {
796 mContext = context;
797 mHeader = header;
798 }
799
800 @Override
801 protected Integer doInBackground(Long... params) {
802 if (params.length != 1) {
803 throw new IllegalArgumentException("Missing folder id!");
804 }
805 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
806 Cursor c = mContext.getContentResolver().query(uri,
807 null, BrowserContract.Bookmarks.PARENT + "=?",
808 new String[] {params[0].toString()}, null);
809 return c.getCount();
810 }
811
812 @Override
813 protected void onPostExecute(Integer result) {
814 if (result > 0) {
815 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
816 result));
817 } else if (result == 0) {
818 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
819 }
820 }
821 }
John Reck89f73c12010-12-01 10:10:14 -0800822
823 public void setBreadCrumbVisibility(int visibility) {
824 mCrumbVisibility = visibility;
825 if (mCrumbs != null) {
826 mCrumbs.setVisibility(mCrumbVisibility);
827 }
828 }
829
830 public void setBreadCrumbUseBackButton(boolean use) {
831 mCrumbBackButton = use;
832 if (mCrumbs != null) {
833 mCrumbs.setUseBackButton(mCrumbBackButton);
834 }
835 }
836
837 public void setBreadCrumbMaxVisible(int max) {
838 mCrumbMaxVisible = max;
839 if (mCrumbs != null) {
840 mCrumbs.setMaxVisible(mCrumbMaxVisible);
841 }
842 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800843}