blob: 6a51b987bc30be5b13fbc4df70dc9ea8ed05acf1 [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 Hamilton84029622010-08-05 14:29:28 -050021import android.app.LoaderManager;
Dianne Hackborn80f32622010-08-05 14:17:53 -070022import android.content.ClipboardManager;
Jeff Hamilton84029622010-08-05 14:29:28 -050023import android.content.ClippedData;
24import android.content.ContentUris;
25import android.content.ContentValues;
Dianne Hackborn80f32622010-08-05 14:17:53 -070026import android.content.Context;
The Android Open Source Project0c908882009-03-03 19:32:16 -080027import android.content.DialogInterface;
28import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050029import android.content.Loader;
30import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080031import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050032import android.graphics.BitmapFactory;
33import android.net.Uri;
The Android Open Source Project0c908882009-03-03 19:32:16 -080034import android.os.Bundle;
The Android Open Source Project0c908882009-03-03 19:32:16 -080035import android.provider.Browser;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050036import android.provider.BrowserContract;
Jeff Hamilton84029622010-08-05 14:29:28 -050037import android.util.Pair;
The Android Open Source Project0c908882009-03-03 19:32:16 -080038import android.view.ContextMenu;
Jeff Hamilton84029622010-08-05 14:29:28 -050039import android.view.ContextMenu.ContextMenuInfo;
The Android Open Source Project0c908882009-03-03 19:32:16 -080040import android.view.MenuInflater;
41import android.view.MenuItem;
42import android.view.View;
Jeff Hamilton84029622010-08-05 14:29:28 -050043import android.view.View.OnClickListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080044import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050045import android.webkit.WebIconDatabase.IconListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080046import android.widget.AdapterView;
Michael Kolbfe251992010-07-08 15:41:55 -070047import android.widget.AdapterView.OnItemClickListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050048import android.widget.Button;
49import android.widget.GridView;
50import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080051
Jeff Hamilton84029622010-08-05 14:29:28 -050052import java.util.Stack;
53
The Android Open Source Project0c908882009-03-03 19:32:16 -080054/**
55 * View showing the user's bookmarks in the browser.
56 */
Jeff Hamilton84029622010-08-05 14:29:28 -050057public class BrowserBookmarksPage extends Activity implements View.OnCreateContextMenuListener,
58 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener, OnClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080059
Jeff Hamilton84029622010-08-05 14:29:28 -050060 static final int BOOKMARKS_SAVE = 1;
61 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070062
Jeff Hamilton84029622010-08-05 14:29:28 -050063 static final int LOADER_BOOKMARKS = 1;
64
65 GridView mGrid;
66 BrowserBookmarksAdapter mAdapter;
67 boolean mDisableNewWindow;
68 BookmarkItem mContextHeader;
69 boolean mCanceled = false;
70 boolean mCreateShortcut;
71 View mEmptyView;
72 View mContentView;
73 Stack<Pair<String, Uri>> mFolderStack = new Stack<Pair<String, Uri>>();
74 Button mUpButton;
75
76 @Override
77 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
78 switch (id) {
79 case LOADER_BOOKMARKS: {
80 int rootFolder = 0;
81 if (args != null) {
82 args.getInt(BookmarksLoader.ARG_ROOT_FOLDER, 0);
83 }
84 return new BookmarksLoader(this, rootFolder);
85 }
86 }
87 throw new UnsupportedOperationException("Unknown loader id " + id);
88 }
89
90 @Override
91 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
92 // Set the visibility of the empty vs. content views
93 if (data == null || data.getCount() == 0) {
94 mEmptyView.setVisibility(View.VISIBLE);
95 mContentView.setVisibility(View.GONE);
96 } else {
97 mEmptyView.setVisibility(View.GONE);
98 mContentView.setVisibility(View.VISIBLE);
99 }
100
101 // Fill in the "up" button if needed
102 BookmarksLoader bl = (BookmarksLoader) loader;
103 boolean rootFolder =
104 (BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER.equals(bl.getUri()));
105 if (rootFolder) {
106 mUpButton.setText(R.string.defaultBookmarksUpButton);
107 mUpButton.setEnabled(false);
108 } else {
109 mUpButton.setText(mFolderStack.peek().first);
110 mUpButton.setEnabled(true);
111 }
112
113 // Give the new data to the adapter
114 mAdapter.changeCursor(data);
115 }
116
117 @Override
118 public void onClick(View view) {
119 if (view == mUpButton) {
120 Pair<String, Uri> pair = mFolderStack.pop();
121 BookmarksLoader loader =
122 (BookmarksLoader) ((Loader) getLoaderManager().getLoader(LOADER_BOOKMARKS));
123 loader.setUri(pair.second);
124 loader.forceLoad();
125 }
126 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800127
128 @Override
129 public boolean onContextItemSelected(MenuItem item) {
130 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700131 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800132 if (mCanceled) {
133 return true;
134 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700135 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800136 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
137 // If we have no menu info, we can't tell which item was selected.
138 if (i == null) {
139 return true;
140 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700141
The Android Open Source Project0c908882009-03-03 19:32:16 -0800142 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800143 case R.id.open_context_menu_id:
144 loadUrl(i.position);
145 break;
146 case R.id.edit_context_menu_id:
147 editBookmark(i.position);
148 break;
149 case R.id.shortcut_context_menu_id:
Ben Murdoch90b40262010-06-30 13:33:28 +0100150 sendBroadcast(createShortcutIntent(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800151 break;
152 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500153 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800154 break;
155 case R.id.new_window_context_menu_id:
156 openInNewWindow(i.position);
157 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500158 case R.id.share_link_context_menu_id: {
159 Cursor cursor = (Cursor) mAdapter.getItem(i.position);
Leon Scroggins96afcb12009-12-10 12:35:56 -0500160 BrowserActivity.sharePage(BrowserBookmarksPage.this,
Jeff Hamilton84029622010-08-05 14:29:28 -0500161 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
162 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
163 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
164 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800165 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500166 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800167 case R.id.copy_url_context_menu_id:
168 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400169 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500170 case R.id.homepage_context_menu_id: {
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400171 BrowserSettings.getInstance().setHomePage(this,
172 getUrl(i.position));
173 Toast.makeText(this, R.string.homepage_set,
174 Toast.LENGTH_LONG).show();
175 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500176 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400177 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500178 case R.id.save_to_bookmarks_menu_id: {
179 Cursor cursor = (Cursor) mAdapter.getItem(i.position);
180 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
181 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400182 // If the site is bookmarked, the item becomes remove from
183 // bookmarks.
Jeff Hamilton84029622010-08-05 14:29:28 -0500184 Bookmarks.removeFromBookmarks(this, getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400185 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500186 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800187 default:
188 return super.onContextItemSelected(item);
189 }
190 return true;
191 }
192
Jeff Hamilton84029622010-08-05 14:29:28 -0500193 Bitmap getBitmap(Cursor cursor, int columnIndex) {
194 byte[] data = cursor.getBlob(columnIndex);
195 if (data == null) {
196 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800197 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500198 return BitmapFactory.decodeByteArray(data, 0, data.length);
199 }
200
201 @Override
202 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
203 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
204
205 MenuInflater inflater = getMenuInflater();
206 inflater.inflate(R.menu.bookmarkscontext, menu);
207
208 if (mDisableNewWindow) {
209 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
210 }
211
212 if (mContextHeader == null) {
213 mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
214 } else if (mContextHeader.getParent() != null) {
215 ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
216 }
217
218 populateBookmarkItem(mAdapter, mContextHeader, info.position);
219
220 menu.setHeaderView(mContextHeader);
221 }
222
223 private void populateBookmarkItem(BrowserBookmarksAdapter adapter, BookmarkItem item,
224 int position) {
225 Cursor cursor = (Cursor) mAdapter.getItem(position);
226 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
227 item.setUrl(url);
228 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
229 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
230 if (bitmap == null) {
231 bitmap = CombinedBookmarkHistoryActivity.getIconListenerSet().getFavicon(url);
232 }
233 item.setFavicon(bitmap);
234 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800235
236 /**
237 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700238 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800239 @Override
240 protected void onCreate(Bundle icicle) {
241 super.onCreate(icicle);
242
Patrick Scottf49ecd62010-04-09 12:43:26 -0400243 Intent intent = getIntent();
244 if (Intent.ACTION_CREATE_SHORTCUT.equals(intent.getAction())) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800245 mCreateShortcut = true;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400246 setTitle(R.string.browser_bookmarks_page_bookmarks_text);
247 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500248 mDisableNewWindow = intent.getBooleanExtra("disable_new_window", false);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400249
Jeff Hamilton84029622010-08-05 14:29:28 -0500250 setContentView(R.layout.bookmarks);
251 mEmptyView = findViewById(android.R.id.empty);
252 mContentView = findViewById(android.R.id.content);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400253
Jeff Hamilton84029622010-08-05 14:29:28 -0500254 mGrid = (GridView) findViewById(R.id.grid);
255 mGrid.setOnItemClickListener(this);
256 mGrid.setColumnWidth(
257 BrowserActivity.getDesiredThumbnailWidth(this));
258 if (!mCreateShortcut) {
259 mGrid.setOnCreateContextMenuListener(this);
Ben Murdoch328ea872009-09-16 13:33:29 +0100260 }
Patrick Scottf49ecd62010-04-09 12:43:26 -0400261
Jeff Hamilton84029622010-08-05 14:29:28 -0500262 mUpButton = (Button) findViewById(R.id.up);
263 mUpButton.setEnabled(false);
264 mUpButton.setOnClickListener(this);
265
266 mAdapter = new BrowserBookmarksAdapter(this);
267 mGrid.setAdapter(mAdapter);
268
269 // Start the loader for the bookmark data
270 getLoaderManager().initLoader(LOADER_BOOKMARKS, null, this);
271
272 // Add our own listener in case there are favicons that have yet to be loaded.
273 CombinedBookmarkHistoryActivity.getIconListenerSet().addListener(this);
Leon Scroggins892df312009-07-14 14:48:02 -0400274 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800275
Nicolas Catania095292f2010-03-15 09:00:14 -0700276 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500277 public void onReceivedIcon(String url, Bitmap icon) {
278 // A new favicon has been loaded, so let anything attached to the adapter know about it
279 // so new icons will be loaded.
280 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700281 }
282
Jeff Hamilton84029622010-08-05 14:29:28 -0500283 @Override
284 public void onItemClick(AdapterView parent, View v, int position, long id) {
285 // It is possible that the view has been canceled when we get to
286 // this point as back has a higher priority
287 if (mCanceled) {
288 android.util.Log.e(LOGTAG, "item clicked when dismissing");
289 return;
290 }
291 if (mCreateShortcut) {
292 setResultToParent(RESULT_OK, createShortcutIntent(position));
293 finish();
Ben Murdoch328ea872009-09-16 13:33:29 +0100294 return;
295 }
296
Jeff Hamilton84029622010-08-05 14:29:28 -0500297 Cursor cursor = (Cursor) mAdapter.getItem(position);
298 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
299 if (!isFolder) {
300 loadUrl(position);
Leon Scroggins892df312009-07-14 14:48:02 -0400301 } else {
Jeff Hamilton84029622010-08-05 14:29:28 -0500302 String title;
303 if (mFolderStack.size() != 0) {
304 title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
305 } else {
306 // TODO localize
307 title = "Bookmarks";
Leon Scroggins892df312009-07-14 14:48:02 -0400308 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500309 LoaderManager manager = getLoaderManager();
310 BookmarksLoader loader =
311 (BookmarksLoader) ((Loader) manager.getLoader(LOADER_BOOKMARKS));
312 mFolderStack.push(new Pair(title, loader.getUri()));
313 Uri uri = ContentUris.withAppendedId(
314 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
315 loader.setUri(uri);
316 loader.forceLoad();
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400317 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800318 }
319
Patrick Scott3918d442009-08-04 13:22:29 -0400320 private Intent createShortcutIntent(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500321 Cursor cursor = (Cursor) mAdapter.getItem(position);
322 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
323 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
324 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
325 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
Ben Murdoch90b40262010-06-30 13:33:28 +0100326 return BookmarkUtils.createAddToHomeIntent(this, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800327 }
328
The Android Open Source Project0c908882009-03-03 19:32:16 -0800329 private void loadUrl(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500330 Cursor cursor = (Cursor) mAdapter.getItem(position);
331 Intent intent = new Intent(cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800332 setResultToParent(RESULT_OK, intent);
333 finish();
334 }
335
The Android Open Source Project0c908882009-03-03 19:32:16 -0800336 private void openInNewWindow(int position) {
337 Bundle b = new Bundle();
338 b.putBoolean("new_window", true);
Jeff Hamilton84029622010-08-05 14:29:28 -0500339 setResultToParent(RESULT_OK, (new Intent(getUrl(position))).putExtras(b));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800340 finish();
341 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700342
The Android Open Source Project0c908882009-03-03 19:32:16 -0800343 private void editBookmark(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500344 Intent intent = new Intent(this, AddBookmarkPage.class);
345 Cursor cursor = (Cursor) mAdapter.getItem(position);
346 Bundle item = new Bundle();
347 item.putString(Browser.BookmarkColumns.TITLE,
348 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
349 item.putString(Browser.BookmarkColumns.URL,
350 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
351 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
352 if (data != null) {
353 item.putParcelable(Browser.BookmarkColumns.FAVICON,
354 BitmapFactory.decodeByteArray(data, 0, data.length));
355 }
356 item.putInt("id", cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID));
357 intent.putExtra("bookmark", item);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800358 startActivityForResult(intent, BOOKMARKS_SAVE);
359 }
360
361 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500362 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800363 switch(requestCode) {
364 case BOOKMARKS_SAVE:
365 if (resultCode == RESULT_OK) {
366 Bundle extras;
367 if (data != null && (extras = data.getExtras()) != null) {
368 // If there are extras, then we need to save
369 // the edited bookmark. This is done in updateRow()
370 String title = extras.getString("title");
371 String url = extras.getString("url");
372 if (title != null && url != null) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500373 updateRow(extras);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800374 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800375 }
376 }
377 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800378 }
379 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700380
Jeff Hamilton84029622010-08-05 14:29:28 -0500381 /**
382 * Update a row in the database with new information.
383 * Requeries the database if the information has changed.
384 * @param map Bundle storing id, title and url of new information
385 */
386 public void updateRow(Bundle map) {
387
388 // Find the record
389 int id = map.getInt("id");
390 int position = -1;
391 Cursor cursor = mAdapter.getCursor();
392 for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
393 if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID) == id) {
394 position = cursor.getPosition();
395 break;
396 }
397 }
398 if (position < 0) {
399 return;
400 }
401
402 cursor.moveToPosition(position);
403 ContentValues values = new ContentValues();
404 String title = map.getString(Browser.BookmarkColumns.TITLE);
405 if (!title.equals(cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX))) {
406 values.put(Browser.BookmarkColumns.TITLE, title);
407 }
408 String url = map.getString(Browser.BookmarkColumns.URL);
409 if (!url.equals(cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX))) {
410 values.put(Browser.BookmarkColumns.URL, url);
411 }
412
413 if (map.getBoolean("invalidateThumbnail") == true) {
414 values.put(Browser.BookmarkColumns.THUMBNAIL, new byte[0]);
415 }
416
417 if (values.size() > 0) {
418 getContentResolver().update(Browser.BOOKMARKS_URI, values,
419 "_id = ?", new String[] { Integer.toString(id) });
420 }
421 }
422
423 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800424 // Put up a dialog asking if the user really wants to
425 // delete the bookmark
Jeff Hamilton84029622010-08-05 14:29:28 -0500426 Cursor cursor = (Cursor) mAdapter.getItem(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800427 new AlertDialog.Builder(this)
428 .setTitle(R.string.delete_bookmark)
429 .setIcon(android.R.drawable.ic_dialog_alert)
430 .setMessage(getText(R.string.delete_bookmark_warning).toString().replace(
Jeff Hamilton84029622010-08-05 14:29:28 -0500431 "%s", cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700432 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800433 new DialogInterface.OnClickListener() {
434 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500435 deleteBookmark(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800436 }
437 })
438 .setNegativeButton(R.string.cancel, null)
439 .show();
440 }
441
Jeff Hamilton84029622010-08-05 14:29:28 -0500442 private String getUrl(int position) {
443 Cursor cursor = (Cursor) mAdapter.getItem(position);
444 return cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800445 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500446
The Android Open Source Project0c908882009-03-03 19:32:16 -0800447 private void copy(CharSequence text) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500448 ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
449 cm.setPrimaryClip(new ClippedData(null, null, new ClippedData.Item(text)));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800450 }
451
452 /**
453 * Delete the currently highlighted row.
454 */
455 public void deleteBookmark(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500456 Cursor cursor = (Cursor) mAdapter.getItem(position);
457 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
458 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
459 Bookmarks.removeFromBookmarks(null, getContentResolver(), url, title);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800460 }
Grace Kloba5942df02009-09-18 11:48:29 -0700461
462 @Override
463 public void onBackPressed() {
464 setResultToParent(RESULT_CANCELED, null);
465 mCanceled = true;
466 super.onBackPressed();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800467 }
468
Leon Scrogginsfde97462010-01-11 13:06:21 -0500469 // This Activity is generally a sub-Activity of
470 // CombinedBookmarkHistoryActivity. In that situation, we need to pass our
471 // result code up to our parent. However, if someone calls this Activity
472 // directly, then this has no parent, and it needs to set it on itself.
The Android Open Source Project0c908882009-03-03 19:32:16 -0800473 private void setResultToParent(int resultCode, Intent data) {
Leon Scrogginsfde97462010-01-11 13:06:21 -0500474 Activity parent = getParent();
475 if (parent == null) {
476 setResult(resultCode, data);
477 } else {
478 ((CombinedBookmarkHistoryActivity) parent).setResultFromChild(
479 resultCode, data);
480 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800481 }
Michael Kolbfe251992010-07-08 15:41:55 -0700482
The Android Open Source Project0c908882009-03-03 19:32:16 -0800483}