blob: 4370885117c2fcc42492755f503835700e2009b1 [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;
27import android.content.ContentValues;
Dianne Hackborn80f32622010-08-05 14:17:53 -070028import android.content.Context;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050029import android.content.CursorLoader;
The Android Open Source Project0c908882009-03-03 19:32:16 -080030import android.content.DialogInterface;
31import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050032import android.content.Loader;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050033import android.content.SharedPreferences;
John Reck8af90642010-11-23 10:27:29 -080034import android.content.SharedPreferences.Editor;
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;
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;
60import android.widget.PopupMenu.OnMenuItemClickListener;
61import android.widget.TextView;
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);
69}
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 int BOOKMARKS_SAVE = 1;
79 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;
Jeff Hamilton84029622010-08-05 14:29:28 -050097 GridView mGrid;
John Reck8af90642010-11-23 10:27:29 -080098 ListView mList;
Jeff Hamilton84029622010-08-05 14:29:28 -050099 BrowserBookmarksAdapter mAdapter;
100 boolean mDisableNewWindow;
101 BookmarkItem mContextHeader;
102 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;
108 View mRootFolderView;
109 ViewGroup mHeaderContainer;
Michael Kolb370a4f32010-10-06 10:45:32 -0700110 BreadCrumbView mCrumbs;
John Reck608baa72010-11-24 10:32:28 -0800111 TextView mSelectBookmarkView;
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
247 public void onFolderChange(int level, Object data) {
248 Uri uri = (Uri) data;
249 if (uri == null) {
250 // top level
251 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
252 }
253 LoaderManager manager = getLoaderManager();
254 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800255 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700256 loader.setUri(uri);
257 loader.forceLoad();
258
Jeff Hamilton84029622010-08-05 14:29:28 -0500259 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800260
261 @Override
262 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500263 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800264 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700265 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800266 if (mCanceled) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400267 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800268 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700269 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800270 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
271 // If we have no menu info, we can't tell which item was selected.
272 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400273 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800274 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700275
The Android Open Source Project0c908882009-03-03 19:32:16 -0800276 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800277 case R.id.open_context_menu_id:
278 loadUrl(i.position);
279 break;
280 case R.id.edit_context_menu_id:
281 editBookmark(i.position);
282 break;
283 case R.id.shortcut_context_menu_id:
John Reck608baa72010-11-24 10:32:28 -0800284 Cursor c = mAdapter.getItem(i.position);
285 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800286 break;
287 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500288 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800289 break;
290 case R.id.new_window_context_menu_id:
291 openInNewWindow(i.position);
292 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500293 case R.id.share_link_context_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800294 Cursor cursor = mAdapter.getItem(i.position);
Michael Kolb8233fac2010-10-26 16:08:53 -0700295 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500296 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
297 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
298 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
299 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800300 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500301 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800302 case R.id.copy_url_context_menu_id:
303 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400304 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500305 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500306 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
307 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400308 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500309 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400310 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500311 case R.id.save_to_bookmarks_menu_id: {
John Reck608baa72010-11-24 10:32:28 -0800312 Cursor cursor = mAdapter.getItem(i.position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500313 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
314 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400315 // If the site is bookmarked, the item becomes remove from
316 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500317 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400318 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500319 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800320 default:
321 return super.onContextItemSelected(item);
322 }
323 return true;
324 }
325
John Reck608baa72010-11-24 10:32:28 -0800326 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500327 byte[] data = cursor.getBlob(columnIndex);
328 if (data == null) {
329 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800330 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500331 return BitmapFactory.decodeByteArray(data, 0, data.length);
332 }
333
334 @Override
335 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
336 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
John Reck608baa72010-11-24 10:32:28 -0800337 Cursor cursor = mAdapter.getItem(info.position);
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400338 boolean isFolder
339 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
340 if (isFolder) return;
Michael Kolb801ecb72010-08-25 12:57:38 -0700341
Jeff Hamilton64144e42010-08-18 16:31:59 -0500342 final Activity activity = getActivity();
343 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500344 inflater.inflate(R.menu.bookmarkscontext, menu);
345
346 if (mDisableNewWindow) {
347 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
348 }
349
350 if (mContextHeader == null) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500351 mContextHeader = new BookmarkItem(activity);
Jeff Hamilton84029622010-08-05 14:29:28 -0500352 } else if (mContextHeader.getParent() != null) {
353 ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
354 }
355
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400356 populateBookmarkItem(cursor, mContextHeader);
Jeff Hamilton84029622010-08-05 14:29:28 -0500357
358 menu.setHeaderView(mContextHeader);
359 }
360
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400361 private void populateBookmarkItem(Cursor cursor, BookmarkItem item) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500362 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
363 item.setUrl(url);
364 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
365 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
366 if (bitmap == null) {
Michael Kolbe421c242010-10-04 19:29:01 -0700367 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
Jeff Hamilton84029622010-08-05 14:29:28 -0500368 }
369 item.setFavicon(bitmap);
370 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800371
372 /**
373 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700374 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800375 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500376 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800377 super.onCreate(icicle);
378
Jeff Hamilton64144e42010-08-18 16:31:59 -0500379 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400380 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500381 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400382
Jeff Hamilton64144e42010-08-18 16:31:59 -0500383 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500384 public View onCreateView(LayoutInflater inflater, ViewGroup container,
385 Bundle savedInstanceState) {
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500386 Context context = getActivity();
387
Jeff Hamilton64144e42010-08-18 16:31:59 -0500388 View root = inflater.inflate(R.layout.bookmarks, container, false);
389 mEmptyView = root.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400390
Jeff Hamilton64144e42010-08-18 16:31:59 -0500391 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500392 mGrid.setOnItemClickListener(this);
Michael Kolb8233fac2010-10-26 16:08:53 -0700393 mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
John Reck8af90642010-11-23 10:27:29 -0800394 mList = (ListView) root.findViewById(R.id.list);
395 mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800396 setEnableContextMenu(mEnableContextMenu);
397
398 // Prep the header
399 ViewGroup hc = mHeaderContainer;
400 if (hc == null) {
401 hc = (ViewGroup) root.findViewById(R.id.header_container);
402 hc.setVisibility(View.VISIBLE);
John Reck8af90642010-11-23 10:27:29 -0800403 }
John Reck608baa72010-11-24 10:32:28 -0800404 mHeader = inflater.inflate(R.layout.bookmarks_header, hc, true);
405 mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
406 mCrumbs.setController(this);
407 mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
408 mSelectBookmarkView.setOnClickListener(this);
409 mRootFolderView = mHeader.findViewById(R.id.root_folder);
410 mRootFolderView.setOnClickListener(this);
411 setShowRootFolder(mShowRootFolder);
Jeff Hamilton84029622010-08-05 14:29:28 -0500412
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500413 // Start the loaders
414 LoaderManager lm = getLoaderManager();
415 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
John Reck8af90642010-11-23 10:27:29 -0800416 mCurrentView =
417 prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
John Reck608baa72010-11-24 10:32:28 -0800418 if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
419 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
420 } else {
421 mSelectBookmarkView.setText(R.string.bookmark_list_view);
422 }
John Reck8af90642010-11-23 10:27:29 -0800423 mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500424 String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
425 String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500426 if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
427 // There is an account set, load up that one
428 Bundle args = null;
429 if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
430 args = new Bundle();
431 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
432 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
433 }
Jeff Hamilton70c77692010-09-21 19:11:24 -0500434 lm.restartLoader(LOADER_BOOKMARKS, args, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500435 } else {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500436 // No account set, load the account list first
Jeff Hamilton70c77692010-09-21 19:11:24 -0500437 lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500438 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500439
440 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700441 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800442
Jeff Hamilton64144e42010-08-18 16:31:59 -0500443 return root;
444 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700445
John Reck608baa72010-11-24 10:32:28 -0800446 public void setShowRootFolder(boolean show) {
447 mShowRootFolder = show;
448 if (mRootFolderView != null) {
449 if (mShowRootFolder) {
450 mRootFolderView.setVisibility(View.VISIBLE);
451 } else {
452 mRootFolderView.setVisibility(View.GONE);
453 }
454 }
455 }
456
457 @Override
458 public void onDestroyView() {
459 super.onDestroyView();
460 if (mHeaderContainer != null) {
461 mHeaderContainer.removeView(mHeader);
462 }
463 mCrumbs.setController(null);
464 mCrumbs = null;
465 }
466
Nicolas Catania095292f2010-03-15 09:00:14 -0700467 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500468 public void onReceivedIcon(String url, Bitmap icon) {
469 // A new favicon has been loaded, so let anything attached to the adapter know about it
470 // so new icons will be loaded.
471 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700472 }
473
Jeff Hamilton84029622010-08-05 14:29:28 -0500474 @Override
John Reck608baa72010-11-24 10:32:28 -0800475 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500476 // It is possible that the view has been canceled when we get to
477 // this point as back has a higher priority
478 if (mCanceled) {
479 android.util.Log.e(LOGTAG, "item clicked when dismissing");
480 return;
481 }
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500482
John Reck608baa72010-11-24 10:32:28 -0800483 Cursor cursor = mAdapter.getItem(position);
484 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
485 if (mCallbacks != null &&
486 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100487 return;
488 }
489
John Reck608baa72010-11-24 10:32:28 -0800490 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700491 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500492 LoaderManager manager = getLoaderManager();
Michael Kolb801ecb72010-08-25 12:57:38 -0700493 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800494 (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
Jeff Hamilton84029622010-08-05 14:29:28 -0500495 Uri uri = ContentUris.withAppendedId(
496 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
Michael Kolb370a4f32010-10-06 10:45:32 -0700497 if (mCrumbs != null) {
498 // update crumbs
499 mCrumbs.pushView(title, uri);
500 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500501 loader.setUri(uri);
502 loader.forceLoad();
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400503 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800504 }
505
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500506 @Override
507 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
508 Adapter adapter = parent.getAdapter();
509 String accountType = "com.google";
510 String accountName = adapter.getItem(position).toString();
511
Jeff Hamilton70c77692010-09-21 19:11:24 -0500512 Bundle args = null;
513 if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
514 accountType = DEFAULT_ACCOUNT;
515 accountName = DEFAULT_ACCOUNT;
516 } else {
517 args = new Bundle();
518 args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
519 args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
520 }
521
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500522 // Remember the selection for later
523 PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
524 .putString(PREF_ACCOUNT_TYPE, accountType)
525 .putString(PREF_ACCOUNT_NAME, accountName)
526 .apply();
527
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500528 getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
529 }
530
531 @Override
532 public void onNothingSelected(AdapterView<?> parent) {
533 // Do nothing
534 }
535
John Reck608baa72010-11-24 10:32:28 -0800536 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500537 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700538 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500539 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
540 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800541 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
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 loadUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800545 if (mCallbacks != null) {
546 mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
547 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800548 }
549
The Android Open Source Project0c908882009-03-03 19:32:16 -0800550 private void openInNewWindow(int position) {
John Reck608baa72010-11-24 10:32:28 -0800551 if (mCallbacks != null) {
552 mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
553 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800554 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700555
The Android Open Source Project0c908882009-03-03 19:32:16 -0800556 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500557 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck608baa72010-11-24 10:32:28 -0800558 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500559 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700560 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500561 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700562 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500563 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
564 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
565 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700566 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500567 BitmapFactory.decodeByteArray(data, 0, data.length));
568 }
569 item.putInt("id", cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400570 item.putLong(BrowserContract.Bookmarks.PARENT,
571 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
Jeff Hamilton84029622010-08-05 14:29:28 -0500572 intent.putExtra("bookmark", item);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800573 startActivityForResult(intent, BOOKMARKS_SAVE);
574 }
575
576 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500577 public void onActivityResult(int requestCode, int resultCode, Intent data) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800578 switch(requestCode) {
579 case BOOKMARKS_SAVE:
Jeff Hamilton64144e42010-08-18 16:31:59 -0500580 if (resultCode == Activity.RESULT_OK) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800581 Bundle extras;
582 if (data != null && (extras = data.getExtras()) != null) {
583 // If there are extras, then we need to save
584 // the edited bookmark. This is done in updateRow()
Leon Scrogginsbc922852010-10-22 12:15:27 -0400585 String title = extras.getString(BrowserContract.Bookmarks.TITLE);
586 String url = extras.getString(BrowserContract.Bookmarks.URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800587 if (title != null && url != null) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500588 updateRow(extras);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800589 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800590 }
591 }
592 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800593 }
594 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700595
Jeff Hamilton84029622010-08-05 14:29:28 -0500596 /**
Michael Kolb801ecb72010-08-25 12:57:38 -0700597 * Update a row in the database with new information.
Jeff Hamilton84029622010-08-05 14:29:28 -0500598 * @param map Bundle storing id, title and url of new information
599 */
600 public void updateRow(Bundle map) {
601
602 // Find the record
Michael Kolbbef7a752010-08-25 17:11:35 -0700603 int id = map.getInt("id");
Jeff Hamilton84029622010-08-05 14:29:28 -0500604 int position = -1;
605 Cursor cursor = mAdapter.getCursor();
606 for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
607 if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID) == id) {
608 position = cursor.getPosition();
609 break;
610 }
611 }
612 if (position < 0) {
613 return;
614 }
615
616 cursor.moveToPosition(position);
617 ContentValues values = new ContentValues();
Michael Kolbbef7a752010-08-25 17:11:35 -0700618 String title = map.getString(BrowserContract.Bookmarks.TITLE);
619 if (!title.equals(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE))) {
620 values.put(BrowserContract.Bookmarks.TITLE, title);
Jeff Hamilton84029622010-08-05 14:29:28 -0500621 }
Michael Kolbbef7a752010-08-25 17:11:35 -0700622 String url = map.getString(BrowserContract.Bookmarks.URL);
623 if (!url.equals(cursor.getString(BookmarksLoader.COLUMN_INDEX_URL))) {
624 values.put(BrowserContract.Bookmarks.URL, url);
Jeff Hamilton84029622010-08-05 14:29:28 -0500625 }
626
Leon Scrogginsbc922852010-10-22 12:15:27 -0400627 if (map.getBoolean(AddBookmarkPage.REMOVE_THUMBNAIL)) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700628 values.putNull(BrowserContract.Bookmarks.THUMBNAIL);
Jeff Hamilton84029622010-08-05 14:29:28 -0500629 }
630
631 if (values.size() > 0) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500632 getActivity().getContentResolver().update(
Jeff Hamilton8ce956c2010-08-17 11:13:53 -0500633 ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI, id),
634 values, null, null);
Jeff Hamilton84029622010-08-05 14:29:28 -0500635 }
636 }
637
638 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800639 // Put up a dialog asking if the user really wants to
640 // delete the bookmark
John Reck608baa72010-11-24 10:32:28 -0800641 Cursor cursor = mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500642 Context context = getActivity();
Jeff Hamilton1a805652010-09-07 12:36:30 -0700643 final ContentResolver resolver = context.getContentResolver();
644 final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
645 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
646
Jeff Hamilton64144e42010-08-18 16:31:59 -0500647 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800648 .setTitle(R.string.delete_bookmark)
649 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton1a805652010-09-07 12:36:30 -0700650 .setMessage(context.getString(R.string.delete_bookmark_warning,
651 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700652 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800653 new DialogInterface.OnClickListener() {
Jeff Hamiltona9bad832010-09-24 11:05:30 -0500654 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800655 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton1a805652010-09-07 12:36:30 -0700656 resolver.delete(uri, null, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800657 }
658 })
659 .setNegativeButton(R.string.cancel, null)
660 .show();
661 }
662
Jeff Hamilton84029622010-08-05 14:29:28 -0500663 private String getUrl(int position) {
John Reck608baa72010-11-24 10:32:28 -0800664 return getUrl(mAdapter.getItem(position));
665 }
666
667 /* package */ static String getUrl(Cursor c) {
668 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800669 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700670
The Android Open Source Project0c908882009-03-03 19:32:16 -0800671 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500672 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
673 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700674 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800675 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700676
John Reck8af90642010-11-23 10:27:29 -0800677 void selectView(int view) {
678 if (view == mCurrentView) {
679 return;
680 }
681 mCurrentView = view;
682 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
683 Editor edit = prefs.edit();
684 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
685 edit.apply();
686 if (mEmptyView.getVisibility() == View.VISIBLE) {
687 return;
688 }
689 setupBookmarkView();
690 }
691
692 private void setupBookmarkView() {
693 mAdapter.selectView(mCurrentView);
694 switch (mCurrentView) {
695 case VIEW_THUMBNAILS:
696 mList.setAdapter(null);
697 mGrid.setAdapter(mAdapter);
698 mGrid.setVisibility(View.VISIBLE);
699 mList.setVisibility(View.GONE);
700 break;
701 case VIEW_LIST:
702 mGrid.setAdapter(null);
703 mList.setAdapter(mAdapter);
704 mGrid.setVisibility(View.GONE);
705 mList.setVisibility(View.VISIBLE);
706 break;
707 }
708 }
John Reck608baa72010-11-24 10:32:28 -0800709
710 public BreadCrumbView getBreadCrumb() {
711 return mCrumbs;
712 }
713
714 /**
715 * BreadCrumb controller callback
716 */
717 @Override
718 public void onTop(int level, Object data) {
719 onFolderChange(level, data);
720 }
721
722 @Override
723 public void onClick(View view) {
724 if (mSelectBookmarkView == view) {
725 PopupMenu popup = new PopupMenu(getActivity(), mSelectBookmarkView);
726 popup.getMenuInflater().inflate(R.menu.bookmark_view,
727 popup.getMenu());
728 popup.setOnMenuItemClickListener(this);
729 popup.show();
730 } else if (mRootFolderView == view) {
731 mCrumbs.clear();
732 }
733 }
734
735 @Override
736 public boolean onMenuItemClick(MenuItem item) {
737 switch (item.getItemId()) {
738 case R.id.list_view:
739 mSelectBookmarkView.setText(R.string.bookmark_list_view);
740 selectView(BrowserBookmarksPage.VIEW_LIST);
741 return true;
742 case R.id.thumbnail_view:
743 mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
744 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
745 return true;
746 }
747 return false;
748 }
749
750 public boolean onBackPressed() {
751 if (mCrumbs != null &&
752 mCrumbs.size() > 0) {
753 mCrumbs.popView();
754 return true;
755 }
756 return false;
757 }
758
759 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
760 mCallbacks = callbackListener;
761 }
762
763 public void setEnableContextMenu(boolean enable) {
764 mEnableContextMenu = enable;
765 if (mGrid != null) {
766 if (mEnableContextMenu) {
767 registerForContextMenu(mGrid);
768 } else {
769 unregisterForContextMenu(mGrid);
770 mGrid.setLongClickable(false);
771 }
772 }
773 if (mList != null) {
774 if (mEnableContextMenu) {
775 registerForContextMenu(mList);
776 } else {
777 unregisterForContextMenu(mList);
778 mList.setLongClickable(false);
779 }
780 }
781 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800782}