blob: fa7a5e2891d31cac5daf9114a7cfe7fab9ece138 [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;
Jeff Hamilton64144e42010-08-18 16:31:59 -050022import android.app.Fragment;
Jeff Hamilton84029622010-08-05 14:29:28 -050023import android.app.LoaderManager;
Dianne Hackborneb07b172010-08-26 22:18:14 -070024import android.content.ClipData;
Michael Kolbbef7a752010-08-25 17:11:35 -070025import android.content.ClipboardManager;
Jeff Hamilton84029622010-08-05 14:29:28 -050026import android.content.ContentUris;
Dianne Hackborn80f32622010-08-05 14:17:53 -070027import android.content.Context;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050028import android.content.CursorLoader;
The Android Open Source Project0c908882009-03-03 19:32:16 -080029import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050030import android.content.Loader;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050031import android.content.SharedPreferences;
John Reck8af90642010-11-23 10:27:29 -080032import android.content.SharedPreferences.Editor;
John Reckb3417f02011-01-14 11:01:05 -080033import android.content.res.Configuration;
34import android.content.res.Resources;
Jeff Hamilton84029622010-08-05 14:29:28 -050035import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080036import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050037import android.graphics.BitmapFactory;
38import android.net.Uri;
John Reckc8490812010-11-22 14:15:36 -080039import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080040import android.os.Bundle;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050041import android.preference.PreferenceManager;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050042import android.provider.BrowserContract;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050043import android.provider.BrowserContract.Accounts;
John Reck1cebb442010-12-10 12:02:16 -080044import android.provider.BrowserContract.ChromeSyncColumns;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050045import 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;
John Reckb3417f02011-01-14 11:01:05 -080049import android.view.Menu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080050import android.view.MenuInflater;
51import android.view.MenuItem;
52import android.view.View;
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;
Jeff Hamilton84029622010-08-05 14:29:28 -050062import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080063
John Reck608baa72010-11-24 10:32:28 -080064interface BookmarksPageCallbacks {
65 // Return true if handled
66 boolean onBookmarkSelected(Cursor c, boolean isFolder);
67 // Return true if handled
68 boolean onOpenInNewWindow(Cursor c);
John Reck89f73c12010-12-01 10:10:14 -080069 void onFolderChanged(int level, Uri uri);
John Reck608baa72010-11-24 10:32:28 -080070}
71
The Android Open Source Project0c908882009-03-03 19:32:16 -080072/**
73 * View showing the user's bookmarks in the browser.
74 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050075public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
Michael Kolb370a4f32010-10-06 10:45:32 -070076 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
John Reckb3417f02011-01-14 11:01:05 -080077 OnItemSelectedListener, BreadCrumbView.Controller, OnMenuItemClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080078
Jeff Hamilton84029622010-08-05 14:29:28 -050079 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070080
Jeff Hamilton84029622010-08-05 14:29:28 -050081 static final int LOADER_BOOKMARKS = 1;
Jeff Hamiltona9bad832010-09-24 11:05:30 -050082 static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
Jeff Hamilton84029622010-08-05 14:29:28 -050083
Michael Kolb801ecb72010-08-25 12:57:38 -070084 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
85
Jeff Hamilton70c77692010-09-21 19:11:24 -050086 static final String ACCOUNT_NAME_UNSYNCED = "Unsynced";
Michael Kolbe421c242010-10-04 19:29:01 -070087
Jeff Hamilton7f6cf3e2010-09-17 17:22:21 -050088 public static final String PREF_ACCOUNT_TYPE = "acct_type";
89 public static final String PREF_ACCOUNT_NAME = "acct_name";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050090
91 static final String DEFAULT_ACCOUNT = "local";
John Reck8af90642010-11-23 10:27:29 -080092 static final int VIEW_THUMBNAILS = 1;
93 static final int VIEW_LIST = 2;
94 static final String PREF_SELECTED_VIEW = "bookmarks_view";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050095
John Reck608baa72010-11-24 10:32:28 -080096 BookmarksPageCallbacks mCallbacks;
John Reck0ce8a942011-01-14 19:57:09 -080097 View mRoot;
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 Reck89f73c12010-12-01 10:10:14 -0800110 int mCrumbVisibility = View.VISIBLE;
111 int mCrumbMaxVisible = -1;
112 boolean mCrumbBackButton = false;
Michael Kolb370a4f32010-10-06 10:45:32 -0700113
John Reck608baa72010-11-24 10:32:28 -0800114 static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
115 Bundle args, ViewGroup headerContainer) {
Michael Kolbe421c242010-10-04 19:29:01 -0700116 BrowserBookmarksPage bbp = new BrowserBookmarksPage();
117 bbp.mCallbacks = cb;
John Reck608baa72010-11-24 10:32:28 -0800118 bbp.mHeaderContainer = headerContainer;
Michael Kolbe421c242010-10-04 19:29:01 -0700119 bbp.setArguments(args);
120 return bbp;
121 }
122
Jeff Hamilton84029622010-08-05 14:29:28 -0500123 @Override
124 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
125 switch (id) {
126 case LOADER_BOOKMARKS: {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700127 String accountType = null;
128 String accountName = null;
Jeff Hamilton84029622010-08-05 14:29:28 -0500129 if (args != null) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700130 accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
131 accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
Jeff Hamilton84029622010-08-05 14:29:28 -0500132 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700133 BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
134 if (mCrumbs != null) {
135 Uri uri = (Uri) mCrumbs.getTopData();
136 if (uri != null) {
137 bl.setUri(uri);
138 }
139 }
140 return bl;
Jeff Hamilton84029622010-08-05 14:29:28 -0500141 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500142 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
143 return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
144 new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
145 null);
146 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500147 }
148 throw new UnsupportedOperationException("Unknown loader id " + id);
149 }
150
151 @Override
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500152 public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
153 switch (loader.getId()) {
154 case LOADER_BOOKMARKS: {
155 // Set the visibility of the empty vs. content views
156 if (cursor == null || cursor.getCount() == 0) {
157 mEmptyView.setVisibility(View.VISIBLE);
158 mGrid.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800159 mList.setVisibility(View.GONE);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500160 } else {
161 mEmptyView.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800162 setupBookmarkView();
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500163 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500164
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500165 // Give the new data to the adapter
166 mAdapter.changeCursor(cursor);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500167 break;
168 }
169
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500170 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
171 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
172 getActivity());
173 String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
174 String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
175 String accountType =
176 TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
177 String accountName =
178 TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
179
180 Bundle args = null;
181 if (cursor == null || !cursor.moveToFirst()) {
182 // No accounts, set the prefs to the default
183 accountType = DEFAULT_ACCOUNT;
184 accountName = DEFAULT_ACCOUNT;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500185 } else {
186 int accountPosition = -1;
187
188 if (!DEFAULT_ACCOUNT.equals(accountType) &&
189 !DEFAULT_ACCOUNT.equals(accountName)) {
190 // Check to see if the account in prefs still exists
191 cursor.moveToFirst();
192 do {
193 if (accountType.equals(cursor.getString(0))
194 && accountName.equals(cursor.getString(1))) {
195 accountPosition = cursor.getPosition();
196 break;
197 }
198 } while (cursor.moveToNext());
199 }
200
201 if (accountPosition == -1) {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500202 if (!(DEFAULT_ACCOUNT.equals(accountType)
Jeff Hamilton70c77692010-09-21 19:11:24 -0500203 && DEFAULT_ACCOUNT.equals(accountName))) {
Jeff Hamilton70c77692010-09-21 19:11:24 -0500204 // No account is set in prefs and there is at least one,
205 // so pick the first one as the default
206 cursor.moveToFirst();
207 accountType = cursor.getString(0);
208 accountName = cursor.getString(1);
Jeff Hamilton70c77692010-09-21 19:11:24 -0500209 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500210 }
211
212 args = new Bundle();
213 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
214 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500215 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500216
217 // The stored account name wasn't found, update the stored account with a valid one
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500218 if (!accountType.equals(storedAccountType)
219 || !accountName.equals(storedAccountName)) {
220 prefs.edit()
221 .putString(PREF_ACCOUNT_TYPE, accountType)
222 .putString(PREF_ACCOUNT_NAME, accountName)
223 .apply();
224 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500225 getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500226
227 break;
228 }
229 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500230 }
231
Dianne Hackborn39772c82010-12-16 00:43:54 -0800232 public void onLoaderReset(Loader<Cursor> loader) {
233 onLoadFinished(loader, null);
234 switch (loader.getId()) {
235 case LOADER_BOOKMARKS: {
236 onLoadFinished(loader, null);
237 break;
238 }
239 }
240 }
241
Michael Kolb370a4f32010-10-06 10:45:32 -0700242 long getFolderId() {
243 LoaderManager manager = getLoaderManager();
244 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800245 (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700246
247 Uri uri = loader.getUri();
248 if (uri != null) {
249 try {
250 return ContentUris.parseId(uri);
251 } catch (NumberFormatException nfx) {
252 return -1;
253 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500254 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700255 return -1;
256 }
257
The Android Open Source Project0c908882009-03-03 19:32:16 -0800258 @Override
259 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500260 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800261 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700262 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800263 if (mCanceled) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400264 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800265 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700266 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800267 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
268 // If we have no menu info, we can't tell which item was selected.
269 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400270 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800271 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700272
The Android Open Source Project0c908882009-03-03 19:32:16 -0800273 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800274 case R.id.open_context_menu_id:
275 loadUrl(i.position);
276 break;
277 case R.id.edit_context_menu_id:
278 editBookmark(i.position);
279 break;
280 case R.id.shortcut_context_menu_id:
John Reck608baa72010-11-24 10:32:28 -0800281 Cursor c = mAdapter.getItem(i.position);
282 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800283 break;
284 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500285 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800286 break;
287 case R.id.new_window_context_menu_id:
288 openInNewWindow(i.position);
289 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500290 case R.id.share_link_context_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800291 Cursor cursor = mAdapter.getItem(i.position);
Michael Kolb8233fac2010-10-26 16:08:53 -0700292 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500293 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
294 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
295 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
296 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800297 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500298 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800299 case R.id.copy_url_context_menu_id:
300 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400301 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500302 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500303 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
304 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400305 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500306 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400307 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500308 case R.id.save_to_bookmarks_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800309 Cursor cursor = mAdapter.getItem(i.position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500310 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
311 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400312 // If the site is bookmarked, the item becomes remove from
313 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500314 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400315 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500316 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800317 default:
318 return super.onContextItemSelected(item);
319 }
320 return true;
321 }
322
John Reck608baa72010-11-24 10:32:28 -0800323 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500324 byte[] data = cursor.getBlob(columnIndex);
325 if (data == null) {
326 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800327 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500328 return BitmapFactory.decodeByteArray(data, 0, data.length);
329 }
330
John Reckc8490812010-11-22 14:15:36 -0800331 private MenuItem.OnMenuItemClickListener mContextItemClickListener =
332 new MenuItem.OnMenuItemClickListener() {
333 @Override
334 public boolean onMenuItemClick(MenuItem item) {
335 return onContextItemSelected(item);
336 }
337 };
338
Jeff Hamilton84029622010-08-05 14:29:28 -0500339 @Override
John Reckb3417f02011-01-14 11:01:05 -0800340 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
341 inflater.inflate(R.menu.bookmark, menu);
342 }
343
344 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500345 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
346 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800347 Cursor cursor = mAdapter.getItem(info.position);
John Reck1cebb442010-12-10 12:02:16 -0800348 if (!canEdit(cursor)) {
349 return;
350 }
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400351 boolean isFolder
352 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700353
Jeff Hamilton64144e42010-08-18 16:31:59 -0500354 final Activity activity = getActivity();
355 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500356 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800357 if (isFolder) {
358 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
359 } else {
360 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
361 if (mDisableNewWindow) {
362 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
363 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500364 }
John Reckc8490812010-11-22 14:15:36 -0800365 BookmarkItem header = new BookmarkItem(activity);
366 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800367 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500368
John Reckc8490812010-11-22 14:15:36 -0800369 int count = menu.size();
370 for (int i = 0; i < count; i++) {
371 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500372 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500373 }
374
John Reck1cebb442010-12-10 12:02:16 -0800375 boolean canEdit(Cursor c) {
376 String unique = c.getString(BookmarksLoader.COLUMN_INDEX_SERVER_UNIQUE);
377 return !ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS.equals(unique);
378 }
379
John Reckc8490812010-11-22 14:15:36 -0800380 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500381 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800382 if (isFolder) {
383 item.setUrl(null);
384 Bitmap bitmap =
Michael Kolb5a72f182011-01-13 20:35:06 -0800385 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder_holo_dark);
John Reckc8490812010-11-22 14:15:36 -0800386 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800387 new LookupBookmarkCount(getActivity(), item)
388 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800389 } else {
390 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
391 item.setUrl(url);
392 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
393 if (bitmap == null) {
394 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
395 }
396 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500397 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500398 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800399
400 /**
401 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700402 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800403 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500404 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800405 super.onCreate(icicle);
406
John Reckb3417f02011-01-14 11:01:05 -0800407 setHasOptionsMenu(true);
408
Jeff Hamilton64144e42010-08-18 16:31:59 -0500409 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400410 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500411 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400412
Jeff Hamilton64144e42010-08-18 16:31:59 -0500413 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500414 public View onCreateView(LayoutInflater inflater, ViewGroup container,
415 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500416 Context context = getActivity();
417
John Reck0ce8a942011-01-14 19:57:09 -0800418 mRoot = inflater.inflate(R.layout.bookmarks, container, false);
419 mEmptyView = mRoot.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400420
John Reck0ce8a942011-01-14 19:57:09 -0800421 mGrid = (GridView) mRoot.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500422 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700423 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck0ce8a942011-01-14 19:57:09 -0800424 mList = (ListView) mRoot.findViewById(R.id.list);
John Reck8af90642010-11-23 10:27:29 -0800425 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800426 setEnableContextMenu(mEnableContextMenu);
427
428 // Prep the header
429 ViewGroup hc = mHeaderContainer;
430 if (hc == null) {
John Reck0ce8a942011-01-14 19:57:09 -0800431 hc = (ViewGroup) mRoot.findViewById(R.id.header_container);
John Reck608baa72010-11-24 10:32:28 -0800432 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800433 }
John Reckf2057c22010-12-03 18:11:50 -0800434 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false);
435 hc.addView(mHeader);
John Reck608baa72010-11-24 10:32:28 -0800436 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
437 mCrumbs.setController(this);
John Reck89f73c12010-12-01 10:10:14 -0800438 mCrumbs.setUseBackButton(mCrumbBackButton);
439 mCrumbs.setMaxVisible(mCrumbMaxVisible);
440 mCrumbs.setVisibility(mCrumbVisibility);
441 String name = getString(R.string.bookmarks);
442 mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
443 if (mCallbacks != null) {
444 mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
445 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500446
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500447 // Start the loaders
448 LoaderManager lm = getLoaderManager();
449 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800450 mCurrentView =
451 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
452 mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500453 String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
454 String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500455 if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
456 // There is an account set, load up that one
457 Bundle args = null;
458 if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
459 args = new Bundle();
460 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
461 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
462 }
Jeff Hamilton70c77692010-09-21 19:11:24 -0500463 lm.restartLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500464 } else {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500465 // No account set, load the account list first
Jeff Hamilton70c77692010-09-21 19:11:24 -0500466 lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500467 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500468
469 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700470 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800471
John Reck0ce8a942011-01-14 19:57:09 -0800472 return mRoot;
Jeff Hamilton64144e42010-08-18 16:31:59 -0500473 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700474
John Reck608baa72010-11-24 10:32:28 -0800475 @Override
476 public void onDestroyView() {
477 super.onDestroyView();
478 if (mHeaderContainer != null) {
479 mHeaderContainer.removeView(mHeader);
480 }
481 mCrumbs.setController(null);
482 mCrumbs = null;
Dianne Hackborn71e76c72010-12-20 11:44:09 -0800483 getLoaderManager().destroyLoader(LOADER_BOOKMARKS);
John Reck608baa72010-11-24 10:32:28 -0800484 }
485
Nicolas Catania095292f2010-03-15 09:00:14 -0700486 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500487 public void onReceivedIcon(String url, Bitmap icon) {
488 // A new favicon has been loaded, so let anything attached to the adapter know about it
489 // so new icons will be loaded.
490 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700491 }
492
Jeff Hamilton84029622010-08-05 14:29:28 -0500493 @Override
John Reck608baa72010-11-24 10:32:28 -0800494 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500495 // It is possible that the view has been canceled when we get to
496 // this point as back has a higher priority
497 if (mCanceled) {
498 android.util.Log.e(LOGTAG, "item clicked when dismissing");
499 return;
500 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500501
John Reck608baa72010-11-24 10:32:28 -0800502 Cursor cursor = mAdapter.getItem(position);
503 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
504 if (mCallbacks != null &&
505 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100506 return;
507 }
508
John Reck608baa72010-11-24 10:32:28 -0800509 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700510 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500511 Uri uri = ContentUris.withAppendedId(
512 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700513 if (mCrumbs != null) {
514 // update crumbs
515 mCrumbs.pushView(title, uri);
516 }
John Reck89f73c12010-12-01 10:10:14 -0800517 loadFolder(uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400518 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800519 }
520
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500521 @Override
522 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
523 Adapter adapter = parent.getAdapter();
524 String accountType = "com.google";
525 String accountName = adapter.getItem(position).toString();
526
Jeff Hamilton70c77692010-09-21 19:11:24 -0500527 Bundle args = null;
528 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
529 accountType = DEFAULT_ACCOUNT;
530 accountName = DEFAULT_ACCOUNT;
531 } else {
532 args = new Bundle();
533 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
534 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
535 }
536
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500537 // Remember the selection for later
538 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
539 .putString(PREF_ACCOUNT_TYPE, accountType)
540 .putString(PREF_ACCOUNT_NAME, accountName)
541 .apply();
542
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500543 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
544 }
545
546 @Override
547 public void onNothingSelected(AdapterView<?> parent) {
548 // Do nothing
549 }
550
John Reck608baa72010-11-24 10:32:28 -0800551 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500552 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700553 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500554 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
555 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800556 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800557 }
558
The Android Open Source Project0c908882009-03-03 19:32:16 -0800559 private void loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800560 if (mCallbacks != null) {
561 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
562 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800563 }
564
The Android Open Source Project0c908882009-03-03 19:32:16 -0800565 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800566 if (mCallbacks != null) {
John Reck1b3c66e2011-01-11 13:20:32 -0800567 Cursor c = mAdapter.getItem(position);
568 boolean isFolder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1;
569 if (isFolder) {
570 long id = c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
571 new OpenAllInTabsTask(id).execute();
572 } else {
573 mCallbacks.onOpenInNewWindow(c);
574 }
John Reck608baa72010-11-24 10:32:28 -0800575 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800576 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700577
John Reck1b3c66e2011-01-11 13:20:32 -0800578 class OpenAllInTabsTask extends AsyncTask<Void, Void, Cursor> {
579 long mFolderId;
580 public OpenAllInTabsTask(long id) {
581 mFolderId = id;
582 }
583
584 @Override
585 protected Cursor doInBackground(Void... params) {
586 Context c = getActivity();
587 if (c == null) return null;
588 return c.getContentResolver().query(BookmarkUtils.getBookmarksUri(c),
589 BookmarksLoader.PROJECTION, BrowserContract.Bookmarks.PARENT + "=?",
590 new String[] { Long.toString(mFolderId) }, null);
591 }
592
593 @Override
594 protected void onPostExecute(Cursor result) {
595 if (mCallbacks != null) {
596 while (result.moveToNext()) {
597 mCallbacks.onOpenInNewWindow(result);
598 }
599 }
600 }
601
602 }
603
The Android Open Source Project0c908882009-03-03 19:32:16 -0800604 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500605 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800606 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500607 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700608 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500609 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700610 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500611 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
612 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
613 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700614 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500615 BitmapFactory.decodeByteArray(data, 0, data.length));
616 }
John Reckc8490812010-11-22 14:15:36 -0800617 item.putLong(BrowserContract.Bookmarks._ID,
618 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400619 item.putLong(BrowserContract.Bookmarks.PARENT,
620 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800621 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
622 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
623 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
624 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500625 }
626
627 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800628 // Put up a dialog asking if the user really wants to
629 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800630 Cursor cursor = mAdapter.getItem(position);
Leon Scroggins75630672011-01-13 17:56:15 -0500631 long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID);
632 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500633 Context context = getActivity();
Leon Scroggins75630672011-01-13 17:56:15 -0500634 BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800635 }
636
Jeff Hamilton84029622010-08-05 14:29:28 -0500637 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800638 return getUrl(mAdapter.getItem(position));
639 }
640
641 /* package */ static String getUrl(Cursor c) {
642 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800643 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700644
The Android Open Source Project0c908882009-03-03 19:32:16 -0800645 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500646 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
647 Context.CLIPBOARD_SERVICE);
Dianne Hackbornbf1d10a2011-01-17 12:29:51 -0800648 cm.setPrimaryClip(ClipData.newRawUri(null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800649 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700650
John Reckb3417f02011-01-14 11:01:05 -0800651 @Override
652 public boolean onOptionsItemSelected(MenuItem item) {
653 switch (item.getItemId()) {
654 case R.id.thumbnail_view:
655 selectView(VIEW_THUMBNAILS);
656 return true;
657 case R.id.list_view:
658 selectView(VIEW_LIST);
659 return true;
660 }
661 return super.onOptionsItemSelected(item);
662 }
663
664 @Override
665 public void onConfigurationChanged(Configuration newConfig) {
666 super.onConfigurationChanged(newConfig);
667 Resources res = getActivity().getResources();
668 int horizontalSpacing = (int) res.getDimension(R.dimen.combo_horizontalSpacing);
669 mGrid.setHorizontalSpacing(horizontalSpacing);
John Reck0ce8a942011-01-14 19:57:09 -0800670 int paddingLeftRight = (int) res.getDimension(R.dimen.combo_paddingLeftRight);
671 int paddingTop = (int) res.getDimension(R.dimen.combo_paddingTop);
672 mRoot.setPadding(paddingLeftRight, paddingTop,
673 paddingLeftRight, 0);
John Reckb3417f02011-01-14 11:01:05 -0800674 }
675
676 @Override
677 public void onPrepareOptionsMenu(Menu menu) {
678 super.onPrepareOptionsMenu(menu);
679 menu.findItem(R.id.list_view).setVisible(mCurrentView != VIEW_LIST);
680 menu.findItem(R.id.thumbnail_view).setVisible(mCurrentView != VIEW_THUMBNAILS);
681 }
682
John Reck8af90642010-11-23 10:27:29 -0800683 void selectView(int view) {
684 if (view == mCurrentView) {
685 return;
686 }
687 mCurrentView = view;
688 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
689 Editor edit = prefs.edit();
690 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
691 edit.apply();
692 if (mEmptyView.getVisibility() == View.VISIBLE) {
693 return;
694 }
695 setupBookmarkView();
696 }
697
698 private void setupBookmarkView() {
699 mAdapter.selectView(mCurrentView);
700 switch (mCurrentView) {
701 case VIEW_THUMBNAILS:
702 mList.setAdapter(null);
703 mGrid.setAdapter(mAdapter);
704 mGrid.setVisibility(View.VISIBLE);
705 mList.setVisibility(View.GONE);
706 break;
707 case VIEW_LIST:
708 mGrid.setAdapter(null);
709 mList.setAdapter(mAdapter);
710 mGrid.setVisibility(View.GONE);
711 mList.setVisibility(View.VISIBLE);
712 break;
713 }
714 }
John Reck608baa72010-11-24 10:32:28 -0800715
John Reck608baa72010-11-24 10:32:28 -0800716 /**
717 * BreadCrumb controller callback
718 */
719 @Override
720 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800721 Uri uri = (Uri) data;
722 if (uri == null) {
723 // top level
724 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
725 }
726 loadFolder(uri);
727 }
728
729 /**
730 * @param uri
731 */
732 private void loadFolder(Uri uri) {
733 LoaderManager manager = getLoaderManager();
734 BookmarksLoader loader =
735 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
736 loader.setUri(uri);
737 loader.forceLoad();
738 if (mCallbacks != null) {
739 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
740 }
John Reck608baa72010-11-24 10:32:28 -0800741 }
742
743 @Override
John Reck608baa72010-11-24 10:32:28 -0800744 public boolean onMenuItemClick(MenuItem item) {
745 switch (item.getItemId()) {
746 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800747 selectView(BrowserBookmarksPage.VIEW_LIST);
748 return true;
749 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800750 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
751 return true;
752 }
753 return false;
754 }
755
756 public boolean onBackPressed() {
John Reckd4893b02010-12-07 17:38:34 -0800757 if (canGoBack()) {
John Reck608baa72010-11-24 10:32:28 -0800758 mCrumbs.popView();
759 return true;
760 }
761 return false;
762 }
763
John Reckd4893b02010-12-07 17:38:34 -0800764 private boolean canGoBack() {
765 Crumb c = mCrumbs.getTopCrumb();
766 return c != null && c.canGoBack;
767 }
768
John Reck608baa72010-11-24 10:32:28 -0800769 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
770 mCallbacks = callbackListener;
771 }
772
773 public void setEnableContextMenu(boolean enable) {
774 mEnableContextMenu = enable;
775 if (mGrid != null) {
776 if (mEnableContextMenu) {
777 registerForContextMenu(mGrid);
778 } else {
779 unregisterForContextMenu(mGrid);
780 mGrid.setLongClickable(false);
781 }
782 }
783 if (mList != null) {
784 if (mEnableContextMenu) {
785 registerForContextMenu(mList);
786 } else {
787 unregisterForContextMenu(mList);
788 mList.setLongClickable(false);
789 }
790 }
791 }
John Reckc8490812010-11-22 14:15:36 -0800792
793 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
794 Context mContext;
795 BookmarkItem mHeader;
796
797 public LookupBookmarkCount(Context context, BookmarkItem header) {
798 mContext = context;
799 mHeader = header;
800 }
801
802 @Override
803 protected Integer doInBackground(Long... params) {
804 if (params.length != 1) {
805 throw new IllegalArgumentException("Missing folder id!");
806 }
807 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
808 Cursor c = mContext.getContentResolver().query(uri,
809 null, BrowserContract.Bookmarks.PARENT + "=?",
810 new String[] {params[0].toString()}, null);
811 return c.getCount();
812 }
813
814 @Override
815 protected void onPostExecute(Integer result) {
816 if (result > 0) {
817 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
818 result));
819 } else if (result == 0) {
820 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
821 }
822 }
823 }
John Reck89f73c12010-12-01 10:10:14 -0800824
825 public void setBreadCrumbVisibility(int visibility) {
826 mCrumbVisibility = visibility;
827 if (mCrumbs != null) {
828 mCrumbs.setVisibility(mCrumbVisibility);
829 }
830 }
831
832 public void setBreadCrumbUseBackButton(boolean use) {
833 mCrumbBackButton = use;
834 if (mCrumbs != null) {
835 mCrumbs.setUseBackButton(mCrumbBackButton);
836 }
837 }
838
839 public void setBreadCrumbMaxVisible(int max) {
840 mCrumbMaxVisible = max;
841 if (mCrumbs != null) {
842 mCrumbs.setMaxVisible(mCrumbMaxVisible);
843 }
844 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800845}