blob: 13a0101a264a50629b677f1049600ca73318de4b [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
19import android.app.Activity;
20import android.app.AlertDialog;
Jeff Hamilton64144e42010-08-18 16:31:59 -050021import android.app.Fragment;
Jeff Hamilton84029622010-08-05 14:29:28 -050022import android.app.LoaderManager;
Dianne Hackborneb07b172010-08-26 22:18:14 -070023import android.content.ClipData;
Michael Kolbbef7a752010-08-25 17:11:35 -070024import android.content.ClipboardManager;
Jeff Hamilton1a805652010-09-07 12:36:30 -070025import android.content.ContentResolver;
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.DialogInterface;
30import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050031import android.content.Loader;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050032import android.content.SharedPreferences;
John Reck8af90642010-11-23 10:27:29 -080033import android.content.SharedPreferences.Editor;
Jeff Hamilton84029622010-08-05 14:29:28 -050034import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080035import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050036import android.graphics.BitmapFactory;
37import android.net.Uri;
John Reckc8490812010-11-22 14:15:36 -080038import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080039import android.os.Bundle;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050040import android.preference.PreferenceManager;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050041import android.provider.BrowserContract;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050042import android.provider.BrowserContract.Accounts;
43import android.text.TextUtils;
The Android Open Source Project0c908882009-03-03 19:32:16 -080044import android.view.ContextMenu;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050045import android.view.ContextMenu.ContextMenuInfo;
Jeff Hamilton64144e42010-08-18 16:31:59 -050046import android.view.LayoutInflater;
The Android Open Source Project0c908882009-03-03 19:32:16 -080047import android.view.MenuInflater;
48import android.view.MenuItem;
49import android.view.View;
John Reck608baa72010-11-24 10:32:28 -080050import android.view.View.OnClickListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050051import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050052import android.webkit.WebIconDatabase.IconListener;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050053import android.widget.Adapter;
The Android Open Source Project0c908882009-03-03 19:32:16 -080054import android.widget.AdapterView;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050055import android.widget.AdapterView.OnItemClickListener;
56import android.widget.AdapterView.OnItemSelectedListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050057import android.widget.GridView;
John Reck8af90642010-11-23 10:27:29 -080058import android.widget.ListView;
John Reck608baa72010-11-24 10:32:28 -080059import android.widget.PopupMenu.OnMenuItemClickListener;
60import android.widget.TextView;
Jeff Hamilton84029622010-08-05 14:29:28 -050061import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080062
John Reck608baa72010-11-24 10:32:28 -080063interface BookmarksPageCallbacks {
64 // Return true if handled
65 boolean onBookmarkSelected(Cursor c, boolean isFolder);
66 // Return true if handled
67 boolean onOpenInNewWindow(Cursor c);
John Reck89f73c12010-12-01 10:10:14 -080068 void onFolderChanged(int level, Uri uri);
John Reck608baa72010-11-24 10:32:28 -080069}
70
The Android Open Source Project0c908882009-03-03 19:32:16 -080071/**
72 * View showing the user's bookmarks in the browser.
73 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050074public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
Michael Kolb370a4f32010-10-06 10:45:32 -070075 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
John Reck608baa72010-11-24 10:32:28 -080076 OnItemSelectedListener, BreadCrumbView.Controller, OnClickListener, OnMenuItemClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080077
Jeff Hamilton84029622010-08-05 14:29:28 -050078 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070079
Jeff Hamilton84029622010-08-05 14:29:28 -050080 static final int LOADER_BOOKMARKS = 1;
Jeff Hamiltona9bad832010-09-24 11:05:30 -050081 static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
Jeff Hamilton84029622010-08-05 14:29:28 -050082
Michael Kolb801ecb72010-08-25 12:57:38 -070083 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
84
Jeff Hamilton70c77692010-09-21 19:11:24 -050085 static final String ACCOUNT_NAME_UNSYNCED = "Unsynced";
Michael Kolbe421c242010-10-04 19:29:01 -070086
Jeff Hamilton7f6cf3e2010-09-17 17:22:21 -050087 public static final String PREF_ACCOUNT_TYPE = "acct_type";
88 public static final String PREF_ACCOUNT_NAME = "acct_name";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050089
90 static final String DEFAULT_ACCOUNT = "local";
John Reck8af90642010-11-23 10:27:29 -080091 static final int VIEW_THUMBNAILS = 1;
92 static final int VIEW_LIST = 2;
93 static final String PREF_SELECTED_VIEW = "bookmarks_view";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050094
John Reck608baa72010-11-24 10:32:28 -080095 BookmarksPageCallbacks mCallbacks;
Jeff Hamilton84029622010-08-05 14:29:28 -050096 GridView mGrid;
John Reck8af90642010-11-23 10:27:29 -080097 ListView mList;
Jeff Hamilton84029622010-08-05 14:29:28 -050098 BrowserBookmarksAdapter mAdapter;
99 boolean mDisableNewWindow;
Jeff Hamilton84029622010-08-05 14:29:28 -0500100 boolean mCanceled = false;
John Reck608baa72010-11-24 10:32:28 -0800101 boolean mEnableContextMenu = true;
102 boolean mShowRootFolder = false;
Jeff Hamilton84029622010-08-05 14:29:28 -0500103 View mEmptyView;
John Reck8af90642010-11-23 10:27:29 -0800104 int mCurrentView;
John Reck608baa72010-11-24 10:32:28 -0800105 View mHeader;
John Reck608baa72010-11-24 10:32:28 -0800106 ViewGroup mHeaderContainer;
Michael Kolb370a4f32010-10-06 10:45:32 -0700107 BreadCrumbView mCrumbs;
John Reck608baa72010-11-24 10:32:28 -0800108 TextView mSelectBookmarkView;
John Reck89f73c12010-12-01 10:10:14 -0800109 int mCrumbVisibility = View.VISIBLE;
110 int mCrumbMaxVisible = -1;
111 boolean mCrumbBackButton = false;
Michael Kolb370a4f32010-10-06 10:45:32 -0700112
John Reck608baa72010-11-24 10:32:28 -0800113 static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
114 Bundle args, ViewGroup headerContainer) {
Michael Kolbe421c242010-10-04 19:29:01 -0700115 BrowserBookmarksPage bbp = new BrowserBookmarksPage();
116 bbp.mCallbacks = cb;
John Reck608baa72010-11-24 10:32:28 -0800117 bbp.mHeaderContainer = headerContainer;
Michael Kolbe421c242010-10-04 19:29:01 -0700118 bbp.setArguments(args);
119 return bbp;
120 }
121
Jeff Hamilton84029622010-08-05 14:29:28 -0500122 @Override
123 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
124 switch (id) {
125 case LOADER_BOOKMARKS: {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700126 String accountType = null;
127 String accountName = null;
Jeff Hamilton84029622010-08-05 14:29:28 -0500128 if (args != null) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700129 accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
130 accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
Jeff Hamilton84029622010-08-05 14:29:28 -0500131 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700132 BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
133 if (mCrumbs != null) {
134 Uri uri = (Uri) mCrumbs.getTopData();
135 if (uri != null) {
136 bl.setUri(uri);
137 }
138 }
139 return bl;
Jeff Hamilton84029622010-08-05 14:29:28 -0500140 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500141 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
142 return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
143 new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
144 null);
145 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500146 }
147 throw new UnsupportedOperationException("Unknown loader id " + id);
148 }
149
150 @Override
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500151 public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
152 switch (loader.getId()) {
153 case LOADER_BOOKMARKS: {
154 // Set the visibility of the empty vs. content views
155 if (cursor == null || cursor.getCount() == 0) {
156 mEmptyView.setVisibility(View.VISIBLE);
157 mGrid.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800158 mList.setVisibility(View.GONE);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500159 } else {
160 mEmptyView.setVisibility(View.GONE);
John Reck8af90642010-11-23 10:27:29 -0800161 setupBookmarkView();
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500162 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500163
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500164 // Give the new data to the adapter
165 mAdapter.changeCursor(cursor);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500166 break;
167 }
168
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500169 case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
170 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
171 getActivity());
172 String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
173 String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
174 String accountType =
175 TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
176 String accountName =
177 TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
178
179 Bundle args = null;
180 if (cursor == null || !cursor.moveToFirst()) {
181 // No accounts, set the prefs to the default
182 accountType = DEFAULT_ACCOUNT;
183 accountName = DEFAULT_ACCOUNT;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500184 } else {
185 int accountPosition = -1;
186
187 if (!DEFAULT_ACCOUNT.equals(accountType) &&
188 !DEFAULT_ACCOUNT.equals(accountName)) {
189 // Check to see if the account in prefs still exists
190 cursor.moveToFirst();
191 do {
192 if (accountType.equals(cursor.getString(0))
193 && accountName.equals(cursor.getString(1))) {
194 accountPosition = cursor.getPosition();
195 break;
196 }
197 } while (cursor.moveToNext());
198 }
199
200 if (accountPosition == -1) {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500201 if (!(DEFAULT_ACCOUNT.equals(accountType)
Jeff Hamilton70c77692010-09-21 19:11:24 -0500202 && DEFAULT_ACCOUNT.equals(accountName))) {
Jeff Hamilton70c77692010-09-21 19:11:24 -0500203 // No account is set in prefs and there is at least one,
204 // so pick the first one as the default
205 cursor.moveToFirst();
206 accountType = cursor.getString(0);
207 accountName = cursor.getString(1);
Jeff Hamilton70c77692010-09-21 19:11:24 -0500208 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500209 }
210
211 args = new Bundle();
212 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
213 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500214 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500215
216 // The stored account name wasn't found, update the stored account with a valid one
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500217 if (!accountType.equals(storedAccountType)
218 || !accountName.equals(storedAccountName)) {
219 prefs.edit()
220 .putString(PREF_ACCOUNT_TYPE, accountType)
221 .putString(PREF_ACCOUNT_NAME, accountName)
222 .apply();
223 }
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500224 getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500225
226 break;
227 }
228 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500229 }
230
Michael Kolb370a4f32010-10-06 10:45:32 -0700231 long getFolderId() {
232 LoaderManager manager = getLoaderManager();
233 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800234 (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700235
236 Uri uri = loader.getUri();
237 if (uri != null) {
238 try {
239 return ContentUris.parseId(uri);
240 } catch (NumberFormatException nfx) {
241 return -1;
242 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500243 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700244 return -1;
245 }
246
The Android Open Source Project0c908882009-03-03 19:32:16 -0800247 @Override
248 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500249 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800250 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700251 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800252 if (mCanceled) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400253 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800254 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700255 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800256 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
257 // If we have no menu info, we can't tell which item was selected.
258 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400259 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800260 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700261
The Android Open Source Project0c908882009-03-03 19:32:16 -0800262 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800263 case R.id.open_context_menu_id:
264 loadUrl(i.position);
265 break;
266 case R.id.edit_context_menu_id:
267 editBookmark(i.position);
268 break;
269 case R.id.shortcut_context_menu_id:
John Reck608baa72010-11-24 10:32:28 -0800270 Cursor c = mAdapter.getItem(i.position);
271 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800272 break;
273 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500274 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800275 break;
276 case R.id.new_window_context_menu_id:
277 openInNewWindow(i.position);
278 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500279 case R.id.share_link_context_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800280 Cursor cursor = mAdapter.getItem(i.position);
Michael Kolb8233fac2010-10-26 16:08:53 -0700281 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500282 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
283 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
284 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
285 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800286 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500287 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800288 case R.id.copy_url_context_menu_id:
289 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400290 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500291 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500292 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
293 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400294 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500295 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400296 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500297 case R.id.save_to_bookmarks_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800298 Cursor cursor = mAdapter.getItem(i.position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500299 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
300 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400301 // If the site is bookmarked, the item becomes remove from
302 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500303 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400304 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500305 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800306 default:
307 return super.onContextItemSelected(item);
308 }
309 return true;
310 }
311
John Reck608baa72010-11-24 10:32:28 -0800312 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500313 byte[] data = cursor.getBlob(columnIndex);
314 if (data == null) {
315 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800316 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500317 return BitmapFactory.decodeByteArray(data, 0, data.length);
318 }
319
John Reckc8490812010-11-22 14:15:36 -0800320 private MenuItem.OnMenuItemClickListener mContextItemClickListener =
321 new MenuItem.OnMenuItemClickListener() {
322 @Override
323 public boolean onMenuItemClick(MenuItem item) {
324 return onContextItemSelected(item);
325 }
326 };
327
Jeff Hamilton84029622010-08-05 14:29:28 -0500328 @Override
329 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
330 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800331 Cursor cursor = mAdapter.getItem(info.position);
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400332 boolean isFolder
333 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700334
Jeff Hamilton64144e42010-08-18 16:31:59 -0500335 final Activity activity = getActivity();
336 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500337 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800338 if (isFolder) {
339 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
340 } else {
341 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
342 if (mDisableNewWindow) {
343 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
344 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500345 }
John Reckc8490812010-11-22 14:15:36 -0800346 BookmarkItem header = new BookmarkItem(activity);
347 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800348 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500349
John Reckc8490812010-11-22 14:15:36 -0800350 int count = menu.size();
351 for (int i = 0; i < count; i++) {
352 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500353 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500354 }
355
John Reckc8490812010-11-22 14:15:36 -0800356 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500357 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800358 if (isFolder) {
359 item.setUrl(null);
360 Bitmap bitmap =
361 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder);
362 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800363 new LookupBookmarkCount(getActivity(), item)
364 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800365 } else {
366 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
367 item.setUrl(url);
368 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
369 if (bitmap == null) {
370 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
371 }
372 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500373 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500374 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800375
376 /**
377 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700378 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800379 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500380 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800381 super.onCreate(icicle);
382
Jeff Hamilton64144e42010-08-18 16:31:59 -0500383 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400384 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500385 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400386
Jeff Hamilton64144e42010-08-18 16:31:59 -0500387 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500388 public View onCreateView(LayoutInflater inflater, ViewGroup container,
389 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500390 Context context = getActivity();
391
Jeff Hamilton64144e42010-08-18 16:31:59 -0500392 View root = inflater.inflate(R.layout.bookmarks, container, false);
393 mEmptyView = root.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400394
Jeff Hamilton64144e42010-08-18 16:31:59 -0500395 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500396 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700397 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck8af90642010-11-23 10:27:29 -0800398 mList = (ListView) root.findViewById(R.id.list);
399 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800400 setEnableContextMenu(mEnableContextMenu);
401
402 // Prep the header
403 ViewGroup hc = mHeaderContainer;
404 if (hc == null) {
405 hc = (ViewGroup) root.findViewById(R.id.header_container);
406 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800407 }
John Reck608baa72010-11-24 10:32:28 -0800408 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, true);
409 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
410 mCrumbs.setController(this);
John Reck89f73c12010-12-01 10:10:14 -0800411 mCrumbs.setUseBackButton(mCrumbBackButton);
412 mCrumbs.setMaxVisible(mCrumbMaxVisible);
413 mCrumbs.setVisibility(mCrumbVisibility);
414 String name = getString(R.string.bookmarks);
415 mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
416 if (mCallbacks != null) {
417 mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
418 }
John Reck608baa72010-11-24 10:32:28 -0800419 mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
420 mSelectBookmarkView.setOnClickListener(this);
Jeff Hamilton84029622010-08-05 14:29:28 -0500421
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500422 // Start the loaders
423 LoaderManager lm = getLoaderManager();
424 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800425 mCurrentView =
426 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
John Reck608baa72010-11-24 10:32:28 -0800427 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
John Reck608baa72010-11-24 10:32:28 -0800428 mSelectBookmarkView.setText(R.string.bookmark_list_view);
John Reck89f73c12010-12-01 10:10:14 -0800429 } else {
430 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
John Reck608baa72010-11-24 10:32:28 -0800431 }
John Reck8af90642010-11-23 10:27:29 -0800432 mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500433 String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
434 String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500435 if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
436 // There is an account set, load up that one
437 Bundle args = null;
438 if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
439 args = new Bundle();
440 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
441 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
442 }
Jeff Hamilton70c77692010-09-21 19:11:24 -0500443 lm.restartLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500444 } else {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500445 // No account set, load the account list first
Jeff Hamilton70c77692010-09-21 19:11:24 -0500446 lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500447 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500448
449 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700450 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800451
Jeff Hamilton64144e42010-08-18 16:31:59 -0500452 return root;
453 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700454
John Reck608baa72010-11-24 10:32:28 -0800455 @Override
456 public void onDestroyView() {
457 super.onDestroyView();
458 if (mHeaderContainer != null) {
459 mHeaderContainer.removeView(mHeader);
460 }
461 mCrumbs.setController(null);
462 mCrumbs = null;
463 }
464
Nicolas Catania095292f2010-03-15 09:00:14 -0700465 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500466 public void onReceivedIcon(String url, Bitmap icon) {
467 // A new favicon has been loaded, so let anything attached to the adapter know about it
468 // so new icons will be loaded.
469 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700470 }
471
Jeff Hamilton84029622010-08-05 14:29:28 -0500472 @Override
John Reck608baa72010-11-24 10:32:28 -0800473 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500474 // It is possible that the view has been canceled when we get to
475 // this point as back has a higher priority
476 if (mCanceled) {
477 android.util.Log.e(LOGTAG, "item clicked when dismissing");
478 return;
479 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500480
John Reck608baa72010-11-24 10:32:28 -0800481 Cursor cursor = mAdapter.getItem(position);
482 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
483 if (mCallbacks != null &&
484 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100485 return;
486 }
487
John Reck608baa72010-11-24 10:32:28 -0800488 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700489 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500490 Uri uri = ContentUris.withAppendedId(
491 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700492 if (mCrumbs != null) {
493 // update crumbs
494 mCrumbs.pushView(title, uri);
495 }
John Reck89f73c12010-12-01 10:10:14 -0800496 loadFolder(uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400497 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800498 }
499
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500500 @Override
501 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
502 Adapter adapter = parent.getAdapter();
503 String accountType = "com.google";
504 String accountName = adapter.getItem(position).toString();
505
Jeff Hamilton70c77692010-09-21 19:11:24 -0500506 Bundle args = null;
507 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
508 accountType = DEFAULT_ACCOUNT;
509 accountName = DEFAULT_ACCOUNT;
510 } else {
511 args = new Bundle();
512 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
513 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
514 }
515
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500516 // Remember the selection for later
517 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
518 .putString(PREF_ACCOUNT_TYPE, accountType)
519 .putString(PREF_ACCOUNT_NAME, accountName)
520 .apply();
521
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500522 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
523 }
524
525 @Override
526 public void onNothingSelected(AdapterView<?> parent) {
527 // Do nothing
528 }
529
John Reck608baa72010-11-24 10:32:28 -0800530 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500531 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700532 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500533 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
534 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800535 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800536 }
537
The Android Open Source Project0c908882009-03-03 19:32:16 -0800538 private void loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800539 if (mCallbacks != null) {
540 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
541 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800542 }
543
The Android Open Source Project0c908882009-03-03 19:32:16 -0800544 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800545 if (mCallbacks != null) {
546 mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
547 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800548 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700549
The Android Open Source Project0c908882009-03-03 19:32:16 -0800550 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500551 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800552 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500553 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700554 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500555 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700556 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500557 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
558 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
559 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700560 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500561 BitmapFactory.decodeByteArray(data, 0, data.length));
562 }
John Reckc8490812010-11-22 14:15:36 -0800563 item.putLong(BrowserContract.Bookmarks._ID,
564 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400565 item.putLong(BrowserContract.Bookmarks.PARENT,
566 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800567 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
568 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
569 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
570 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500571 }
572
573 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800574 // Put up a dialog asking if the user really wants to
575 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800576 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500577 Context context = getActivity();
Jeff Hamilton1a805652010-09-07 12:36:30 -0700578 final ContentResolver resolver = context.getContentResolver();
579 final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
580 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
581
Jeff Hamilton64144e42010-08-18 16:31:59 -0500582 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800583 .setTitle(R.string.delete_bookmark)
584 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton1a805652010-09-07 12:36:30 -0700585 .setMessage(context.getString(R.string.delete_bookmark_warning,
586 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700587 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800588 new DialogInterface.OnClickListener() {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500589 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800590 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700591 resolver.delete(uri, null, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800592 }
593 })
594 .setNegativeButton(R.string.cancel, null)
595 .show();
596 }
597
Jeff Hamilton84029622010-08-05 14:29:28 -0500598 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800599 return getUrl(mAdapter.getItem(position));
600 }
601
602 /* package */ static String getUrl(Cursor c) {
603 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800604 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700605
The Android Open Source Project0c908882009-03-03 19:32:16 -0800606 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500607 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
608 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700609 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800610 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700611
John Reck8af90642010-11-23 10:27:29 -0800612 void selectView(int view) {
613 if (view == mCurrentView) {
614 return;
615 }
616 mCurrentView = view;
John Reck89f73c12010-12-01 10:10:14 -0800617 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
618 mSelectBookmarkView.setText(R.string.bookmark_list_view);
619 } else {
620 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
621 }
John Reck8af90642010-11-23 10:27:29 -0800622 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
623 Editor edit = prefs.edit();
624 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
625 edit.apply();
626 if (mEmptyView.getVisibility() == View.VISIBLE) {
627 return;
628 }
629 setupBookmarkView();
630 }
631
632 private void setupBookmarkView() {
633 mAdapter.selectView(mCurrentView);
634 switch (mCurrentView) {
635 case VIEW_THUMBNAILS:
636 mList.setAdapter(null);
637 mGrid.setAdapter(mAdapter);
638 mGrid.setVisibility(View.VISIBLE);
639 mList.setVisibility(View.GONE);
640 break;
641 case VIEW_LIST:
642 mGrid.setAdapter(null);
643 mList.setAdapter(mAdapter);
644 mGrid.setVisibility(View.GONE);
645 mList.setVisibility(View.VISIBLE);
646 break;
647 }
648 }
John Reck608baa72010-11-24 10:32:28 -0800649
John Reck608baa72010-11-24 10:32:28 -0800650 /**
651 * BreadCrumb controller callback
652 */
653 @Override
654 public void onTop(int level, Object data) {
John Reck89f73c12010-12-01 10:10:14 -0800655 Uri uri = (Uri) data;
656 if (uri == null) {
657 // top level
658 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
659 }
660 loadFolder(uri);
661 }
662
663 /**
664 * @param uri
665 */
666 private void loadFolder(Uri uri) {
667 LoaderManager manager = getLoaderManager();
668 BookmarksLoader loader =
669 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
670 loader.setUri(uri);
671 loader.forceLoad();
672 if (mCallbacks != null) {
673 mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
674 }
John Reck608baa72010-11-24 10:32:28 -0800675 }
676
677 @Override
678 public void onClick(View view) {
679 if (mSelectBookmarkView == view) {
John Reck89f73c12010-12-01 10:10:14 -0800680 selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
681 ? BrowserBookmarksPage.VIEW_THUMBNAILS
682 : BrowserBookmarksPage.VIEW_LIST);
John Reck608baa72010-11-24 10:32:28 -0800683 }
684 }
685
686 @Override
687 public boolean onMenuItemClick(MenuItem item) {
688 switch (item.getItemId()) {
689 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800690 selectView(BrowserBookmarksPage.VIEW_LIST);
691 return true;
692 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800693 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
694 return true;
695 }
696 return false;
697 }
698
699 public boolean onBackPressed() {
700 if (mCrumbs != null &&
701 mCrumbs.size() > 0) {
702 mCrumbs.popView();
703 return true;
704 }
705 return false;
706 }
707
708 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
709 mCallbacks = callbackListener;
710 }
711
712 public void setEnableContextMenu(boolean enable) {
713 mEnableContextMenu = enable;
714 if (mGrid != null) {
715 if (mEnableContextMenu) {
716 registerForContextMenu(mGrid);
717 } else {
718 unregisterForContextMenu(mGrid);
719 mGrid.setLongClickable(false);
720 }
721 }
722 if (mList != null) {
723 if (mEnableContextMenu) {
724 registerForContextMenu(mList);
725 } else {
726 unregisterForContextMenu(mList);
727 mList.setLongClickable(false);
728 }
729 }
730 }
John Reckc8490812010-11-22 14:15:36 -0800731
732 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
733 Context mContext;
734 BookmarkItem mHeader;
735
736 public LookupBookmarkCount(Context context, BookmarkItem header) {
737 mContext = context;
738 mHeader = header;
739 }
740
741 @Override
742 protected Integer doInBackground(Long... params) {
743 if (params.length != 1) {
744 throw new IllegalArgumentException("Missing folder id!");
745 }
746 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
747 Cursor c = mContext.getContentResolver().query(uri,
748 null, BrowserContract.Bookmarks.PARENT + "=?",
749 new String[] {params[0].toString()}, null);
750 return c.getCount();
751 }
752
753 @Override
754 protected void onPostExecute(Integer result) {
755 if (result > 0) {
756 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
757 result));
758 } else if (result == 0) {
759 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
760 }
761 }
762 }
John Reck89f73c12010-12-01 10:10:14 -0800763
764 public void setBreadCrumbVisibility(int visibility) {
765 mCrumbVisibility = visibility;
766 if (mCrumbs != null) {
767 mCrumbs.setVisibility(mCrumbVisibility);
768 }
769 }
770
771 public void setBreadCrumbUseBackButton(boolean use) {
772 mCrumbBackButton = use;
773 if (mCrumbs != null) {
774 mCrumbs.setUseBackButton(mCrumbBackButton);
775 }
776 }
777
778 public void setBreadCrumbMaxVisible(int max) {
779 mCrumbMaxVisible = max;
780 if (mCrumbs != null) {
781 mCrumbs.setMaxVisible(mCrumbMaxVisible);
782 }
783 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800784}