blob: 40fd1e124abefe27824800b0ff2a00920e9206fe [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
Jeff Hamilton84029622010-08-05 14:29:28 -050019import com.android.browser.provider.BrowserContract;
20
The Android Open Source Project0c908882009-03-03 19:32:16 -080021import android.app.Activity;
22import android.app.AlertDialog;
Jeff Hamilton84029622010-08-05 14:29:28 -050023import android.app.LoaderManager;
Dianne Hackborn80f32622010-08-05 14:17:53 -070024import android.content.ClipboardManager;
Jeff Hamilton84029622010-08-05 14:29:28 -050025import android.content.ClippedData;
26import android.content.ContentUris;
27import android.content.ContentValues;
Dianne Hackborn80f32622010-08-05 14:17:53 -070028import android.content.Context;
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;
32import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080033import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050034import android.graphics.BitmapFactory;
35import android.net.Uri;
The Android Open Source Project0c908882009-03-03 19:32:16 -080036import android.os.Bundle;
The Android Open Source Project0c908882009-03-03 19:32:16 -080037import android.provider.Browser;
Jeff Hamilton84029622010-08-05 14:29:28 -050038import android.util.Pair;
The Android Open Source Project0c908882009-03-03 19:32:16 -080039import android.view.ContextMenu;
Jeff Hamilton84029622010-08-05 14:29:28 -050040import android.view.ContextMenu.ContextMenuInfo;
The Android Open Source Project0c908882009-03-03 19:32:16 -080041import android.view.MenuInflater;
42import android.view.MenuItem;
43import android.view.View;
Jeff Hamilton84029622010-08-05 14:29:28 -050044import android.view.View.OnClickListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080045import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050046import android.webkit.WebIconDatabase.IconListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080047import android.widget.AdapterView;
Michael Kolbfe251992010-07-08 15:41:55 -070048import android.widget.AdapterView.OnItemClickListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050049import android.widget.Button;
50import android.widget.GridView;
51import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080052
Jeff Hamilton84029622010-08-05 14:29:28 -050053import java.util.Stack;
54
The Android Open Source Project0c908882009-03-03 19:32:16 -080055/**
56 * View showing the user's bookmarks in the browser.
57 */
Jeff Hamilton84029622010-08-05 14:29:28 -050058public class BrowserBookmarksPage extends Activity implements View.OnCreateContextMenuListener,
59 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener, OnClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080060
Jeff Hamilton84029622010-08-05 14:29:28 -050061 static final int BOOKMARKS_SAVE = 1;
62 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070063
Jeff Hamilton84029622010-08-05 14:29:28 -050064 static final int LOADER_BOOKMARKS = 1;
65
66 GridView mGrid;
67 BrowserBookmarksAdapter mAdapter;
68 boolean mDisableNewWindow;
69 BookmarkItem mContextHeader;
70 boolean mCanceled = false;
71 boolean mCreateShortcut;
72 View mEmptyView;
73 View mContentView;
74 Stack<Pair<String, Uri>> mFolderStack = new Stack<Pair<String, Uri>>();
75 Button mUpButton;
76
77 @Override
78 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
79 switch (id) {
80 case LOADER_BOOKMARKS: {
81 int rootFolder = 0;
82 if (args != null) {
83 args.getInt(BookmarksLoader.ARG_ROOT_FOLDER, 0);
84 }
85 return new BookmarksLoader(this, rootFolder);
86 }
87 }
88 throw new UnsupportedOperationException("Unknown loader id " + id);
89 }
90
91 @Override
92 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
93 // Set the visibility of the empty vs. content views
94 if (data == null || data.getCount() == 0) {
95 mEmptyView.setVisibility(View.VISIBLE);
96 mContentView.setVisibility(View.GONE);
97 } else {
98 mEmptyView.setVisibility(View.GONE);
99 mContentView.setVisibility(View.VISIBLE);
100 }
101
102 // Fill in the "up" button if needed
103 BookmarksLoader bl = (BookmarksLoader) loader;
104 boolean rootFolder =
105 (BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER.equals(bl.getUri()));
106 if (rootFolder) {
107 mUpButton.setText(R.string.defaultBookmarksUpButton);
108 mUpButton.setEnabled(false);
109 } else {
110 mUpButton.setText(mFolderStack.peek().first);
111 mUpButton.setEnabled(true);
112 }
113
114 // Give the new data to the adapter
115 mAdapter.changeCursor(data);
116 }
117
118 @Override
119 public void onClick(View view) {
120 if (view == mUpButton) {
121 Pair<String, Uri> pair = mFolderStack.pop();
122 BookmarksLoader loader =
123 (BookmarksLoader) ((Loader) getLoaderManager().getLoader(LOADER_BOOKMARKS));
124 loader.setUri(pair.second);
125 loader.forceLoad();
126 }
127 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800128
129 @Override
130 public boolean onContextItemSelected(MenuItem item) {
131 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700132 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800133 if (mCanceled) {
134 return true;
135 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700136 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800137 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
138 // If we have no menu info, we can't tell which item was selected.
139 if (i == null) {
140 return true;
141 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700142
The Android Open Source Project0c908882009-03-03 19:32:16 -0800143 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800144 case R.id.open_context_menu_id:
145 loadUrl(i.position);
146 break;
147 case R.id.edit_context_menu_id:
148 editBookmark(i.position);
149 break;
150 case R.id.shortcut_context_menu_id:
Ben Murdoch90b40262010-06-30 13:33:28 +0100151 sendBroadcast(createShortcutIntent(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800152 break;
153 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500154 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800155 break;
156 case R.id.new_window_context_menu_id:
157 openInNewWindow(i.position);
158 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500159 case R.id.share_link_context_menu_id: {
160 Cursor cursor = (Cursor) mAdapter.getItem(i.position);
Leon Scroggins96afcb12009-12-10 12:35:56 -0500161 BrowserActivity.sharePage(BrowserBookmarksPage.this,
Jeff Hamilton84029622010-08-05 14:29:28 -0500162 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
163 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
164 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
165 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800166 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500167 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800168 case R.id.copy_url_context_menu_id:
169 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400170 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500171 case R.id.homepage_context_menu_id: {
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400172 BrowserSettings.getInstance().setHomePage(this,
173 getUrl(i.position));
174 Toast.makeText(this, R.string.homepage_set,
175 Toast.LENGTH_LONG).show();
176 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500177 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400178 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500179 case R.id.save_to_bookmarks_menu_id: {
180 Cursor cursor = (Cursor) mAdapter.getItem(i.position);
181 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
182 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400183 // If the site is bookmarked, the item becomes remove from
184 // bookmarks.
Jeff Hamilton84029622010-08-05 14:29:28 -0500185 Bookmarks.removeFromBookmarks(this, getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400186 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500187 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800188 default:
189 return super.onContextItemSelected(item);
190 }
191 return true;
192 }
193
Jeff Hamilton84029622010-08-05 14:29:28 -0500194 Bitmap getBitmap(Cursor cursor, int columnIndex) {
195 byte[] data = cursor.getBlob(columnIndex);
196 if (data == null) {
197 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800198 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500199 return BitmapFactory.decodeByteArray(data, 0, data.length);
200 }
201
202 @Override
203 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
204 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
205
206 MenuInflater inflater = getMenuInflater();
207 inflater.inflate(R.menu.bookmarkscontext, menu);
208
209 if (mDisableNewWindow) {
210 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
211 }
212
213 if (mContextHeader == null) {
214 mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
215 } else if (mContextHeader.getParent() != null) {
216 ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
217 }
218
219 populateBookmarkItem(mAdapter, mContextHeader, info.position);
220
221 menu.setHeaderView(mContextHeader);
222 }
223
224 private void populateBookmarkItem(BrowserBookmarksAdapter adapter, BookmarkItem item,
225 int position) {
226 Cursor cursor = (Cursor) mAdapter.getItem(position);
227 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
228 item.setUrl(url);
229 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
230 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
231 if (bitmap == null) {
232 bitmap = CombinedBookmarkHistoryActivity.getIconListenerSet().getFavicon(url);
233 }
234 item.setFavicon(bitmap);
235 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800236
237 /**
238 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700239 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800240 @Override
241 protected void onCreate(Bundle icicle) {
242 super.onCreate(icicle);
243
Patrick Scottf49ecd62010-04-09 12:43:26 -0400244 Intent intent = getIntent();
245 if (Intent.ACTION_CREATE_SHORTCUT.equals(intent.getAction())) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800246 mCreateShortcut = true;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400247 setTitle(R.string.browser_bookmarks_page_bookmarks_text);
248 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500249 mDisableNewWindow = intent.getBooleanExtra("disable_new_window", false);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400250
Jeff Hamilton84029622010-08-05 14:29:28 -0500251 setContentView(R.layout.bookmarks);
252 mEmptyView = findViewById(android.R.id.empty);
253 mContentView = findViewById(android.R.id.content);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400254
Jeff Hamilton84029622010-08-05 14:29:28 -0500255 mGrid = (GridView) findViewById(R.id.grid);
256 mGrid.setOnItemClickListener(this);
257 mGrid.setColumnWidth(
258 BrowserActivity.getDesiredThumbnailWidth(this));
259 if (!mCreateShortcut) {
260 mGrid.setOnCreateContextMenuListener(this);
Ben Murdoch328ea872009-09-16 13:33:29 +0100261 }
Patrick Scottf49ecd62010-04-09 12:43:26 -0400262
Jeff Hamilton84029622010-08-05 14:29:28 -0500263 mUpButton = (Button) findViewById(R.id.up);
264 mUpButton.setEnabled(false);
265 mUpButton.setOnClickListener(this);
266
267 mAdapter = new BrowserBookmarksAdapter(this);
268 mGrid.setAdapter(mAdapter);
269
270 // Start the loader for the bookmark data
271 getLoaderManager().initLoader(LOADER_BOOKMARKS, null, this);
272
273 // Add our own listener in case there are favicons that have yet to be loaded.
274 CombinedBookmarkHistoryActivity.getIconListenerSet().addListener(this);
Leon Scroggins892df312009-07-14 14:48:02 -0400275 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800276
Nicolas Catania095292f2010-03-15 09:00:14 -0700277 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500278 public void onReceivedIcon(String url, Bitmap icon) {
279 // A new favicon has been loaded, so let anything attached to the adapter know about it
280 // so new icons will be loaded.
281 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700282 }
283
Jeff Hamilton84029622010-08-05 14:29:28 -0500284 @Override
285 public void onItemClick(AdapterView parent, View v, int position, long id) {
286 // It is possible that the view has been canceled when we get to
287 // this point as back has a higher priority
288 if (mCanceled) {
289 android.util.Log.e(LOGTAG, "item clicked when dismissing");
290 return;
291 }
292 if (mCreateShortcut) {
293 setResultToParent(RESULT_OK, createShortcutIntent(position));
294 finish();
Ben Murdoch328ea872009-09-16 13:33:29 +0100295 return;
296 }
297
Jeff Hamilton84029622010-08-05 14:29:28 -0500298 Cursor cursor = (Cursor) mAdapter.getItem(position);
299 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
300 if (!isFolder) {
301 loadUrl(position);
Leon Scroggins892df312009-07-14 14:48:02 -0400302 } else {
Jeff Hamilton84029622010-08-05 14:29:28 -0500303 String title;
304 if (mFolderStack.size() != 0) {
305 title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
306 } else {
307 // TODO localize
308 title = "Bookmarks";
Leon Scroggins892df312009-07-14 14:48:02 -0400309 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500310 LoaderManager manager = getLoaderManager();
311 BookmarksLoader loader =
312 (BookmarksLoader) ((Loader) manager.getLoader(LOADER_BOOKMARKS));
313 mFolderStack.push(new Pair(title, loader.getUri()));
314 Uri uri = ContentUris.withAppendedId(
315 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
316 loader.setUri(uri);
317 loader.forceLoad();
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400318 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800319 }
320
Patrick Scott3918d442009-08-04 13:22:29 -0400321 private Intent createShortcutIntent(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500322 Cursor cursor = (Cursor) mAdapter.getItem(position);
323 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
324 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
325 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
326 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
Ben Murdoch90b40262010-06-30 13:33:28 +0100327 return BookmarkUtils.createAddToHomeIntent(this, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800328 }
329
The Android Open Source Project0c908882009-03-03 19:32:16 -0800330 private void loadUrl(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500331 Cursor cursor = (Cursor) mAdapter.getItem(position);
332 Intent intent = new Intent(cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800333 setResultToParent(RESULT_OK, intent);
334 finish();
335 }
336
The Android Open Source Project0c908882009-03-03 19:32:16 -0800337 private void openInNewWindow(int position) {
338 Bundle b = new Bundle();
339 b.putBoolean("new_window", true);
Jeff Hamilton84029622010-08-05 14:29:28 -0500340 setResultToParent(RESULT_OK, (new Intent(getUrl(position))).putExtras(b));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800341 finish();
342 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700343
The Android Open Source Project0c908882009-03-03 19:32:16 -0800344 private void editBookmark(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500345 Intent intent = new Intent(this, AddBookmarkPage.class);
346 Cursor cursor = (Cursor) mAdapter.getItem(position);
347 Bundle item = new Bundle();
348 item.putString(Browser.BookmarkColumns.TITLE,
349 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
350 item.putString(Browser.BookmarkColumns.URL,
351 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
352 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
353 if (data != null) {
354 item.putParcelable(Browser.BookmarkColumns.FAVICON,
355 BitmapFactory.decodeByteArray(data, 0, data.length));
356 }
357 item.putInt("id", cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID));
358 intent.putExtra("bookmark", item);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800359 startActivityForResult(intent, BOOKMARKS_SAVE);
360 }
361
362 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500363 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800364 switch(requestCode) {
365 case BOOKMARKS_SAVE:
366 if (resultCode == RESULT_OK) {
367 Bundle extras;
368 if (data != null && (extras = data.getExtras()) != null) {
369 // If there are extras, then we need to save
370 // the edited bookmark. This is done in updateRow()
371 String title = extras.getString("title");
372 String url = extras.getString("url");
373 if (title != null && url != null) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500374 updateRow(extras);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800375 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800376 }
377 }
378 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800379 }
380 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700381
Jeff Hamilton84029622010-08-05 14:29:28 -0500382 /**
383 * Update a row in the database with new information.
384 * Requeries the database if the information has changed.
385 * @param map Bundle storing id, title and url of new information
386 */
387 public void updateRow(Bundle map) {
388
389 // Find the record
390 int id = map.getInt("id");
391 int position = -1;
392 Cursor cursor = mAdapter.getCursor();
393 for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
394 if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID) == id) {
395 position = cursor.getPosition();
396 break;
397 }
398 }
399 if (position < 0) {
400 return;
401 }
402
403 cursor.moveToPosition(position);
404 ContentValues values = new ContentValues();
405 String title = map.getString(Browser.BookmarkColumns.TITLE);
406 if (!title.equals(cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX))) {
407 values.put(Browser.BookmarkColumns.TITLE, title);
408 }
409 String url = map.getString(Browser.BookmarkColumns.URL);
410 if (!url.equals(cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX))) {
411 values.put(Browser.BookmarkColumns.URL, url);
412 }
413
414 if (map.getBoolean("invalidateThumbnail") == true) {
415 values.put(Browser.BookmarkColumns.THUMBNAIL, new byte[0]);
416 }
417
418 if (values.size() > 0) {
419 getContentResolver().update(Browser.BOOKMARKS_URI, values,
420 "_id = ?", new String[] { Integer.toString(id) });
421 }
422 }
423
424 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800425 // Put up a dialog asking if the user really wants to
426 // delete the bookmark
Jeff Hamilton84029622010-08-05 14:29:28 -0500427 Cursor cursor = (Cursor) mAdapter.getItem(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800428 new AlertDialog.Builder(this)
429 .setTitle(R.string.delete_bookmark)
430 .setIcon(android.R.drawable.ic_dialog_alert)
431 .setMessage(getText(R.string.delete_bookmark_warning).toString().replace(
Jeff Hamilton84029622010-08-05 14:29:28 -0500432 "%s", cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700433 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800434 new DialogInterface.OnClickListener() {
435 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500436 deleteBookmark(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800437 }
438 })
439 .setNegativeButton(R.string.cancel, null)
440 .show();
441 }
442
Jeff Hamilton84029622010-08-05 14:29:28 -0500443 private String getUrl(int position) {
444 Cursor cursor = (Cursor) mAdapter.getItem(position);
445 return cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800446 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500447
The Android Open Source Project0c908882009-03-03 19:32:16 -0800448 private void copy(CharSequence text) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500449 ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
450 cm.setPrimaryClip(new ClippedData(null, null, new ClippedData.Item(text)));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800451 }
452
453 /**
454 * Delete the currently highlighted row.
455 */
456 public void deleteBookmark(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500457 Cursor cursor = (Cursor) mAdapter.getItem(position);
458 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
459 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
460 Bookmarks.removeFromBookmarks(null, getContentResolver(), url, title);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800461 }
Grace Kloba5942df02009-09-18 11:48:29 -0700462
463 @Override
464 public void onBackPressed() {
465 setResultToParent(RESULT_CANCELED, null);
466 mCanceled = true;
467 super.onBackPressed();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800468 }
469
Leon Scrogginsfde97462010-01-11 13:06:21 -0500470 // This Activity is generally a sub-Activity of
471 // CombinedBookmarkHistoryActivity. In that situation, we need to pass our
472 // result code up to our parent. However, if someone calls this Activity
473 // directly, then this has no parent, and it needs to set it on itself.
The Android Open Source Project0c908882009-03-03 19:32:16 -0800474 private void setResultToParent(int resultCode, Intent data) {
Leon Scrogginsfde97462010-01-11 13:06:21 -0500475 Activity parent = getParent();
476 if (parent == null) {
477 setResult(resultCode, data);
478 } else {
479 ((CombinedBookmarkHistoryActivity) parent).setResultFromChild(
480 resultCode, data);
481 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800482 }
Michael Kolbfe251992010-07-08 15:41:55 -0700483
The Android Open Source Project0c908882009-03-03 19:32:16 -0800484}