blob: ccacee8544f9ecd8152cc72c08c3762e6c5c5a85 [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;
45import android.text.TextUtils;
The Android Open Source Project0c908882009-03-03 19:32:16 -080046import android.view.ContextMenu;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050047import android.view.ContextMenu.ContextMenuInfo;
Jeff Hamilton64144e42010-08-18 16:31:59 -050048import android.view.LayoutInflater;
The Android Open Source Project0c908882009-03-03 19:32:16 -080049import android.view.MenuInflater;
50import android.view.MenuItem;
51import android.view.View;
John Reck608baa72010-11-24 10:32:28 -080052import android.view.View.OnClickListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050053import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050054import android.webkit.WebIconDatabase.IconListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050055import android.widget.Adapter;
The Android Open Source Project0c908882009-03-03 19:32:16 -080056import android.widget.AdapterView;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050057import android.widget.AdapterView.OnItemClickListener;
58import android.widget.AdapterView.OnItemSelectedListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050059import android.widget.GridView;
John Reck8af90642010-11-23 10:27:29 -080060import android.widget.ListView;
John Reck608baa72010-11-24 10:32:28 -080061import android.widget.PopupMenu.OnMenuItemClickListener;
62import android.widget.TextView;
Jeff Hamilton84029622010-08-05 14:29:28 -050063import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080064
John Reck608baa72010-11-24 10:32:28 -080065interface BookmarksPageCallbacks {
66 // Return true if handled
67 boolean onBookmarkSelected(Cursor c, boolean isFolder);
68 // Return true if handled
69 boolean onOpenInNewWindow(Cursor c);
John Reck89f73c12010-12-01 10:10:14 -080070 void onFolderChanged(int level, Uri uri);
John Reck608baa72010-11-24 10:32:28 -080071}
72
The Android Open Source Project0c908882009-03-03 19:32:16 -080073/**
74 * View showing the user's bookmarks in the browser.
75 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050076public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
Michael Kolb370a4f32010-10-06 10:45:32 -070077 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
John Reck608baa72010-11-24 10:32:28 -080078 OnItemSelectedListener, BreadCrumbView.Controller, OnClickListener, OnMenuItemClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080079
Jeff Hamilton84029622010-08-05 14:29:28 -050080 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070081
Jeff Hamilton84029622010-08-05 14:29:28 -050082 static final int LOADER_BOOKMARKS = 1;
Jeff Hamiltona9bad832010-09-24 11:05:30 -050083 static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
Jeff Hamilton84029622010-08-05 14:29:28 -050084
Michael Kolb801ecb72010-08-25 12:57:38 -070085 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
86
Jeff Hamilton70c77692010-09-21 19:11:24 -050087 static final String ACCOUNT_NAME_UNSYNCED = "Unsynced";
Michael Kolbe421c242010-10-04 19:29:01 -070088
Jeff Hamilton7f6cf3e2010-09-17 17:22:21 -050089 public static final String PREF_ACCOUNT_TYPE = "acct_type";
90 public static final String PREF_ACCOUNT_NAME = "acct_name";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050091
92 static final String DEFAULT_ACCOUNT = "local";
John Reck8af90642010-11-23 10:27:29 -080093 static final int VIEW_THUMBNAILS = 1;
94 static final int VIEW_LIST = 2;
95 static final String PREF_SELECTED_VIEW = "bookmarks_view";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050096
John Reck608baa72010-11-24 10:32:28 -080097 BookmarksPageCallbacks mCallbacks;
Jeff Hamilton84029622010-08-05 14:29:28 -050098 GridView mGrid;
John Reck8af90642010-11-23 10:27:29 -080099 ListView mList;
Jeff Hamilton84029622010-08-05 14:29:28 -0500100 BrowserBookmarksAdapter mAdapter;
101 boolean mDisableNewWindow;
Jeff Hamilton84029622010-08-05 14:29:28 -0500102 boolean mCanceled = false;
John Reck608baa72010-11-24 10:32:28 -0800103 boolean mEnableContextMenu = true;
104 boolean mShowRootFolder = false;
Jeff Hamilton84029622010-08-05 14:29:28 -0500105 View mEmptyView;
John Reck8af90642010-11-23 10:27:29 -0800106 int mCurrentView;
John Reck608baa72010-11-24 10:32:28 -0800107 View mHeader;
John Reck608baa72010-11-24 10:32:28 -0800108 ViewGroup mHeaderContainer;
Michael Kolb370a4f32010-10-06 10:45:32 -0700109 BreadCrumbView mCrumbs;
John Reck608baa72010-11-24 10:32:28 -0800110 TextView mSelectBookmarkView;
John Reck89f73c12010-12-01 10:10:14 -0800111 int mCrumbVisibility = View.VISIBLE;
112 int mCrumbMaxVisible = -1;
113 boolean mCrumbBackButton = false;
Michael Kolb370a4f32010-10-06 10:45:32 -0700114
John Reck608baa72010-11-24 10:32:28 -0800115 static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
116 Bundle args, ViewGroup headerContainer) {
Michael Kolbe421c242010-10-04 19:29:01 -0700117 BrowserBookmarksPage bbp = new BrowserBookmarksPage();
118 bbp.mCallbacks = cb;
John Reck608baa72010-11-24 10:32:28 -0800119 bbp.mHeaderContainer = headerContainer;
Michael Kolbe421c242010-10-04 19:29:01 -0700120 bbp.setArguments(args);
121 return bbp;
122 }
123
Jeff Hamilton84029622010-08-05 14:29:28 -0500124 @Override
125 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
126 switch (id) {
127 case LOADER_BOOKMARKS: {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700128 String accountType = null;
129 String accountName = null;
Jeff Hamilton84029622010-08-05 14:29:28 -0500130 if (args != null) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700131 accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
132 accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
Jeff Hamilton84029622010-08-05 14:29:28 -0500133 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700134 BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
135 if (mCrumbs != null) {
136 Uri uri = (Uri) mCrumbs.getTopData();
137 if (uri != null) {
138 bl.setUri(uri);
139 }
140 }
141 return bl;
Jeff Hamilton84029622010-08-05 14:29:28 -0500142 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500143 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
144 return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
145 new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
146 null);
147 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500148 }
149 throw new UnsupportedOperationException("Unknown loader id " + id);
150 }
151
152 @Override
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500153 public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
154 switch (loader.getId()) {
155 case LOADER_BOOKMARKS: {
156 // Set the visibility of the empty vs. content views
157 if (cursor == null || cursor.getCount() == 0) {
158 mEmptyView.setVisibility(View.VISIBLE);
159 mGrid.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800160 mList.setVisibility(View.GONE);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500161 } else {
162 mEmptyView.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800163 setupBookmarkView();
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500164 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500165
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500166 // Give the new data to the adapter
167 mAdapter.changeCursor(cursor);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500168 break;
169 }
170
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500171 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
172 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
173 getActivity());
174 String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
175 String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
176 String accountType =
177 TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
178 String accountName =
179 TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
180
181 Bundle args = null;
182 if (cursor == null || !cursor.moveToFirst()) {
183 // No accounts, set the prefs to the default
184 accountType = DEFAULT_ACCOUNT;
185 accountName = DEFAULT_ACCOUNT;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500186 } else {
187 int accountPosition = -1;
188
189 if (!DEFAULT_ACCOUNT.equals(accountType) &&
190 !DEFAULT_ACCOUNT.equals(accountName)) {
191 // Check to see if the account in prefs still exists
192 cursor.moveToFirst();
193 do {
194 if (accountType.equals(cursor.getString(0))
195 && accountName.equals(cursor.getString(1))) {
196 accountPosition = cursor.getPosition();
197 break;
198 }
199 } while (cursor.moveToNext());
200 }
201
202 if (accountPosition == -1) {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500203 if (!(DEFAULT_ACCOUNT.equals(accountType)
Jeff Hamilton70c77692010-09-21 19:11:24 -0500204 && DEFAULT_ACCOUNT.equals(accountName))) {
Jeff Hamilton70c77692010-09-21 19:11:24 -0500205 // No account is set in prefs and there is at least one,
206 // so pick the first one as the default
207 cursor.moveToFirst();
208 accountType = cursor.getString(0);
209 accountName = cursor.getString(1);
Jeff Hamilton70c77692010-09-21 19:11:24 -0500210 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500211 }
212
213 args = new Bundle();
214 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
215 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500216 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500217
218 // The stored account name wasn't found, update the stored account with a valid one
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500219 if (!accountType.equals(storedAccountType)
220 || !accountName.equals(storedAccountName)) {
221 prefs.edit()
222 .putString(PREF_ACCOUNT_TYPE, accountType)
223 .putString(PREF_ACCOUNT_NAME, accountName)
224 .apply();
225 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500226 getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500227
228 break;
229 }
230 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500231 }
232
Michael Kolb370a4f32010-10-06 10:45:32 -0700233 long getFolderId() {
234 LoaderManager manager = getLoaderManager();
235 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800236 (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700237
238 Uri uri = loader.getUri();
239 if (uri != null) {
240 try {
241 return ContentUris.parseId(uri);
242 } catch (NumberFormatException nfx) {
243 return -1;
244 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500245 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700246 return -1;
247 }
248
The Android Open Source Project0c908882009-03-03 19:32:16 -0800249 @Override
250 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500251 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800252 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700253 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800254 if (mCanceled) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400255 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800256 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700257 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800258 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
259 // If we have no menu info, we can't tell which item was selected.
260 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400261 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800262 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700263
The Android Open Source Project0c908882009-03-03 19:32:16 -0800264 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800265 case R.id.open_context_menu_id:
266 loadUrl(i.position);
267 break;
268 case R.id.edit_context_menu_id:
269 editBookmark(i.position);
270 break;
271 case R.id.shortcut_context_menu_id:
John Reck608baa72010-11-24 10:32:28 -0800272 Cursor c = mAdapter.getItem(i.position);
273 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800274 break;
275 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500276 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800277 break;
278 case R.id.new_window_context_menu_id:
279 openInNewWindow(i.position);
280 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500281 case R.id.share_link_context_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800282 Cursor cursor = mAdapter.getItem(i.position);
Michael Kolb8233fac2010-10-26 16:08:53 -0700283 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500284 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
285 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
286 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
287 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800288 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500289 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800290 case R.id.copy_url_context_menu_id:
291 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400292 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500293 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500294 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
295 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400296 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500297 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400298 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500299 case R.id.save_to_bookmarks_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800300 Cursor cursor = mAdapter.getItem(i.position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500301 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
302 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400303 // If the site is bookmarked, the item becomes remove from
304 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500305 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400306 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500307 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800308 default:
309 return super.onContextItemSelected(item);
310 }
311 return true;
312 }
313
John Reck608baa72010-11-24 10:32:28 -0800314 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500315 byte[] data = cursor.getBlob(columnIndex);
316 if (data == null) {
317 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800318 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500319 return BitmapFactory.decodeByteArray(data, 0, data.length);
320 }
321
John Reckc8490812010-11-22 14:15:36 -0800322 private MenuItem.OnMenuItemClickListener mContextItemClickListener =
323 new MenuItem.OnMenuItemClickListener() {
324 @Override
325 public boolean onMenuItemClick(MenuItem item) {
326 return onContextItemSelected(item);
327 }
328 };
329
Jeff Hamilton84029622010-08-05 14:29:28 -0500330 @Override
331 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
332 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800333 Cursor cursor = mAdapter.getItem(info.position);
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400334 boolean isFolder
335 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700336
Jeff Hamilton64144e42010-08-18 16:31:59 -0500337 final Activity activity = getActivity();
338 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500339 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800340 if (isFolder) {
341 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
342 } else {
343 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
344 if (mDisableNewWindow) {
345 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
346 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500347 }
John Reckc8490812010-11-22 14:15:36 -0800348 BookmarkItem header = new BookmarkItem(activity);
349 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800350 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500351
John Reckc8490812010-11-22 14:15:36 -0800352 int count = menu.size();
353 for (int i = 0; i < count; i++) {
354 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500355 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500356 }
357
John Reckc8490812010-11-22 14:15:36 -0800358 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500359 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800360 if (isFolder) {
361 item.setUrl(null);
362 Bitmap bitmap =
363 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder);
364 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800365 new LookupBookmarkCount(getActivity(), item)
366 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800367 } else {
368 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
369 item.setUrl(url);
370 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
371 if (bitmap == null) {
372 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
373 }
374 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500375 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500376 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800377
378 /**
379 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700380 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800381 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500382 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800383 super.onCreate(icicle);
384
Jeff Hamilton64144e42010-08-18 16:31:59 -0500385 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400386 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500387 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400388
Jeff Hamilton64144e42010-08-18 16:31:59 -0500389 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500390 public View onCreateView(LayoutInflater inflater, ViewGroup container,
391 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500392 Context context = getActivity();
393
Jeff Hamilton64144e42010-08-18 16:31:59 -0500394 View root = inflater.inflate(R.layout.bookmarks, container, false);
395 mEmptyView = root.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400396
Jeff Hamilton64144e42010-08-18 16:31:59 -0500397 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500398 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700399 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck8af90642010-11-23 10:27:29 -0800400 mList = (ListView) root.findViewById(R.id.list);
401 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800402 setEnableContextMenu(mEnableContextMenu);
403
404 // Prep the header
405 ViewGroup hc = mHeaderContainer;
406 if (hc == null) {
407 hc = (ViewGroup) root.findViewById(R.id.header_container);
408 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800409 }
John Reckf2057c22010-12-03 18:11:50 -0800410 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false);
411 hc.addView(mHeader);
John Reck608baa72010-11-24 10:32:28 -0800412 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
413 mCrumbs.setController(this);
John Reck89f73c12010-12-01 10:10:14 -0800414 mCrumbs.setUseBackButton(mCrumbBackButton);
415 mCrumbs.setMaxVisible(mCrumbMaxVisible);
416 mCrumbs.setVisibility(mCrumbVisibility);
417 String name = getString(R.string.bookmarks);
418 mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
419 if (mCallbacks != null) {
420 mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
421 }
John Reck608baa72010-11-24 10:32:28 -0800422 mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
423 mSelectBookmarkView.setOnClickListener(this);
Jeff Hamilton84029622010-08-05 14:29:28 -0500424
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500425 // Start the loaders
426 LoaderManager lm = getLoaderManager();
427 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800428 mCurrentView =
429 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
John Reck608baa72010-11-24 10:32:28 -0800430 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
John Reck608baa72010-11-24 10:32:28 -0800431 mSelectBookmarkView.setText(R.string.bookmark_list_view);
John Reck89f73c12010-12-01 10:10:14 -0800432 } else {
433 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
John Reck608baa72010-11-24 10:32:28 -0800434 }
John Reck8af90642010-11-23 10:27:29 -0800435 mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500436 String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
437 String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500438 if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
439 // There is an account set, load up that one
440 Bundle args = null;
441 if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
442 args = new Bundle();
443 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
444 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
445 }
Jeff Hamilton70c77692010-09-21 19:11:24 -0500446 lm.restartLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500447 } else {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500448 // No account set, load the account list first
Jeff Hamilton70c77692010-09-21 19:11:24 -0500449 lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500450 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500451
452 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700453 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800454
Jeff Hamilton64144e42010-08-18 16:31:59 -0500455 return root;
456 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700457
John Reck608baa72010-11-24 10:32:28 -0800458 @Override
459 public void onDestroyView() {
460 super.onDestroyView();
461 if (mHeaderContainer != null) {
462 mHeaderContainer.removeView(mHeader);
463 }
464 mCrumbs.setController(null);
465 mCrumbs = null;
466 }
467
Nicolas Catania095292f2010-03-15 09:00:14 -0700468 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500469 public void onReceivedIcon(String url, Bitmap icon) {
470 // A new favicon has been loaded, so let anything attached to the adapter know about it
471 // so new icons will be loaded.
472 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700473 }
474
Jeff Hamilton84029622010-08-05 14:29:28 -0500475 @Override
John Reck608baa72010-11-24 10:32:28 -0800476 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500477 // It is possible that the view has been canceled when we get to
478 // this point as back has a higher priority
479 if (mCanceled) {
480 android.util.Log.e(LOGTAG, "item clicked when dismissing");
481 return;
482 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500483
John Reck608baa72010-11-24 10:32:28 -0800484 Cursor cursor = mAdapter.getItem(position);
485 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
486 if (mCallbacks != null &&
487 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100488 return;
489 }
490
John Reck608baa72010-11-24 10:32:28 -0800491 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700492 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500493 Uri uri = ContentUris.withAppendedId(
494 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700495 if (mCrumbs != null) {
496 // update crumbs
497 mCrumbs.pushView(title, uri);
498 }
John Reck89f73c12010-12-01 10:10:14 -0800499 loadFolder(uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400500 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800501 }
502
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500503 @Override
504 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
505 Adapter adapter = parent.getAdapter();
506 String accountType = "com.google";
507 String accountName = adapter.getItem(position).toString();
508
Jeff Hamilton70c77692010-09-21 19:11:24 -0500509 Bundle args = null;
510 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
511 accountType = DEFAULT_ACCOUNT;
512 accountName = DEFAULT_ACCOUNT;
513 } else {
514 args = new Bundle();
515 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
516 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
517 }
518
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500519 // Remember the selection for later
520 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
521 .putString(PREF_ACCOUNT_TYPE, accountType)
522 .putString(PREF_ACCOUNT_NAME, accountName)
523 .apply();
524
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500525 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
526 }
527
528 @Override
529 public void onNothingSelected(AdapterView<?> parent) {
530 // Do nothing
531 }
532
John Reck608baa72010-11-24 10:32:28 -0800533 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500534 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700535 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500536 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
537 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800538 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800539 }
540
The Android Open Source Project0c908882009-03-03 19:32:16 -0800541 private void loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800542 if (mCallbacks != null) {
543 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
544 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800545 }
546
The Android Open Source Project0c908882009-03-03 19:32:16 -0800547 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800548 if (mCallbacks != null) {
549 mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
550 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800551 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700552
The Android Open Source Project0c908882009-03-03 19:32:16 -0800553 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500554 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800555 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500556 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700557 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500558 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700559 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500560 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
561 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
562 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700563 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500564 BitmapFactory.decodeByteArray(data, 0, data.length));
565 }
John Reckc8490812010-11-22 14:15:36 -0800566 item.putLong(BrowserContract.Bookmarks._ID,
567 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400568 item.putLong(BrowserContract.Bookmarks.PARENT,
569 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800570 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
571 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
572 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
573 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500574 }
575
576 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800577 // Put up a dialog asking if the user really wants to
578 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800579 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500580 Context context = getActivity();
Jeff Hamilton1a805652010-09-07 12:36:30 -0700581 final ContentResolver resolver = context.getContentResolver();
582 final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
583 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
584
Jeff Hamilton64144e42010-08-18 16:31:59 -0500585 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800586 .setTitle(R.string.delete_bookmark)
587 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton1a805652010-09-07 12:36:30 -0700588 .setMessage(context.getString(R.string.delete_bookmark_warning,
589 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700590 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800591 new DialogInterface.OnClickListener() {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500592 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800593 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700594 resolver.delete(uri, null, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800595 }
596 })
597 .setNegativeButton(R.string.cancel, null)
598 .show();
599 }
600
Jeff Hamilton84029622010-08-05 14:29:28 -0500601 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800602 return getUrl(mAdapter.getItem(position));
603 }
604
605 /* package */ static String getUrl(Cursor c) {
606 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800607 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700608
The Android Open Source Project0c908882009-03-03 19:32:16 -0800609 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500610 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
611 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700612 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800613 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700614
John Reck8af90642010-11-23 10:27:29 -0800615 void selectView(int view) {
616 if (view == mCurrentView) {
617 return;
618 }
619 mCurrentView = view;
John Reck89f73c12010-12-01 10:10:14 -0800620 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
621 mSelectBookmarkView.setText(R.string.bookmark_list_view);
622 } else {
623 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
624 }
John Reck8af90642010-11-23 10:27:29 -0800625 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
626 Editor edit = prefs.edit();
627 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
628 edit.apply();
629 if (mEmptyView.getVisibility() == View.VISIBLE) {
630 return;
631 }
632 setupBookmarkView();
633 }
634
635 private void setupBookmarkView() {
636 mAdapter.selectView(mCurrentView);
637 switch (mCurrentView) {
638 case VIEW_THUMBNAILS:
639 mList.setAdapter(null);
640 mGrid.setAdapter(mAdapter);
641 mGrid.setVisibility(View.VISIBLE);
642 mList.setVisibility(View.GONE);
643 break;
644 case VIEW_LIST:
645 mGrid.setAdapter(null);
646 mList.setAdapter(mAdapter);
647 mGrid.setVisibility(View.GONE);
648 mList.setVisibility(View.VISIBLE);
649 break;
650 }
651 }
John Reck608baa72010-11-24 10:32:28 -0800652
John Reck608baa72010-11-24 10:32:28 -0800653 /**
654 * BreadCrumb controller callback
655 */
656 @Override
657 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800658 Uri uri = (Uri) data;
659 if (uri == null) {
660 // top level
661 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
662 }
663 loadFolder(uri);
664 }
665
666 /**
667 * @param uri
668 */
669 private void loadFolder(Uri uri) {
670 LoaderManager manager = getLoaderManager();
671 BookmarksLoader loader =
672 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
673 loader.setUri(uri);
674 loader.forceLoad();
675 if (mCallbacks != null) {
676 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
677 }
John Reck608baa72010-11-24 10:32:28 -0800678 }
679
680 @Override
681 public void onClick(View view) {
682 if (mSelectBookmarkView == view) {
John Reck89f73c12010-12-01 10:10:14 -0800683 selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
684 ? BrowserBookmarksPage.VIEW_THUMBNAILS
685 : BrowserBookmarksPage.VIEW_LIST);
John Reck608baa72010-11-24 10:32:28 -0800686 }
687 }
688
689 @Override
690 public boolean onMenuItemClick(MenuItem item) {
691 switch (item.getItemId()) {
692 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800693 selectView(BrowserBookmarksPage.VIEW_LIST);
694 return true;
695 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800696 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
697 return true;
698 }
699 return false;
700 }
701
702 public boolean onBackPressed() {
John Reckd4893b02010-12-07 17:38:34 -0800703 if (canGoBack()) {
John Reck608baa72010-11-24 10:32:28 -0800704 mCrumbs.popView();
705 return true;
706 }
707 return false;
708 }
709
John Reckd4893b02010-12-07 17:38:34 -0800710 private boolean canGoBack() {
711 Crumb c = mCrumbs.getTopCrumb();
712 return c != null && c.canGoBack;
713 }
714
John Reck608baa72010-11-24 10:32:28 -0800715 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
716 mCallbacks = callbackListener;
717 }
718
719 public void setEnableContextMenu(boolean enable) {
720 mEnableContextMenu = enable;
721 if (mGrid != null) {
722 if (mEnableContextMenu) {
723 registerForContextMenu(mGrid);
724 } else {
725 unregisterForContextMenu(mGrid);
726 mGrid.setLongClickable(false);
727 }
728 }
729 if (mList != null) {
730 if (mEnableContextMenu) {
731 registerForContextMenu(mList);
732 } else {
733 unregisterForContextMenu(mList);
734 mList.setLongClickable(false);
735 }
736 }
737 }
John Reckc8490812010-11-22 14:15:36 -0800738
739 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
740 Context mContext;
741 BookmarkItem mHeader;
742
743 public LookupBookmarkCount(Context context, BookmarkItem header) {
744 mContext = context;
745 mHeader = header;
746 }
747
748 @Override
749 protected Integer doInBackground(Long... params) {
750 if (params.length != 1) {
751 throw new IllegalArgumentException("Missing folder id!");
752 }
753 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
754 Cursor c = mContext.getContentResolver().query(uri,
755 null, BrowserContract.Bookmarks.PARENT + "=?",
756 new String[] {params[0].toString()}, null);
757 return c.getCount();
758 }
759
760 @Override
761 protected void onPostExecute(Integer result) {
762 if (result > 0) {
763 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
764 result));
765 } else if (result == 0) {
766 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
767 }
768 }
769 }
John Reck89f73c12010-12-01 10:10:14 -0800770
771 public void setBreadCrumbVisibility(int visibility) {
772 mCrumbVisibility = visibility;
773 if (mCrumbs != null) {
774 mCrumbs.setVisibility(mCrumbVisibility);
775 }
776 }
777
778 public void setBreadCrumbUseBackButton(boolean use) {
779 mCrumbBackButton = use;
780 if (mCrumbs != null) {
781 mCrumbs.setUseBackButton(mCrumbBackButton);
782 }
783 }
784
785 public void setBreadCrumbMaxVisible(int max) {
786 mCrumbMaxVisible = max;
787 if (mCrumbs != null) {
788 mCrumbs.setMaxVisible(mCrumbMaxVisible);
789 }
790 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800791}