blob: 91785d5e62d2e7b1206f2d9476560140b10d42f6 [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 Hamilton84029622010-08-05 14:29:28 -050025import android.content.ContentUris;
26import android.content.ContentValues;
Dianne Hackborn80f32622010-08-05 14:17:53 -070027import android.content.Context;
The Android Open Source Project0c908882009-03-03 19:32:16 -080028import android.content.DialogInterface;
29import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050030import android.content.Loader;
31import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080032import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050033import android.graphics.BitmapFactory;
34import android.net.Uri;
The Android Open Source Project0c908882009-03-03 19:32:16 -080035import android.os.Bundle;
The Android Open Source Project0c908882009-03-03 19:32:16 -080036import android.provider.Browser;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050037import android.provider.BrowserContract;
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;
Jeff Hamilton64144e42010-08-18 16:31:59 -050041import android.view.LayoutInflater;
The Android Open Source Project0c908882009-03-03 19:32:16 -080042import android.view.MenuInflater;
43import android.view.MenuItem;
44import android.view.View;
Jeff Hamilton84029622010-08-05 14:29:28 -050045import android.view.View.OnClickListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080046import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050047import android.webkit.WebIconDatabase.IconListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080048import android.widget.AdapterView;
Michael Kolbfe251992010-07-08 15:41:55 -070049import android.widget.AdapterView.OnItemClickListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050050import android.widget.Button;
51import android.widget.GridView;
52import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080053
Jeff Hamilton84029622010-08-05 14:29:28 -050054import java.util.Stack;
55
The Android Open Source Project0c908882009-03-03 19:32:16 -080056/**
57 * View showing the user's bookmarks in the browser.
58 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050059public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
Jeff Hamilton84029622010-08-05 14:29:28 -050060 LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener, OnClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080061
Jeff Hamilton84029622010-08-05 14:29:28 -050062 static final int BOOKMARKS_SAVE = 1;
63 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070064
Jeff Hamilton84029622010-08-05 14:29:28 -050065 static final int LOADER_BOOKMARKS = 1;
66
Michael Kolb801ecb72010-08-25 12:57:38 -070067 static final String EXTRA_SHORTCUT = "create_shortcut";
68 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
69
Jeff Hamilton64144e42010-08-18 16:31:59 -050070 BookmarksHistoryCallbacks mCallbacks;
Jeff Hamilton84029622010-08-05 14:29:28 -050071 GridView mGrid;
72 BrowserBookmarksAdapter mAdapter;
73 boolean mDisableNewWindow;
74 BookmarkItem mContextHeader;
75 boolean mCanceled = false;
76 boolean mCreateShortcut;
77 View mEmptyView;
78 View mContentView;
79 Stack<Pair<String, Uri>> mFolderStack = new Stack<Pair<String, Uri>>();
80 Button mUpButton;
81
82 @Override
83 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
84 switch (id) {
85 case LOADER_BOOKMARKS: {
86 int rootFolder = 0;
87 if (args != null) {
88 args.getInt(BookmarksLoader.ARG_ROOT_FOLDER, 0);
89 }
Jeff Hamilton64144e42010-08-18 16:31:59 -050090 return new BookmarksLoader(getActivity(), rootFolder);
Jeff Hamilton84029622010-08-05 14:29:28 -050091 }
92 }
93 throw new UnsupportedOperationException("Unknown loader id " + id);
94 }
95
96 @Override
97 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
98 // Set the visibility of the empty vs. content views
99 if (data == null || data.getCount() == 0) {
100 mEmptyView.setVisibility(View.VISIBLE);
101 mContentView.setVisibility(View.GONE);
102 } else {
103 mEmptyView.setVisibility(View.GONE);
104 mContentView.setVisibility(View.VISIBLE);
105 }
106
107 // Fill in the "up" button if needed
108 BookmarksLoader bl = (BookmarksLoader) loader;
Michael Kolb801ecb72010-08-25 12:57:38 -0700109 boolean rootFolder =
Jeff Hamilton84029622010-08-05 14:29:28 -0500110 (BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER.equals(bl.getUri()));
111 if (rootFolder) {
112 mUpButton.setText(R.string.defaultBookmarksUpButton);
113 mUpButton.setEnabled(false);
114 } else {
115 mUpButton.setText(mFolderStack.peek().first);
116 mUpButton.setEnabled(true);
117 }
118
119 // Give the new data to the adapter
120 mAdapter.changeCursor(data);
121 }
122
123 @Override
124 public void onClick(View view) {
125 if (view == mUpButton) {
126 Pair<String, Uri> pair = mFolderStack.pop();
Michael Kolb801ecb72010-08-25 12:57:38 -0700127 BookmarksLoader loader =
Jeff Hamilton84029622010-08-05 14:29:28 -0500128 (BookmarksLoader) ((Loader) getLoaderManager().getLoader(LOADER_BOOKMARKS));
129 loader.setUri(pair.second);
130 loader.forceLoad();
131 }
132 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800133
134 @Override
135 public boolean onContextItemSelected(MenuItem item) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500136 final Activity activity = getActivity();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800137 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700138 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800139 if (mCanceled) {
140 return true;
141 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700142 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800143 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
144 // If we have no menu info, we can't tell which item was selected.
145 if (i == null) {
146 return true;
147 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700148
The Android Open Source Project0c908882009-03-03 19:32:16 -0800149 switch (item.getItemId()) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800150 case R.id.open_context_menu_id:
151 loadUrl(i.position);
152 break;
153 case R.id.edit_context_menu_id:
154 editBookmark(i.position);
155 break;
156 case R.id.shortcut_context_menu_id:
Jeff Hamilton64144e42010-08-18 16:31:59 -0500157 activity.sendBroadcast(createShortcutIntent(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800158 break;
159 case R.id.delete_context_menu_id:
Jeff Hamilton84029622010-08-05 14:29:28 -0500160 displayRemoveBookmarkDialog(i.position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800161 break;
162 case R.id.new_window_context_menu_id:
163 openInNewWindow(i.position);
164 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500165 case R.id.share_link_context_menu_id: {
166 Cursor cursor = (Cursor) mAdapter.getItem(i.position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500167 BrowserActivity.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500168 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
169 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
170 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
171 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800172 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500173 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800174 case R.id.copy_url_context_menu_id:
175 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400176 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500177 case R.id.homepage_context_menu_id: {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500178 BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
179 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400180 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500181 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400182 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500183 case R.id.save_to_bookmarks_menu_id: {
184 Cursor cursor = (Cursor) mAdapter.getItem(i.position);
185 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
186 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400187 // If the site is bookmarked, the item becomes remove from
188 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500189 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400190 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500191 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800192 default:
193 return super.onContextItemSelected(item);
194 }
195 return true;
196 }
197
Jeff Hamilton84029622010-08-05 14:29:28 -0500198 Bitmap getBitmap(Cursor cursor, int columnIndex) {
199 byte[] data = cursor.getBlob(columnIndex);
200 if (data == null) {
201 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800202 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500203 return BitmapFactory.decodeByteArray(data, 0, data.length);
204 }
205
206 @Override
207 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
208 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
Michael Kolb801ecb72010-08-25 12:57:38 -0700209
Jeff Hamilton64144e42010-08-18 16:31:59 -0500210 final Activity activity = getActivity();
211 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500212 inflater.inflate(R.menu.bookmarkscontext, menu);
213
214 if (mDisableNewWindow) {
215 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
216 }
217
218 if (mContextHeader == null) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500219 mContextHeader = new BookmarkItem(activity);
Jeff Hamilton84029622010-08-05 14:29:28 -0500220 } else if (mContextHeader.getParent() != null) {
221 ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
222 }
223
224 populateBookmarkItem(mAdapter, mContextHeader, info.position);
225
226 menu.setHeaderView(mContextHeader);
227 }
228
229 private void populateBookmarkItem(BrowserBookmarksAdapter adapter, BookmarkItem item,
230 int position) {
231 Cursor cursor = (Cursor) mAdapter.getItem(position);
232 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
233 item.setUrl(url);
234 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
235 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
236 if (bitmap == null) {
237 bitmap = CombinedBookmarkHistoryActivity.getIconListenerSet().getFavicon(url);
238 }
239 item.setFavicon(bitmap);
240 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800241
242 /**
243 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700244 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800245 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500246 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800247 super.onCreate(icicle);
248
Jeff Hamilton64144e42010-08-18 16:31:59 -0500249 Bundle args = getArguments();
250 mCreateShortcut = args == null ? false : args.getBoolean("create_shortcut", false);
251 mDisableNewWindow = args == null ? false : args.getBoolean("disable_new_window", false);
252 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400253
Jeff Hamilton64144e42010-08-18 16:31:59 -0500254 @Override
255 public void onAttach(Activity activity) {
256 super.onAttach(activity);
257 mCallbacks = (BookmarksHistoryCallbacks) activity;
258 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700259
Jeff Hamilton64144e42010-08-18 16:31:59 -0500260 @Override
261 public View onCreateView(LayoutInflater inflater, ViewGroup container,
262 Bundle savedInstanceState) {
263 View root = inflater.inflate(R.layout.bookmarks, container, false);
264 mEmptyView = root.findViewById(android.R.id.empty);
265 mContentView = root.findViewById(android.R.id.content);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400266
Jeff Hamilton64144e42010-08-18 16:31:59 -0500267 mGrid = (GridView) root.findViewById(R.id.grid);
Jeff Hamilton84029622010-08-05 14:29:28 -0500268 mGrid.setOnItemClickListener(this);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500269 mGrid.setColumnWidth(BrowserActivity.getDesiredThumbnailWidth(getActivity()));
Jeff Hamilton84029622010-08-05 14:29:28 -0500270 if (!mCreateShortcut) {
271 mGrid.setOnCreateContextMenuListener(this);
Ben Murdoch328ea872009-09-16 13:33:29 +0100272 }
Patrick Scottf49ecd62010-04-09 12:43:26 -0400273
Jeff Hamilton64144e42010-08-18 16:31:59 -0500274 mUpButton = (Button) root.findViewById(R.id.up);
Jeff Hamilton84029622010-08-05 14:29:28 -0500275 mUpButton.setEnabled(false);
276 mUpButton.setOnClickListener(this);
277
Jeff Hamilton64144e42010-08-18 16:31:59 -0500278 mAdapter = new BrowserBookmarksAdapter(getActivity());
Jeff Hamilton84029622010-08-05 14:29:28 -0500279 mGrid.setAdapter(mAdapter);
280
281 // Start the loader for the bookmark data
282 getLoaderManager().initLoader(LOADER_BOOKMARKS, null, this);
283
284 // Add our own listener in case there are favicons that have yet to be loaded.
285 CombinedBookmarkHistoryActivity.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800286
Jeff Hamilton64144e42010-08-18 16:31:59 -0500287 return root;
288 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700289
Nicolas Catania095292f2010-03-15 09:00:14 -0700290 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500291 public void onReceivedIcon(String url, Bitmap icon) {
292 // A new favicon has been loaded, so let anything attached to the adapter know about it
293 // so new icons will be loaded.
294 mAdapter.notifyDataSetChanged();
Nicolas Catania095292f2010-03-15 09:00:14 -0700295 }
296
Jeff Hamilton84029622010-08-05 14:29:28 -0500297 @Override
298 public void onItemClick(AdapterView parent, View v, int position, long id) {
299 // It is possible that the view has been canceled when we get to
300 // this point as back has a higher priority
301 if (mCanceled) {
302 android.util.Log.e(LOGTAG, "item clicked when dismissing");
303 return;
304 }
305 if (mCreateShortcut) {
Michael Kolb801ecb72010-08-25 12:57:38 -0700306 Intent intent = createShortcutIntent(position);
307 // the activity handles the intent in startActivityFromFragment
308 startActivity(intent);
Ben Murdoch328ea872009-09-16 13:33:29 +0100309 return;
310 }
311
Jeff Hamilton84029622010-08-05 14:29:28 -0500312 Cursor cursor = (Cursor) mAdapter.getItem(position);
313 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
314 if (!isFolder) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500315 mCallbacks.onUrlSelected(getUrl(position), false);
Leon Scroggins892df312009-07-14 14:48:02 -0400316 } else {
Jeff Hamilton84029622010-08-05 14:29:28 -0500317 String title;
318 if (mFolderStack.size() != 0) {
319 title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
320 } else {
321 // TODO localize
Michael Kolb801ecb72010-08-25 12:57:38 -0700322 title = "Bookmarks";
Leon Scroggins892df312009-07-14 14:48:02 -0400323 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500324 LoaderManager manager = getLoaderManager();
Michael Kolb801ecb72010-08-25 12:57:38 -0700325 BookmarksLoader loader =
Jeff Hamilton84029622010-08-05 14:29:28 -0500326 (BookmarksLoader) ((Loader) manager.getLoader(LOADER_BOOKMARKS));
327 mFolderStack.push(new Pair(title, loader.getUri()));
328 Uri uri = ContentUris.withAppendedId(
329 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
330 loader.setUri(uri);
331 loader.forceLoad();
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400332 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800333 }
334
Patrick Scott3918d442009-08-04 13:22:29 -0400335 private Intent createShortcutIntent(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500336 Cursor cursor = (Cursor) mAdapter.getItem(position);
337 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
338 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
339 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
340 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500341 return BookmarkUtils.createAddToHomeIntent(getActivity(), url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800342 }
343
The Android Open Source Project0c908882009-03-03 19:32:16 -0800344 private void loadUrl(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500345 mCallbacks.onUrlSelected(getUrl(position), false);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800346 }
347
The Android Open Source Project0c908882009-03-03 19:32:16 -0800348 private void openInNewWindow(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500349 mCallbacks.onUrlSelected(getUrl(position), true);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800350 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700351
The Android Open Source Project0c908882009-03-03 19:32:16 -0800352 private void editBookmark(int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500353 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
Jeff Hamilton84029622010-08-05 14:29:28 -0500354 Cursor cursor = (Cursor) mAdapter.getItem(position);
355 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700356 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500357 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700358 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500359 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
360 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
361 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700362 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500363 BitmapFactory.decodeByteArray(data, 0, data.length));
364 }
365 item.putInt("id", cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID));
366 intent.putExtra("bookmark", item);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800367 startActivityForResult(intent, BOOKMARKS_SAVE);
368 }
369
370 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500371 public void onActivityResult(int requestCode, int resultCode, Intent data) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800372 switch(requestCode) {
373 case BOOKMARKS_SAVE:
Jeff Hamilton64144e42010-08-18 16:31:59 -0500374 if (resultCode == Activity.RESULT_OK) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800375 Bundle extras;
376 if (data != null && (extras = data.getExtras()) != null) {
377 // If there are extras, then we need to save
378 // the edited bookmark. This is done in updateRow()
379 String title = extras.getString("title");
380 String url = extras.getString("url");
381 if (title != null && url != null) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500382 updateRow(extras);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800383 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800384 }
385 }
386 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800387 }
388 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700389
Jeff Hamilton84029622010-08-05 14:29:28 -0500390 /**
Michael Kolb801ecb72010-08-25 12:57:38 -0700391 * Update a row in the database with new information.
Jeff Hamilton84029622010-08-05 14:29:28 -0500392 * Requeries the database if the information has changed.
393 * @param map Bundle storing id, title and url of new information
394 */
395 public void updateRow(Bundle map) {
396
397 // Find the record
Michael Kolbbef7a752010-08-25 17:11:35 -0700398 int id = map.getInt("id");
Jeff Hamilton84029622010-08-05 14:29:28 -0500399 int position = -1;
400 Cursor cursor = mAdapter.getCursor();
401 for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
402 if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_ID) == id) {
403 position = cursor.getPosition();
404 break;
405 }
406 }
407 if (position < 0) {
408 return;
409 }
410
411 cursor.moveToPosition(position);
412 ContentValues values = new ContentValues();
Michael Kolbbef7a752010-08-25 17:11:35 -0700413 String title = map.getString(BrowserContract.Bookmarks.TITLE);
414 if (!title.equals(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE))) {
415 values.put(BrowserContract.Bookmarks.TITLE, title);
Jeff Hamilton84029622010-08-05 14:29:28 -0500416 }
Michael Kolbbef7a752010-08-25 17:11:35 -0700417 String url = map.getString(BrowserContract.Bookmarks.URL);
418 if (!url.equals(cursor.getString(BookmarksLoader.COLUMN_INDEX_URL))) {
419 values.put(BrowserContract.Bookmarks.URL, url);
Jeff Hamilton84029622010-08-05 14:29:28 -0500420 }
421
422 if (map.getBoolean("invalidateThumbnail") == true) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700423 values.putNull(BrowserContract.Bookmarks.THUMBNAIL);
Jeff Hamilton84029622010-08-05 14:29:28 -0500424 }
425
426 if (values.size() > 0) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500427 getActivity().getContentResolver().update(
Jeff Hamilton8ce956c2010-08-17 11:13:53 -0500428 ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI, id),
429 values, null, null);
Jeff Hamilton84029622010-08-05 14:29:28 -0500430 }
Michael Kolbbef7a752010-08-25 17:11:35 -0700431 updateView();
Jeff Hamilton84029622010-08-05 14:29:28 -0500432 }
433
434 private void displayRemoveBookmarkDialog(final int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800435 // Put up a dialog asking if the user really wants to
436 // delete the bookmark
Jeff Hamilton84029622010-08-05 14:29:28 -0500437 Cursor cursor = (Cursor) mAdapter.getItem(position);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500438 Context context = getActivity();
439 new AlertDialog.Builder(context)
The Android Open Source Project0c908882009-03-03 19:32:16 -0800440 .setTitle(R.string.delete_bookmark)
441 .setIcon(android.R.drawable.ic_dialog_alert)
Jeff Hamilton64144e42010-08-18 16:31:59 -0500442 .setMessage(context.getText(R.string.delete_bookmark_warning).toString().replace(
Jeff Hamilton84029622010-08-05 14:29:28 -0500443 "%s", cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700444 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800445 new DialogInterface.OnClickListener() {
446 public void onClick(DialogInterface dialog, int whichButton) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500447 deleteBookmark(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800448 }
449 })
450 .setNegativeButton(R.string.cancel, null)
451 .show();
452 }
453
Jeff Hamilton84029622010-08-05 14:29:28 -0500454 private String getUrl(int position) {
455 Cursor cursor = (Cursor) mAdapter.getItem(position);
456 return cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800457 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700458
The Android Open Source Project0c908882009-03-03 19:32:16 -0800459 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500460 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
461 Context.CLIPBOARD_SERVICE);
Dianne Hackborneb07b172010-08-26 22:18:14 -0700462 cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800463 }
464
465 /**
466 * Delete the currently highlighted row.
467 */
468 public void deleteBookmark(int position) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500469 Cursor cursor = (Cursor) mAdapter.getItem(position);
470 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
471 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500472 Bookmarks.removeFromBookmarks(null, getActivity().getContentResolver(), url, title);
Michael Kolbbef7a752010-08-25 17:11:35 -0700473 updateView();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800474 }
Michael Kolbbef7a752010-08-25 17:11:35 -0700475
476 private void updateView() {
477 BookmarksLoader loader =
478 (BookmarksLoader) (Loader)(getLoaderManager().getLoader(LOADER_BOOKMARKS));
479 loader.forceLoad();
480 }
481
The Android Open Source Project0c908882009-03-03 19:32:16 -0800482}