blob: 4d5c5fa977228025cfa278b4c11906b3d244de11 [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;
Dianne Hackborn80f32622010-08-05 14:17:53 -070021import android.content.ClipboardManager;
22import android.content.Context;
The Android Open Source Project0c908882009-03-03 19:32:16 -080023import android.content.DialogInterface;
24import android.content.Intent;
Ben Murdoch328ea872009-09-16 13:33:29 +010025import android.content.SharedPreferences;
26import android.content.SharedPreferences.Editor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080027import android.graphics.Bitmap;
Patrick Scottf49ecd62010-04-09 12:43:26 -040028import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080029import android.os.Bundle;
30import android.os.Handler;
31import android.os.Message;
32import android.os.ServiceManager;
33import android.provider.Browser;
The Android Open Source Project0c908882009-03-03 19:32:16 -080034import android.util.Log;
35import android.view.ContextMenu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080036import android.view.Menu;
37import android.view.MenuInflater;
38import android.view.MenuItem;
39import android.view.View;
40import android.view.ViewGroup;
41import android.view.ContextMenu.ContextMenuInfo;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050042import android.webkit.WebIconDatabase.IconListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080043import android.widget.AdapterView;
Leon Scroggins89c6d362009-07-15 16:54:37 -040044import android.widget.GridView;
The Android Open Source Project0c908882009-03-03 19:32:16 -080045import android.widget.ListView;
Leon Scrogginsfeb941d2009-05-28 17:27:38 -040046import android.widget.Toast;
Michael Kolbfe251992010-07-08 15:41:55 -070047import android.widget.AdapterView.OnItemClickListener;
The Android Open Source Project0c908882009-03-03 19:32:16 -080048
Ben Murdoch328ea872009-09-16 13:33:29 +010049/*package*/ enum BookmarkViewMode { NONE, GRID, LIST }
The Android Open Source Project0c908882009-03-03 19:32:16 -080050/**
51 * View showing the user's bookmarks in the browser.
52 */
Nicolas Catania095292f2010-03-15 09:00:14 -070053public class BrowserBookmarksPage extends Activity implements
The Android Open Source Project0c908882009-03-03 19:32:16 -080054 View.OnCreateContextMenuListener {
55
Ben Murdoch328ea872009-09-16 13:33:29 +010056 private BookmarkViewMode mViewMode = BookmarkViewMode.NONE;
Leon Scroggins89c6d362009-07-15 16:54:37 -040057 private GridView mGridPage;
Leon Scrogginsea002572009-11-24 15:21:18 -050058 private ListView mVerticalList;
The Android Open Source Project0c908882009-03-03 19:32:16 -080059 private BrowserBookmarksAdapter mBookmarksAdapter;
60 private static final int BOOKMARKS_SAVE = 1;
Leon Scroggins190095d2009-08-17 17:01:38 -040061 private boolean mDisableNewWindow;
The Android Open Source Project0c908882009-03-03 19:32:16 -080062 private BookmarkItem mContextHeader;
63 private AddNewBookmark mAddHeader;
64 private boolean mCanceled = false;
65 private boolean mCreateShortcut;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -040066 private boolean mMostVisited;
67 private View mEmptyView;
Patrick Scott152794b2010-03-30 13:57:29 -040068 private int mIconSize;
Nicolas Catania095292f2010-03-15 09:00:14 -070069
The Android Open Source Project0c908882009-03-03 19:32:16 -080070 private final static String LOGTAG = "browser";
Ben Murdoch328ea872009-09-16 13:33:29 +010071 private final static String PREF_BOOKMARK_VIEW_MODE = "pref_bookmark_view_mode";
72 private final static String PREF_MOST_VISITED_VIEW_MODE = "pref_most_visited_view_mode";
The Android Open Source Project0c908882009-03-03 19:32:16 -080073
74 @Override
75 public boolean onContextItemSelected(MenuItem item) {
76 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -070077 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -080078 if (mCanceled) {
79 return true;
80 }
Nicolas Catania095292f2010-03-15 09:00:14 -070081 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -080082 (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
83 // If we have no menu info, we can't tell which item was selected.
84 if (i == null) {
85 return true;
86 }
Nicolas Catania095292f2010-03-15 09:00:14 -070087
The Android Open Source Project0c908882009-03-03 19:32:16 -080088 switch (item.getItemId()) {
89 case R.id.new_context_menu_id:
90 saveCurrentPage();
91 break;
92 case R.id.open_context_menu_id:
93 loadUrl(i.position);
94 break;
95 case R.id.edit_context_menu_id:
96 editBookmark(i.position);
97 break;
98 case R.id.shortcut_context_menu_id:
Ben Murdoch90b40262010-06-30 13:33:28 +010099 sendBroadcast(createShortcutIntent(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800100 break;
101 case R.id.delete_context_menu_id:
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400102 if (mMostVisited) {
103 Browser.deleteFromHistory(getContentResolver(),
104 getUrl(i.position));
105 refreshList();
106 } else {
107 displayRemoveBookmarkDialog(i.position);
108 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800109 break;
110 case R.id.new_window_context_menu_id:
111 openInNewWindow(i.position);
112 break;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400113 case R.id.share_link_context_menu_id:
Leon Scroggins96afcb12009-12-10 12:35:56 -0500114 BrowserActivity.sharePage(BrowserBookmarksPage.this,
115 mBookmarksAdapter.getTitle(i.position), getUrl(i.position),
116 getFavicon(i.position),
117 mBookmarksAdapter.getScreenshot(i.position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800118 break;
119 case R.id.copy_url_context_menu_id:
120 copy(getUrl(i.position));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400121 break;
122 case R.id.homepage_context_menu_id:
123 BrowserSettings.getInstance().setHomePage(this,
124 getUrl(i.position));
125 Toast.makeText(this, R.string.homepage_set,
126 Toast.LENGTH_LONG).show();
127 break;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400128 // Only for the Most visited page
129 case R.id.save_to_bookmarks_menu_id:
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400130 boolean isBookmark;
131 String name;
132 String url;
Ben Murdoch328ea872009-09-16 13:33:29 +0100133 if (mViewMode == BookmarkViewMode.GRID) {
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400134 isBookmark = mBookmarksAdapter.getIsBookmark(i.position);
135 name = mBookmarksAdapter.getTitle(i.position);
136 url = mBookmarksAdapter.getUrl(i.position);
137 } else {
138 HistoryItem historyItem = ((HistoryItem) i.targetView);
139 isBookmark = historyItem.isBookmark();
140 name = historyItem.getName();
141 url = historyItem.getUrl();
142 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400143 // If the site is bookmarked, the item becomes remove from
144 // bookmarks.
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400145 if (isBookmark) {
Andrei Popescuc9526192009-09-23 15:52:16 +0100146 Bookmarks.removeFromBookmarks(this, getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400147 } else {
Leon Scrogginsc1f57592009-08-14 14:16:10 -0400148 Browser.saveBookmark(this, name, url);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400149 }
150 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800151 default:
152 return super.onContextItemSelected(item);
153 }
154 return true;
155 }
156
157 @Override
158 public void onCreateContextMenu(ContextMenu menu, View v,
159 ContextMenuInfo menuInfo) {
Nicolas Catania095292f2010-03-15 09:00:14 -0700160 AdapterView.AdapterContextMenuInfo i =
The Android Open Source Project0c908882009-03-03 19:32:16 -0800161 (AdapterView.AdapterContextMenuInfo) menuInfo;
162
163 MenuInflater inflater = getMenuInflater();
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400164 if (mMostVisited) {
165 inflater.inflate(R.menu.historycontext, menu);
166 } else {
167 inflater.inflate(R.menu.bookmarkscontext, menu);
168 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800169
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400170 if (0 == i.position && !mMostVisited) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800171 menu.setGroupVisible(R.id.CONTEXT_MENU, false);
172 if (mAddHeader == null) {
173 mAddHeader = new AddNewBookmark(BrowserBookmarksPage.this);
174 } else if (mAddHeader.getParent() != null) {
175 ((ViewGroup) mAddHeader.getParent()).
176 removeView(mAddHeader);
177 }
Leon Scroggins892df312009-07-14 14:48:02 -0400178 mAddHeader.setUrl(getIntent().getStringExtra("url"));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800179 menu.setHeaderView(mAddHeader);
180 return;
181 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400182 if (mMostVisited) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100183 if ((mViewMode == BookmarkViewMode.LIST
184 && ((HistoryItem) i.targetView).isBookmark())
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400185 || mBookmarksAdapter.getIsBookmark(i.position)) {
186 MenuItem item = menu.findItem(
187 R.id.save_to_bookmarks_menu_id);
188 item.setTitle(R.string.remove_from_bookmarks);
189 }
190 } else {
191 // The historycontext menu has no ADD_MENU group.
192 menu.setGroupVisible(R.id.ADD_MENU, false);
193 }
Leon Scroggins190095d2009-08-17 17:01:38 -0400194 if (mDisableNewWindow) {
Leon Scroggins892df312009-07-14 14:48:02 -0400195 menu.findItem(R.id.new_window_context_menu_id).setVisible(
196 false);
197 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800198 if (mContextHeader == null) {
199 mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
200 } else if (mContextHeader.getParent() != null) {
201 ((ViewGroup) mContextHeader.getParent()).
202 removeView(mContextHeader);
203 }
Ben Murdoch328ea872009-09-16 13:33:29 +0100204 if (mViewMode == BookmarkViewMode.GRID) {
Leon Scroggins892df312009-07-14 14:48:02 -0400205 mBookmarksAdapter.populateBookmarkItem(mContextHeader,
206 i.position);
207 } else {
208 BookmarkItem b = (BookmarkItem) i.targetView;
209 b.copyTo(mContextHeader);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800210 }
Leon Scroggins892df312009-07-14 14:48:02 -0400211 menu.setHeaderView(mContextHeader);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800212 }
213
214 /**
215 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700216 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800217 @Override
218 protected void onCreate(Bundle icicle) {
219 super.onCreate(icicle);
220
Patrick Scott152794b2010-03-30 13:57:29 -0400221 // Grab the app icon size as a resource.
222 mIconSize = getResources().getDimensionPixelSize(
223 android.R.dimen.app_icon_size);
224
Patrick Scottf49ecd62010-04-09 12:43:26 -0400225 Intent intent = getIntent();
226 if (Intent.ACTION_CREATE_SHORTCUT.equals(intent.getAction())) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800227 mCreateShortcut = true;
228 }
Patrick Scottf49ecd62010-04-09 12:43:26 -0400229 mDisableNewWindow = intent.getBooleanExtra("disable_new_window",
Leon Scroggins190095d2009-08-17 17:01:38 -0400230 false);
Patrick Scottf49ecd62010-04-09 12:43:26 -0400231 mMostVisited = intent.getBooleanExtra("mostVisited", false);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800232
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400233 if (mCreateShortcut) {
234 setTitle(R.string.browser_bookmarks_page_bookmarks_text);
235 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400236
237 setContentView(R.layout.empty_history);
238 mEmptyView = findViewById(R.id.empty_view);
239 mEmptyView.setVisibility(View.GONE);
240
Ben Murdoch328ea872009-09-16 13:33:29 +0100241 SharedPreferences p = getPreferences(MODE_PRIVATE);
242
243 // See if the user has set a preference for the view mode of their
244 // bookmarks. Otherwise default to grid mode.
245 BookmarkViewMode preference = BookmarkViewMode.NONE;
246 if (mMostVisited) {
Leon Scrogginsb3968bb2009-10-16 09:04:16 -0400247 // For the most visited page, only use list mode.
248 preference = BookmarkViewMode.LIST;
Ben Murdoch328ea872009-09-16 13:33:29 +0100249 } else {
250 preference = BookmarkViewMode.values()[p.getInt(
251 PREF_BOOKMARK_VIEW_MODE, BookmarkViewMode.GRID.ordinal())];
252 }
253 switchViewMode(preference);
Patrick Scottf49ecd62010-04-09 12:43:26 -0400254
255 final boolean createShortcut = mCreateShortcut;
256 final boolean mostVisited = mMostVisited;
257 final String url = intent.getStringExtra("url");
258 final String title = intent.getStringExtra("title");
259 final Bitmap thumbnail =
260 (Bitmap) intent.getParcelableExtra("thumbnail");
261 new AsyncTask<Void, Void, Void>() {
262 @Override
263 protected Void doInBackground(Void... unused) {
Michael Kolbfe251992010-07-08 15:41:55 -0700264 BrowserBookmarksAdapter adapter =
265 new BrowserBookmarksAdapter(
266 BrowserBookmarksPage.this,
267 url,
268 title,
269 thumbnail,
270 createShortcut,
271 mostVisited);
Patrick Scottf49ecd62010-04-09 12:43:26 -0400272 mHandler.obtainMessage(ADAPTER_CREATED, adapter).sendToTarget();
273 return null;
274 }
275 }.execute();
Leon Scroggins892df312009-07-14 14:48:02 -0400276 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800277
Nicolas Catania095292f2010-03-15 09:00:14 -0700278 @Override
279 protected void onDestroy() {
280 mHandler.removeCallbacksAndMessages(null);
281 super.onDestroy();
282 }
283
Leon Scroggins892df312009-07-14 14:48:02 -0400284 /**
285 * Set the ContentView to be either the grid of thumbnails or the vertical
Ben Murdoch328ea872009-09-16 13:33:29 +0100286 * list.
Leon Scroggins892df312009-07-14 14:48:02 -0400287 */
Leon Scrogginsea002572009-11-24 15:21:18 -0500288 private void switchViewMode(BookmarkViewMode viewMode) {
289 if (mViewMode == viewMode) {
Ben Murdoch328ea872009-09-16 13:33:29 +0100290 return;
291 }
292
Leon Scrogginsea002572009-11-24 15:21:18 -0500293 mViewMode = viewMode;
Ben Murdoch328ea872009-09-16 13:33:29 +0100294
295 // Update the preferences to make the new view mode sticky.
Ben Murdoch8262d8f2010-08-04 12:00:55 +0100296 SharedPreferences preferences = getPreferences(MODE_PRIVATE);
297 Editor ed = preferences.edit();
298 int pref = mViewMode.ordinal();
299 if (mMostVisited && preferences.getInt(PREF_MOST_VISITED_VIEW_MODE, -1) != pref) {
300 ed.putInt(PREF_MOST_VISITED_VIEW_MODE, pref);
301 } else if (!mMostVisited && preferences.getInt(PREF_BOOKMARK_VIEW_MODE, -1) != pref) {
302 ed.putInt(PREF_BOOKMARK_VIEW_MODE, pref);
Ben Murdoch328ea872009-09-16 13:33:29 +0100303 }
304 ed.commit();
305
Leon Scrogginsea002572009-11-24 15:21:18 -0500306 if (mBookmarksAdapter != null) {
307 mBookmarksAdapter.switchViewMode(viewMode);
308 }
Ben Murdoch328ea872009-09-16 13:33:29 +0100309 if (mViewMode == BookmarkViewMode.GRID) {
Leon Scroggins892df312009-07-14 14:48:02 -0400310 if (mGridPage == null) {
Leon Scroggins89c6d362009-07-15 16:54:37 -0400311 mGridPage = new GridView(this);
Leon Scrogginsea002572009-11-24 15:21:18 -0500312 if (mBookmarksAdapter != null) {
313 mGridPage.setAdapter(mBookmarksAdapter);
314 }
Leon Scroggins892df312009-07-14 14:48:02 -0400315 mGridPage.setOnItemClickListener(mListener);
Leon Scroggins89c6d362009-07-15 16:54:37 -0400316 mGridPage.setNumColumns(GridView.AUTO_FIT);
Leon Scrogginsf8551612009-09-24 16:06:02 -0400317 mGridPage.setColumnWidth(
318 BrowserActivity.getDesiredThumbnailWidth(this));
Leon Scroggins89c6d362009-07-15 16:54:37 -0400319 mGridPage.setFocusable(true);
320 mGridPage.setFocusableInTouchMode(true);
321 mGridPage.setSelector(android.R.drawable.gallery_thumb);
Leon Scrogginsf8551612009-09-24 16:06:02 -0400322 float density = getResources().getDisplayMetrics().density;
323 mGridPage.setVerticalSpacing((int) (14 * density));
324 mGridPage.setHorizontalSpacing((int) (8 * density));
325 mGridPage.setStretchMode(GridView.STRETCH_SPACING);
Leon Scrogginsbbe6d5b2009-09-28 12:01:00 -0400326 mGridPage.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
Leon Scrogginsf8551612009-09-24 16:06:02 -0400327 mGridPage.setDrawSelectorOnTop(true);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400328 if (mMostVisited) {
329 mGridPage.setEmptyView(mEmptyView);
330 }
Leon Scroggins892df312009-07-14 14:48:02 -0400331 if (!mCreateShortcut) {
332 mGridPage.setOnCreateContextMenuListener(this);
333 }
334 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400335 addContentView(mGridPage, FULL_SCREEN_PARAMS);
336 if (mVerticalList != null) {
337 ViewGroup parent = (ViewGroup) mVerticalList.getParent();
338 if (parent != null) {
339 parent.removeView(mVerticalList);
340 }
341 }
Leon Scroggins892df312009-07-14 14:48:02 -0400342 } else {
343 if (null == mVerticalList) {
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400344 ListView listView = new ListView(this);
Leon Scrogginsea002572009-11-24 15:21:18 -0500345 if (mBookmarksAdapter != null) {
346 listView.setAdapter(mBookmarksAdapter);
347 }
Leon Scroggins892df312009-07-14 14:48:02 -0400348 listView.setDrawSelectorOnTop(false);
349 listView.setVerticalScrollBarEnabled(true);
Michael Kolbfe251992010-07-08 15:41:55 -0700350 listView.setOnItemClickListener(mListListener);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400351 if (mMostVisited) {
352 listView.setEmptyView(mEmptyView);
353 }
Leon Scroggins892df312009-07-14 14:48:02 -0400354 if (!mCreateShortcut) {
355 listView.setOnCreateContextMenuListener(this);
356 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400357 mVerticalList = listView;
Leon Scroggins892df312009-07-14 14:48:02 -0400358 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400359 addContentView(mVerticalList, FULL_SCREEN_PARAMS);
360 if (mGridPage != null) {
361 ViewGroup parent = (ViewGroup) mGridPage.getParent();
362 if (parent != null) {
363 parent.removeView(mGridPage);
364 }
365 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400366 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800367 }
368
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400369 private static final ViewGroup.LayoutParams FULL_SCREEN_PARAMS
370 = new ViewGroup.LayoutParams(
Romain Guy15b8ec62010-01-08 15:06:43 -0800371 ViewGroup.LayoutParams.MATCH_PARENT,
372 ViewGroup.LayoutParams.MATCH_PARENT);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400373
The Android Open Source Project0c908882009-03-03 19:32:16 -0800374 private static final int SAVE_CURRENT_PAGE = 1000;
Patrick Scottf49ecd62010-04-09 12:43:26 -0400375 private static final int ADAPTER_CREATED = 1001;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800376 private final Handler mHandler = new Handler() {
377 @Override
378 public void handleMessage(Message msg) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500379 switch (msg.what) {
380 case SAVE_CURRENT_PAGE:
381 saveCurrentPage();
382 break;
Patrick Scottf49ecd62010-04-09 12:43:26 -0400383 case ADAPTER_CREATED:
384 mBookmarksAdapter = (BrowserBookmarksAdapter) msg.obj;
Leon Scrogginsea002572009-11-24 15:21:18 -0500385 mBookmarksAdapter.switchViewMode(mViewMode);
386 if (mGridPage != null) {
387 mGridPage.setAdapter(mBookmarksAdapter);
388 }
389 if (mVerticalList != null) {
390 mVerticalList.setAdapter(mBookmarksAdapter);
391 }
Patrick Scottc1cf63a2010-03-09 16:02:08 -0500392 // Add our own listener in case there are favicons that
393 // have yet to be loaded.
394 if (mMostVisited) {
395 IconListener listener = new IconListener() {
396 public void onReceivedIcon(String url,
397 Bitmap icon) {
398 if (mGridPage != null) {
399 mGridPage.setAdapter(mBookmarksAdapter);
400 }
401 if (mVerticalList != null) {
402 mVerticalList.setAdapter(mBookmarksAdapter);
403 }
404 }
405 };
406 CombinedBookmarkHistoryActivity.getIconListenerSet()
407 .addListener(listener);
408 }
Leon Scrogginsea002572009-11-24 15:21:18 -0500409 break;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800410 }
411 }
412 };
413
Michael Kolbfe251992010-07-08 15:41:55 -0700414 private OnItemClickListener mListener = new OnItemClickListener() {
415 public void onItemClick(AdapterView parent, View v, int position, long id) {
416 // It is possible that the view has been canceled when we get to
417 // this point as back has a higher priority
418 if (mCanceled) {
419 android.util.Log.e(LOGTAG, "item clicked when dismissing");
420 return;
421 }
422 if (!mCreateShortcut) {
423 if (0 == position && !mMostVisited) {
424 // XXX: Work-around for a framework issue.
425 mHandler.sendEmptyMessage(SAVE_CURRENT_PAGE);
426 } else {
427 loadUrl(position);
428 }
429 } else {
430 setResultToParent(RESULT_OK, createShortcutIntent(position));
431 finish();
432 }
433 }
434 };
435
436 private OnItemClickListener mListListener = new OnItemClickListener() {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800437 public void onItemClick(AdapterView parent, View v, int position, long id) {
438 // It is possible that the view has been canceled when we get to
Nicolas Catania095292f2010-03-15 09:00:14 -0700439 // this point as back has a higher priority
The Android Open Source Project0c908882009-03-03 19:32:16 -0800440 if (mCanceled) {
Leon Scroggins892df312009-07-14 14:48:02 -0400441 android.util.Log.e(LOGTAG, "item clicked when dismissing");
The Android Open Source Project0c908882009-03-03 19:32:16 -0800442 return;
443 }
444 if (!mCreateShortcut) {
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400445 if (0 == position && !mMostVisited) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800446 // XXX: Work-around for a framework issue.
447 mHandler.sendEmptyMessage(SAVE_CURRENT_PAGE);
448 } else {
449 loadUrl(position);
450 }
451 } else {
Ben Murdoch90b40262010-06-30 13:33:28 +0100452 setResultToParent(RESULT_OK, createShortcutIntent(position));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800453 finish();
454 }
455 }
456 };
457
Patrick Scott3918d442009-08-04 13:22:29 -0400458 private Intent createShortcutIntent(int position) {
459 String url = getUrl(position);
460 String title = getBookmarkTitle(position);
461 Bitmap touchIcon = getTouchIcon(position);
Ben Murdoch90b40262010-06-30 13:33:28 +0100462 Bitmap favicon = getFavicon(position);
463 return BookmarkUtils.createAddToHomeIntent(this, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800464 }
465
466 private void saveCurrentPage() {
467 Intent i = new Intent(BrowserBookmarksPage.this,
468 AddBookmarkPage.class);
469 i.putExtras(getIntent());
470 startActivityForResult(i, BOOKMARKS_SAVE);
471 }
472
473 private void loadUrl(int position) {
474 Intent intent = (new Intent()).setAction(getUrl(position));
475 setResultToParent(RESULT_OK, intent);
476 finish();
477 }
478
479 @Override
480 public boolean onCreateOptionsMenu(Menu menu) {
481 boolean result = super.onCreateOptionsMenu(menu);
Leon Scrogginsb3968bb2009-10-16 09:04:16 -0400482 if (!mCreateShortcut && !mMostVisited) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800483 MenuInflater inflater = getMenuInflater();
484 inflater.inflate(R.menu.bookmarks, menu);
485 return true;
486 }
487 return result;
488 }
489
490 @Override
Leon Scroggins0c786502009-08-04 16:04:55 -0400491 public boolean onPrepareOptionsMenu(Menu menu) {
Leon Scroggins8382d992009-08-19 11:25:14 -0400492 boolean result = super.onPrepareOptionsMenu(menu);
Leon Scrogginsea002572009-11-24 15:21:18 -0500493 if (mCreateShortcut || mMostVisited || mBookmarksAdapter == null
Leon Scrogginsb3968bb2009-10-16 09:04:16 -0400494 || mBookmarksAdapter.getCount() == 0) {
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400495 // No need to show the menu if there are no items.
Leon Scroggins8382d992009-08-19 11:25:14 -0400496 return result;
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400497 }
Leon Scrogginsfdd10d72009-09-25 13:01:45 -0400498 MenuItem switchItem = menu.findItem(R.id.switch_mode_menu_id);
499 int titleResId;
500 int iconResId;
501 if (mViewMode == BookmarkViewMode.GRID) {
502 titleResId = R.string.switch_to_list;
503 iconResId = R.drawable.ic_menu_list;
504 } else {
505 titleResId = R.string.switch_to_thumbnails;
506 iconResId = R.drawable.ic_menu_thumbnail;
507 }
508 switchItem.setTitle(titleResId);
509 switchItem.setIcon(iconResId);
Leon Scroggins0c786502009-08-04 16:04:55 -0400510 return true;
511 }
512
513 @Override
The Android Open Source Project0c908882009-03-03 19:32:16 -0800514 public boolean onOptionsItemSelected(MenuItem item) {
515 switch (item.getItemId()) {
Leon Scroggins892df312009-07-14 14:48:02 -0400516 case R.id.new_context_menu_id:
517 saveCurrentPage();
518 break;
519
520 case R.id.switch_mode_menu_id:
Ben Murdoch328ea872009-09-16 13:33:29 +0100521 if (mViewMode == BookmarkViewMode.GRID) {
522 switchViewMode(BookmarkViewMode.LIST);
523 } else {
524 switchViewMode(BookmarkViewMode.GRID);
525 }
Leon Scroggins892df312009-07-14 14:48:02 -0400526 break;
527
528 default:
529 return super.onOptionsItemSelected(item);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800530 }
531 return true;
532 }
533
534 private void openInNewWindow(int position) {
535 Bundle b = new Bundle();
536 b.putBoolean("new_window", true);
537 setResultToParent(RESULT_OK,
538 (new Intent()).setAction(getUrl(position)).putExtras(b));
539
540 finish();
541 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700542
The Android Open Source Project0c908882009-03-03 19:32:16 -0800543
544 private void editBookmark(int position) {
Nicolas Catania095292f2010-03-15 09:00:14 -0700545 Intent intent = new Intent(BrowserBookmarksPage.this,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800546 AddBookmarkPage.class);
547 intent.putExtra("bookmark", getRow(position));
548 startActivityForResult(intent, BOOKMARKS_SAVE);
549 }
550
551 @Override
552 protected void onActivityResult(int requestCode, int resultCode,
553 Intent data) {
554 switch(requestCode) {
555 case BOOKMARKS_SAVE:
556 if (resultCode == RESULT_OK) {
557 Bundle extras;
558 if (data != null && (extras = data.getExtras()) != null) {
559 // If there are extras, then we need to save
560 // the edited bookmark. This is done in updateRow()
561 String title = extras.getString("title");
562 String url = extras.getString("url");
563 if (title != null && url != null) {
564 mBookmarksAdapter.updateRow(extras);
565 }
566 } else {
567 // extras == null then a new bookmark was added to
568 // the database.
569 refreshList();
570 }
571 }
572 break;
573 default:
574 break;
575 }
576 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700577
The Android Open Source Project0c908882009-03-03 19:32:16 -0800578 private void displayRemoveBookmarkDialog(int position) {
579 // Put up a dialog asking if the user really wants to
580 // delete the bookmark
581 final int deletePos = position;
582 new AlertDialog.Builder(this)
583 .setTitle(R.string.delete_bookmark)
584 .setIcon(android.R.drawable.ic_dialog_alert)
585 .setMessage(getText(R.string.delete_bookmark_warning).toString().replace(
586 "%s", getBookmarkTitle(deletePos)))
Nicolas Catania095292f2010-03-15 09:00:14 -0700587 .setPositiveButton(R.string.ok,
The Android Open Source Project0c908882009-03-03 19:32:16 -0800588 new DialogInterface.OnClickListener() {
589 public void onClick(DialogInterface dialog, int whichButton) {
590 deleteBookmark(deletePos);
591 }
592 })
593 .setNegativeButton(R.string.cancel, null)
594 .show();
595 }
596
597 /**
598 * Refresh the shown list after the database has changed.
599 */
Leon Scroggins892df312009-07-14 14:48:02 -0400600 private void refreshList() {
Grace Kloba0b82a6f2010-04-20 13:46:42 -0700601 if (mBookmarksAdapter == null) return;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800602 mBookmarksAdapter.refreshList();
603 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700604
The Android Open Source Project0c908882009-03-03 19:32:16 -0800605 /**
606 * Return a hashmap representing the currently highlighted row.
607 */
608 public Bundle getRow(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500609 return mBookmarksAdapter == null ? null
610 : mBookmarksAdapter.getRow(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800611 }
612
613 /**
614 * Return the url of the currently highlighted row.
615 */
616 public String getUrl(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500617 return mBookmarksAdapter == null ? null
618 : mBookmarksAdapter.getUrl(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800619 }
620
Patrick Scotte09761e2009-03-24 20:43:37 -0700621 /**
622 * Return the favicon of the currently highlighted row.
623 */
624 public Bitmap getFavicon(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500625 return mBookmarksAdapter == null ? null
626 : mBookmarksAdapter.getFavicon(position);
Patrick Scotte09761e2009-03-24 20:43:37 -0700627 }
628
Patrick Scott3918d442009-08-04 13:22:29 -0400629 private Bitmap getTouchIcon(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500630 return mBookmarksAdapter == null ? null
631 : mBookmarksAdapter.getTouchIcon(position);
Patrick Scott3918d442009-08-04 13:22:29 -0400632 }
633
The Android Open Source Project0c908882009-03-03 19:32:16 -0800634 private void copy(CharSequence text) {
Dianne Hackborn80f32622010-08-05 14:17:53 -0700635 ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
636 cm.setText(text);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800637 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700638
The Android Open Source Project0c908882009-03-03 19:32:16 -0800639 public String getBookmarkTitle(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500640 return mBookmarksAdapter == null ? null
641 : mBookmarksAdapter.getTitle(position);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800642 }
643
644 /**
645 * Delete the currently highlighted row.
646 */
647 public void deleteBookmark(int position) {
Leon Scrogginsea002572009-11-24 15:21:18 -0500648 if (mBookmarksAdapter == null) return;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800649 mBookmarksAdapter.deleteRow(position);
650 }
Grace Kloba5942df02009-09-18 11:48:29 -0700651
652 @Override
653 public void onBackPressed() {
654 setResultToParent(RESULT_CANCELED, null);
655 mCanceled = true;
656 super.onBackPressed();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800657 }
658
Leon Scrogginsfde97462010-01-11 13:06:21 -0500659 // This Activity is generally a sub-Activity of
660 // CombinedBookmarkHistoryActivity. In that situation, we need to pass our
661 // result code up to our parent. However, if someone calls this Activity
662 // directly, then this has no parent, and it needs to set it on itself.
The Android Open Source Project0c908882009-03-03 19:32:16 -0800663 private void setResultToParent(int resultCode, Intent data) {
Leon Scrogginsfde97462010-01-11 13:06:21 -0500664 Activity parent = getParent();
665 if (parent == null) {
666 setResult(resultCode, data);
667 } else {
668 ((CombinedBookmarkHistoryActivity) parent).setResultFromChild(
669 resultCode, data);
670 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800671 }
Michael Kolbfe251992010-07-08 15:41:55 -0700672
The Android Open Source Project0c908882009-03-03 19:32:16 -0800673}