blob: 320c43825cdc8e32b928cc144a5fdb3241ec9ce9 [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;
21import android.content.DialogInterface;
22import android.content.Intent;
Ben Murdoch328ea872009-09-16 13:33:29 +010023import android.content.SharedPreferences;
24import android.content.SharedPreferences.Editor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080025import android.graphics.Bitmap;
Patrick Scotte09761e2009-03-24 20:43:37 -070026import android.graphics.BitmapFactory;
27import android.graphics.Canvas;
28import android.graphics.Color;
29import android.graphics.Paint;
Patrick Scott3918d442009-08-04 13:22:29 -040030import android.graphics.Path;
31import android.graphics.PorterDuff;
32import android.graphics.PorterDuffXfermode;
Patrick Scottc0fdde92010-02-25 14:40:11 -050033import android.graphics.Rect;
Patrick Scotte09761e2009-03-24 20:43:37 -070034import android.graphics.RectF;
The Android Open Source Project0c908882009-03-03 19:32:16 -080035import android.net.Uri;
Patrick Scottf49ecd62010-04-09 12:43:26 -040036import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080037import android.os.Bundle;
38import android.os.Handler;
39import android.os.Message;
40import android.os.ServiceManager;
41import android.provider.Browser;
42import android.text.IClipboard;
43import android.util.Log;
44import android.view.ContextMenu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080045import android.view.Menu;
46import android.view.MenuInflater;
47import android.view.MenuItem;
48import android.view.View;
49import android.view.ViewGroup;
50import android.view.ContextMenu.ContextMenuInfo;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050051import android.webkit.WebIconDatabase.IconListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080052import android.widget.AdapterView;
Leon Scroggins89c6d362009-07-15 16:54:37 -040053import android.widget.GridView;
The Android Open Source Project0c908882009-03-03 19:32:16 -080054import android.widget.ListView;
Leon Scrogginsfeb941d2009-05-28 17:27:38 -040055import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080056
Ben Murdoch328ea872009-09-16 13:33:29 +010057/*package*/ enum BookmarkViewMode { NONE, GRID, LIST }
The Android Open Source Project0c908882009-03-03 19:32:16 -080058/**
59 * View showing the user's bookmarks in the browser.
60 */
Nicolas Catania095292f2010-03-15 09:00:14 -070061public class BrowserBookmarksPage extends Activity implements
The Android Open Source Project0c908882009-03-03 19:32:16 -080062 View.OnCreateContextMenuListener {
63
Ben Murdoch328ea872009-09-16 13:33:29 +010064 private BookmarkViewMode mViewMode = BookmarkViewMode.NONE;
Leon Scroggins89c6d362009-07-15 16:54:37 -040065 private GridView mGridPage;
Leon Scrogginsea002572009-11-24 15:21:18 -050066 private ListView mVerticalList;
The Android Open Source Project0c908882009-03-03 19:32:16 -080067 private BrowserBookmarksAdapter mBookmarksAdapter;
68 private static final int BOOKMARKS_SAVE = 1;
Leon Scroggins190095d2009-08-17 17:01:38 -040069 private boolean mDisableNewWindow;
The Android Open Source Project0c908882009-03-03 19:32:16 -080070 private BookmarkItem mContextHeader;
71 private AddNewBookmark mAddHeader;
72 private boolean mCanceled = false;
73 private boolean mCreateShortcut;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -040074 private boolean mMostVisited;
75 private View mEmptyView;
Patrick Scott152794b2010-03-30 13:57:29 -040076 private int mIconSize;
Nicolas Catania095292f2010-03-15 09:00:14 -070077
The Android Open Source Project0c908882009-03-03 19:32:16 -080078 private final static String LOGTAG = "browser";
Ben Murdoch328ea872009-09-16 13:33:29 +010079 private final static String PREF_BOOKMARK_VIEW_MODE = "pref_bookmark_view_mode";
80 private final static String PREF_MOST_VISITED_VIEW_MODE = "pref_most_visited_view_mode";
The Android Open Source Project0c908882009-03-03 19:32:16 -080081
82 @Override
83 public boolean onContextItemSelected(MenuItem item) {
84 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -070085 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -080086 if (mCanceled) {
87 return true;
88 }
Nicolas Catania095292f2010-03-15 09:00:14 -070089 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -080090 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
91 // If we have no menu info, we can't tell which item was selected.
92 if (i == null) {
93 return true;
94 }
Nicolas Catania095292f2010-03-15 09:00:14 -070095
The Android Open Source Project0c908882009-03-03 19:32:16 -080096 switch (item.getItemId()) {
97 case R.id.new_context_menu_id:
98 saveCurrentPage();
99 break;
100 case R.id.open_context_menu_id:
101 loadUrl(i.position);
102 break;
103 case R.id.edit_context_menu_id:
104 editBookmark(i.position);
105 break;
106 case R.id.shortcut_context_menu_id:
Ben Murdoch90b40262010-06-30 13:33:28 +0100107 sendBroadcast(createShortcutIntent(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800108 break;
109 case R.id.delete_context_menu_id:
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400110 if (mMostVisited) {
111 Browser.deleteFromHistory(getContentResolver(),
112 getUrl(i.position));
113 refreshList();
114 } else {
115 displayRemoveBookmarkDialog(i.position);
116 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800117 break;
118 case R.id.new_window_context_menu_id:
119 openInNewWindow(i.position);
120 break;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400121 case R.id.share_link_context_menu_id:
Leon Scroggins96afcb12009-12-10 12:35:56 -0500122 BrowserActivity.sharePage(BrowserBookmarksPage.this,
123 mBookmarksAdapter.getTitle(i.position), getUrl(i.position),
124 getFavicon(i.position),
125 mBookmarksAdapter.getScreenshot(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800126 break;
127 case R.id.copy_url_context_menu_id:
128 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400129 break;
130 case R.id.homepage_context_menu_id:
131 BrowserSettings.getInstance().setHomePage(this,
132 getUrl(i.position));
133 Toast.makeText(this, R.string.homepage_set,
134 Toast.LENGTH_LONG).show();
135 break;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400136 // Only for the Most visited page
137 case R.id.save_to_bookmarks_menu_id:
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400138 boolean isBookmark;
139 String name;
140 String url;
Ben Murdoch328ea872009-09-16 13:33:29 +0100141 if (mViewMode == BookmarkViewMode.GRID) {
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400142 isBookmark = mBookmarksAdapter.getIsBookmark(i.position);
143 name = mBookmarksAdapter.getTitle(i.position);
144 url = mBookmarksAdapter.getUrl(i.position);
145 } else {
146 HistoryItem historyItem = ((HistoryItem) i.targetView);
147 isBookmark = historyItem.isBookmark();
148 name = historyItem.getName();
149 url = historyItem.getUrl();
150 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400151 // If the site is bookmarked, the item becomes remove from
152 // bookmarks.
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400153 if (isBookmark) {
Andrei Popescuc9526192009-09-23 15:52:16 +0100154 Bookmarks.removeFromBookmarks(this, getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400155 } else {
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400156 Browser.saveBookmark(this, name, url);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400157 }
158 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800159 default:
160 return super.onContextItemSelected(item);
161 }
162 return true;
163 }
164
165 @Override
166 public void onCreateContextMenu(ContextMenu menu, View v,
167 ContextMenuInfo menuInfo) {
Nicolas Catania095292f2010-03-15 09:00:14 -0700168 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800169 (AdapterView.AdapterContextMenuInfo) menuInfo;
170
171 MenuInflater inflater = getMenuInflater();
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400172 if (mMostVisited) {
173 inflater.inflate(R.menu.historycontext, menu);
174 } else {
175 inflater.inflate(R.menu.bookmarkscontext, menu);
176 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800177
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400178 if (0 == i.position && !mMostVisited) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800179 menu.setGroupVisible(R.id.CONTEXT_MENU, false);
180 if (mAddHeader == null) {
181 mAddHeader = new AddNewBookmark(BrowserBookmarksPage.this);
182 } else if (mAddHeader.getParent() != null) {
183 ((ViewGroup) mAddHeader.getParent()).
184 removeView(mAddHeader);
185 }
Leon Scroggins892df312009-07-14 14:48:02 -0400186 mAddHeader.setUrl(getIntent().getStringExtra("url"));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800187 menu.setHeaderView(mAddHeader);
188 return;
189 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400190 if (mMostVisited) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100191 if ((mViewMode == BookmarkViewMode.LIST
192 && ((HistoryItem) i.targetView).isBookmark())
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400193 || mBookmarksAdapter.getIsBookmark(i.position)) {
194 MenuItem item = menu.findItem(
195 R.id.save_to_bookmarks_menu_id);
196 item.setTitle(R.string.remove_from_bookmarks);
197 }
198 } else {
199 // The historycontext menu has no ADD_MENU group.
200 menu.setGroupVisible(R.id.ADD_MENU, false);
201 }
Leon Scroggins190095d2009-08-17 17:01:38 -0400202 if (mDisableNewWindow) {
Leon Scroggins892df312009-07-14 14:48:02 -0400203 menu.findItem(R.id.new_window_context_menu_id).setVisible(
204 false);
205 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800206 if (mContextHeader == null) {
207 mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
208 } else if (mContextHeader.getParent() != null) {
209 ((ViewGroup) mContextHeader.getParent()).
210 removeView(mContextHeader);
211 }
Ben Murdoch328ea872009-09-16 13:33:29 +0100212 if (mViewMode == BookmarkViewMode.GRID) {
Leon Scroggins892df312009-07-14 14:48:02 -0400213 mBookmarksAdapter.populateBookmarkItem(mContextHeader,
214 i.position);
215 } else {
216 BookmarkItem b = (BookmarkItem) i.targetView;
217 b.copyTo(mContextHeader);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800218 }
Leon Scroggins892df312009-07-14 14:48:02 -0400219 menu.setHeaderView(mContextHeader);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800220 }
221
222 /**
223 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700224 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800225 @Override
226 protected void onCreate(Bundle icicle) {
227 super.onCreate(icicle);
228
Patrick Scott152794b2010-03-30 13:57:29 -0400229 // Grab the app icon size as a resource.
230 mIconSize = getResources().getDimensionPixelSize(
231 android.R.dimen.app_icon_size);
232
Patrick Scottf49ecd62010-04-09 12:43:26 -0400233 Intent intent = getIntent();
234 if (Intent.ACTION_CREATE_SHORTCUT.equals(intent.getAction())) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800235 mCreateShortcut = true;
236 }
Patrick Scottf49ecd62010-04-09 12:43:26 -0400237 mDisableNewWindow = intent.getBooleanExtra("disable_new_window",
Leon Scroggins190095d2009-08-17 17:01:38 -0400238 false);
Patrick Scottf49ecd62010-04-09 12:43:26 -0400239 mMostVisited = intent.getBooleanExtra("mostVisited", false);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800240
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400241 if (mCreateShortcut) {
242 setTitle(R.string.browser_bookmarks_page_bookmarks_text);
243 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400244
245 setContentView(R.layout.empty_history);
246 mEmptyView = findViewById(R.id.empty_view);
247 mEmptyView.setVisibility(View.GONE);
248
Ben Murdoch328ea872009-09-16 13:33:29 +0100249 SharedPreferences p = getPreferences(MODE_PRIVATE);
250
251 // See if the user has set a preference for the view mode of their
252 // bookmarks. Otherwise default to grid mode.
253 BookmarkViewMode preference = BookmarkViewMode.NONE;
254 if (mMostVisited) {
Leon Scrogginsb3968bb2009-10-16 09:04:16 -0400255 // For the most visited page, only use list mode.
256 preference = BookmarkViewMode.LIST;
Ben Murdoch328ea872009-09-16 13:33:29 +0100257 } else {
258 preference = BookmarkViewMode.values()[p.getInt(
259 PREF_BOOKMARK_VIEW_MODE, BookmarkViewMode.GRID.ordinal())];
260 }
261 switchViewMode(preference);
Patrick Scottf49ecd62010-04-09 12:43:26 -0400262
263 final boolean createShortcut = mCreateShortcut;
264 final boolean mostVisited = mMostVisited;
265 final String url = intent.getStringExtra("url");
266 final String title = intent.getStringExtra("title");
267 final Bitmap thumbnail =
268 (Bitmap) intent.getParcelableExtra("thumbnail");
269 new AsyncTask<Void, Void, Void>() {
270 @Override
271 protected Void doInBackground(Void... unused) {
272 BrowserBookmarksAdapter adapter = new BrowserBookmarksAdapter(
273 BrowserBookmarksPage.this,
274 url,
275 title,
276 thumbnail,
277 createShortcut,
278 mostVisited);
279 mHandler.obtainMessage(ADAPTER_CREATED, adapter).sendToTarget();
280 return null;
281 }
282 }.execute();
Leon Scroggins892df312009-07-14 14:48:02 -0400283 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800284
Nicolas Catania095292f2010-03-15 09:00:14 -0700285 @Override
286 protected void onDestroy() {
287 mHandler.removeCallbacksAndMessages(null);
288 super.onDestroy();
289 }
290
Leon Scroggins892df312009-07-14 14:48:02 -0400291 /**
292 * Set the ContentView to be either the grid of thumbnails or the vertical
Ben Murdoch328ea872009-09-16 13:33:29 +0100293 * list.
Leon Scroggins892df312009-07-14 14:48:02 -0400294 */
Leon Scrogginsea002572009-11-24 15:21:18 -0500295 private void switchViewMode(BookmarkViewMode viewMode) {
296 if (mViewMode == viewMode) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100297 return;
298 }
299
Leon Scrogginsea002572009-11-24 15:21:18 -0500300 mViewMode = viewMode;
Ben Murdoch328ea872009-09-16 13:33:29 +0100301
302 // Update the preferences to make the new view mode sticky.
303 Editor ed = getPreferences(MODE_PRIVATE).edit();
304 if (mMostVisited) {
305 ed.putInt(PREF_MOST_VISITED_VIEW_MODE, mViewMode.ordinal());
306 } else {
307 ed.putInt(PREF_BOOKMARK_VIEW_MODE, mViewMode.ordinal());
308 }
309 ed.commit();
310
Leon Scrogginsea002572009-11-24 15:21:18 -0500311 if (mBookmarksAdapter != null) {
312 mBookmarksAdapter.switchViewMode(viewMode);
313 }
Ben Murdoch328ea872009-09-16 13:33:29 +0100314 if (mViewMode == BookmarkViewMode.GRID) {
Leon Scroggins892df312009-07-14 14:48:02 -0400315 if (mGridPage == null) {
Leon Scroggins89c6d362009-07-15 16:54:37 -0400316 mGridPage = new GridView(this);
Leon Scrogginsea002572009-11-24 15:21:18 -0500317 if (mBookmarksAdapter != null) {
318 mGridPage.setAdapter(mBookmarksAdapter);
319 }
Leon Scroggins892df312009-07-14 14:48:02 -0400320 mGridPage.setOnItemClickListener(mListener);
Leon Scroggins89c6d362009-07-15 16:54:37 -0400321 mGridPage.setNumColumns(GridView.AUTO_FIT);
Leon Scrogginsf8551612009-09-24 16:06:02 -0400322 mGridPage.setColumnWidth(
323 BrowserActivity.getDesiredThumbnailWidth(this));
Leon Scroggins89c6d362009-07-15 16:54:37 -0400324 mGridPage.setFocusable(true);
325 mGridPage.setFocusableInTouchMode(true);
326 mGridPage.setSelector(android.R.drawable.gallery_thumb);
Leon Scrogginsf8551612009-09-24 16:06:02 -0400327 float density = getResources().getDisplayMetrics().density;
328 mGridPage.setVerticalSpacing((int) (14 * density));
329 mGridPage.setHorizontalSpacing((int) (8 * density));
330 mGridPage.setStretchMode(GridView.STRETCH_SPACING);
Leon Scrogginsbbe6d5b2009-09-28 12:01:00 -0400331 mGridPage.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
Leon Scrogginsf8551612009-09-24 16:06:02 -0400332 mGridPage.setDrawSelectorOnTop(true);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400333 if (mMostVisited) {
334 mGridPage.setEmptyView(mEmptyView);
335 }
Leon Scroggins892df312009-07-14 14:48:02 -0400336 if (!mCreateShortcut) {
337 mGridPage.setOnCreateContextMenuListener(this);
338 }
339 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400340 addContentView(mGridPage, FULL_SCREEN_PARAMS);
341 if (mVerticalList != null) {
342 ViewGroup parent = (ViewGroup) mVerticalList.getParent();
343 if (parent != null) {
344 parent.removeView(mVerticalList);
345 }
346 }
Leon Scroggins892df312009-07-14 14:48:02 -0400347 } else {
348 if (null == mVerticalList) {
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400349 ListView listView = new ListView(this);
Leon Scrogginsea002572009-11-24 15:21:18 -0500350 if (mBookmarksAdapter != null) {
351 listView.setAdapter(mBookmarksAdapter);
352 }
Leon Scroggins892df312009-07-14 14:48:02 -0400353 listView.setDrawSelectorOnTop(false);
354 listView.setVerticalScrollBarEnabled(true);
355 listView.setOnItemClickListener(mListener);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400356 if (mMostVisited) {
357 listView.setEmptyView(mEmptyView);
358 }
Leon Scroggins892df312009-07-14 14:48:02 -0400359 if (!mCreateShortcut) {
360 listView.setOnCreateContextMenuListener(this);
361 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400362 mVerticalList = listView;
Leon Scroggins892df312009-07-14 14:48:02 -0400363 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400364 addContentView(mVerticalList, FULL_SCREEN_PARAMS);
365 if (mGridPage != null) {
366 ViewGroup parent = (ViewGroup) mGridPage.getParent();
367 if (parent != null) {
368 parent.removeView(mGridPage);
369 }
370 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400371 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800372 }
373
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400374 private static final ViewGroup.LayoutParams FULL_SCREEN_PARAMS
375 = new ViewGroup.LayoutParams(
Romain Guy15b8ec62010-01-08 15:06:43 -0800376 ViewGroup.LayoutParams.MATCH_PARENT,
377 ViewGroup.LayoutParams.MATCH_PARENT);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400378
The Android Open Source Project0c908882009-03-03 19:32:16 -0800379 private static final int SAVE_CURRENT_PAGE = 1000;
Patrick Scottf49ecd62010-04-09 12:43:26 -0400380 private static final int ADAPTER_CREATED = 1001;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800381 private final Handler mHandler = new Handler() {
382 @Override
383 public void handleMessage(Message msg) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500384 switch (msg.what) {
385 case SAVE_CURRENT_PAGE:
386 saveCurrentPage();
387 break;
Patrick Scottf49ecd62010-04-09 12:43:26 -0400388 case ADAPTER_CREATED:
389 mBookmarksAdapter = (BrowserBookmarksAdapter) msg.obj;
Leon Scrogginsea002572009-11-24 15:21:18 -0500390 mBookmarksAdapter.switchViewMode(mViewMode);
391 if (mGridPage != null) {
392 mGridPage.setAdapter(mBookmarksAdapter);
393 }
394 if (mVerticalList != null) {
395 mVerticalList.setAdapter(mBookmarksAdapter);
396 }
Patrick Scottc1cf63a2010-03-09 16:02:08 -0500397 // Add our own listener in case there are favicons that
398 // have yet to be loaded.
399 if (mMostVisited) {
400 IconListener listener = new IconListener() {
401 public void onReceivedIcon(String url,
402 Bitmap icon) {
403 if (mGridPage != null) {
404 mGridPage.setAdapter(mBookmarksAdapter);
405 }
406 if (mVerticalList != null) {
407 mVerticalList.setAdapter(mBookmarksAdapter);
408 }
409 }
410 };
411 CombinedBookmarkHistoryActivity.getIconListenerSet()
412 .addListener(listener);
413 }
Leon Scrogginsea002572009-11-24 15:21:18 -0500414 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800415 }
416 }
417 };
418
419 private AdapterView.OnItemClickListener mListener = new AdapterView.OnItemClickListener() {
420 public void onItemClick(AdapterView parent, View v, int position, long id) {
421 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700422 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800423 if (mCanceled) {
Leon Scroggins892df312009-07-14 14:48:02 -0400424 android.util.Log.e(LOGTAG, "item clicked when dismissing");
The Android Open Source Project0c908882009-03-03 19:32:16 -0800425 return;
426 }
427 if (!mCreateShortcut) {
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400428 if (0 == position && !mMostVisited) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800429 // XXX: Work-around for a framework issue.
430 mHandler.sendEmptyMessage(SAVE_CURRENT_PAGE);
431 } else {
432 loadUrl(position);
433 }
434 } else {
Ben Murdoch90b40262010-06-30 13:33:28 +0100435 setResultToParent(RESULT_OK, createShortcutIntent(position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800436 finish();
437 }
438 }
439 };
440
Patrick Scott3918d442009-08-04 13:22:29 -0400441 private Intent createShortcutIntent(int position) {
442 String url = getUrl(position);
443 String title = getBookmarkTitle(position);
444 Bitmap touchIcon = getTouchIcon(position);
Ben Murdoch90b40262010-06-30 13:33:28 +0100445 Bitmap favicon = getFavicon(position);
446 return BookmarkUtils.createAddToHomeIntent(this, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800447 }
448
449 private void saveCurrentPage() {
450 Intent i = new Intent(BrowserBookmarksPage.this,
451 AddBookmarkPage.class);
452 i.putExtras(getIntent());
453 startActivityForResult(i, BOOKMARKS_SAVE);
454 }
455
456 private void loadUrl(int position) {
457 Intent intent = (new Intent()).setAction(getUrl(position));
458 setResultToParent(RESULT_OK, intent);
459 finish();
460 }
461
462 @Override
463 public boolean onCreateOptionsMenu(Menu menu) {
464 boolean result = super.onCreateOptionsMenu(menu);
Leon Scrogginsb3968bb2009-10-16 09:04:16 -0400465 if (!mCreateShortcut && !mMostVisited) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800466 MenuInflater inflater = getMenuInflater();
467 inflater.inflate(R.menu.bookmarks, menu);
468 return true;
469 }
470 return result;
471 }
472
473 @Override
Leon Scroggins0c786502009-08-04 16:04:55 -0400474 public boolean onPrepareOptionsMenu(Menu menu) {
Leon Scroggins8382d992009-08-19 11:25:14 -0400475 boolean result = super.onPrepareOptionsMenu(menu);
Leon Scrogginsea002572009-11-24 15:21:18 -0500476 if (mCreateShortcut || mMostVisited || mBookmarksAdapter == null
Leon Scrogginsb3968bb2009-10-16 09:04:16 -0400477 || mBookmarksAdapter.getCount() == 0) {
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400478 // No need to show the menu if there are no items.
Leon Scroggins8382d992009-08-19 11:25:14 -0400479 return result;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400480 }
Leon Scrogginsfdd10d72009-09-25 13:01:45 -0400481 MenuItem switchItem = menu.findItem(R.id.switch_mode_menu_id);
482 int titleResId;
483 int iconResId;
484 if (mViewMode == BookmarkViewMode.GRID) {
485 titleResId = R.string.switch_to_list;
486 iconResId = R.drawable.ic_menu_list;
487 } else {
488 titleResId = R.string.switch_to_thumbnails;
489 iconResId = R.drawable.ic_menu_thumbnail;
490 }
491 switchItem.setTitle(titleResId);
492 switchItem.setIcon(iconResId);
Leon Scroggins0c786502009-08-04 16:04:55 -0400493 return true;
494 }
495
496 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800497 public boolean onOptionsItemSelected(MenuItem item) {
498 switch (item.getItemId()) {
Leon Scroggins892df312009-07-14 14:48:02 -0400499 case R.id.new_context_menu_id:
500 saveCurrentPage();
501 break;
502
503 case R.id.switch_mode_menu_id:
Ben Murdoch328ea872009-09-16 13:33:29 +0100504 if (mViewMode == BookmarkViewMode.GRID) {
505 switchViewMode(BookmarkViewMode.LIST);
506 } else {
507 switchViewMode(BookmarkViewMode.GRID);
508 }
Leon Scroggins892df312009-07-14 14:48:02 -0400509 break;
510
511 default:
512 return super.onOptionsItemSelected(item);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800513 }
514 return true;
515 }
516
517 private void openInNewWindow(int position) {
518 Bundle b = new Bundle();
519 b.putBoolean("new_window", true);
520 setResultToParent(RESULT_OK,
521 (new Intent()).setAction(getUrl(position)).putExtras(b));
522
523 finish();
524 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700525
The Android Open Source Project0c908882009-03-03 19:32:16 -0800526
527 private void editBookmark(int position) {
Nicolas Catania095292f2010-03-15 09:00:14 -0700528 Intent intent = new Intent(BrowserBookmarksPage.this,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800529 AddBookmarkPage.class);
530 intent.putExtra("bookmark", getRow(position));
531 startActivityForResult(intent, BOOKMARKS_SAVE);
532 }
533
534 @Override
535 protected void onActivityResult(int requestCode, int resultCode,
536 Intent data) {
537 switch(requestCode) {
538 case BOOKMARKS_SAVE:
539 if (resultCode == RESULT_OK) {
540 Bundle extras;
541 if (data != null && (extras = data.getExtras()) != null) {
542 // If there are extras, then we need to save
543 // the edited bookmark. This is done in updateRow()
544 String title = extras.getString("title");
545 String url = extras.getString("url");
546 if (title != null && url != null) {
547 mBookmarksAdapter.updateRow(extras);
548 }
549 } else {
550 // extras == null then a new bookmark was added to
551 // the database.
552 refreshList();
553 }
554 }
555 break;
556 default:
557 break;
558 }
559 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700560
The Android Open Source Project0c908882009-03-03 19:32:16 -0800561 private void displayRemoveBookmarkDialog(int position) {
562 // Put up a dialog asking if the user really wants to
563 // delete the bookmark
564 final int deletePos = position;
565 new AlertDialog.Builder(this)
566 .setTitle(R.string.delete_bookmark)
567 .setIcon(android.R.drawable.ic_dialog_alert)
568 .setMessage(getText(R.string.delete_bookmark_warning).toString().replace(
569 "%s", getBookmarkTitle(deletePos)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700570 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800571 new DialogInterface.OnClickListener() {
572 public void onClick(DialogInterface dialog, int whichButton) {
573 deleteBookmark(deletePos);
574 }
575 })
576 .setNegativeButton(R.string.cancel, null)
577 .show();
578 }
579
580 /**
581 * Refresh the shown list after the database has changed.
582 */
Leon Scroggins892df312009-07-14 14:48:02 -0400583 private void refreshList() {
Grace Kloba0b82a6f2010-04-20 13:46:42 -0700584 if (mBookmarksAdapter == null) return;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800585 mBookmarksAdapter.refreshList();
586 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700587
The Android Open Source Project0c908882009-03-03 19:32:16 -0800588 /**
589 * Return a hashmap representing the currently highlighted row.
590 */
591 public Bundle getRow(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500592 return mBookmarksAdapter == null ? null
593 : mBookmarksAdapter.getRow(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800594 }
595
596 /**
597 * Return the url of the currently highlighted row.
598 */
599 public String getUrl(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500600 return mBookmarksAdapter == null ? null
601 : mBookmarksAdapter.getUrl(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800602 }
603
Patrick Scotte09761e2009-03-24 20:43:37 -0700604 /**
605 * Return the favicon of the currently highlighted row.
606 */
607 public Bitmap getFavicon(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500608 return mBookmarksAdapter == null ? null
609 : mBookmarksAdapter.getFavicon(position);
Patrick Scotte09761e2009-03-24 20:43:37 -0700610 }
611
Patrick Scott3918d442009-08-04 13:22:29 -0400612 private Bitmap getTouchIcon(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500613 return mBookmarksAdapter == null ? null
614 : mBookmarksAdapter.getTouchIcon(position);
Patrick Scott3918d442009-08-04 13:22:29 -0400615 }
616
The Android Open Source Project0c908882009-03-03 19:32:16 -0800617 private void copy(CharSequence text) {
618 try {
619 IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard"));
620 if (clip != null) {
621 clip.setClipboardText(text);
622 }
623 } catch (android.os.RemoteException e) {
624 Log.e(LOGTAG, "Copy failed", e);
625 }
626 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700627
The Android Open Source Project0c908882009-03-03 19:32:16 -0800628 public String getBookmarkTitle(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500629 return mBookmarksAdapter == null ? null
630 : mBookmarksAdapter.getTitle(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800631 }
632
633 /**
634 * Delete the currently highlighted row.
635 */
636 public void deleteBookmark(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500637 if (mBookmarksAdapter == null) return;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800638 mBookmarksAdapter.deleteRow(position);
639 }
Grace Kloba5942df02009-09-18 11:48:29 -0700640
641 @Override
642 public void onBackPressed() {
643 setResultToParent(RESULT_CANCELED, null);
644 mCanceled = true;
645 super.onBackPressed();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800646 }
647
Leon Scrogginsfde97462010-01-11 13:06:21 -0500648 // This Activity is generally a sub-Activity of
649 // CombinedBookmarkHistoryActivity. In that situation, we need to pass our
650 // result code up to our parent. However, if someone calls this Activity
651 // directly, then this has no parent, and it needs to set it on itself.
The Android Open Source Project0c908882009-03-03 19:32:16 -0800652 private void setResultToParent(int resultCode, Intent data) {
Leon Scrogginsfde97462010-01-11 13:06:21 -0500653 Activity parent = getParent();
654 if (parent == null) {
655 setResult(resultCode, data);
656 } else {
657 ((CombinedBookmarkHistoryActivity) parent).setResultFromChild(
658 resultCode, data);
659 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800660 }
661}